小游戏虚拟支付报签名错误
发布于 5 年前 作者 gxiao 6834 次浏览 来自 问答

/**

* 生成mp_sig签名
* [@param](/user/param) $url_path
* [@param](/user/param) $params
* [@param](/user/param) $session_key
* [@return](/user/return) string
*/
public function makeMpSig($url_path, $params, $session_key)
{
   ksort($params);
   $query_string = array();
   foreach ($params as $key => $val )
   {
       array_push($query_string, $key . '=' . $val);
   }
   $query_string = join('&', $query_string);
   $query_string .= "&org_loc=" . $url_path . "&method=POST&session_key=" . $session_key;
   $my_sign = hash_hmac("sha256", $query_string, $session_key);
   return $my_sign;
}

php写的签名方法,返回Array ( [errcode] => 90009 [errmsg] => mp_sig error hint: [aT13rA02423672] )

实际上用这个方法把官方文档上的参数放入去生成出来的结果跟官方上给出的结果是一样的,为什么真正去调用接口时会报错?难道文档说的方法也不对?

3 回复

刚才有个同学给我参考了他的代码,问题找到了,原来参数access_token在签完名之后要清掉(

unset($data['access_token']);

),不要存在Post的内容里,而是只放在url上?access_token=xxx这样

你好, 请问楼主解决了吗? 我们现在项目遇到类似的问题, 支付功能测试中, 沙盒测试是成功(调起米大师支付页且成功支付到账)的;  然后后台切换到 现网 测试就处问题了, 返回结果 (这里是部分返回参数: 其中 Env 代表环境: 0-现网/ 1-沙盒), 看到是 sig 签名错误. 但是计算签名的方法同时也用在了其它项目, 证实是可行的, 请问是什么问题啊? 手动@官方人员

相关参数取值也要正确才对得上, 和文档上的对得上说明算法没问题,那就看相关参数的取值了,比如:$session_key,要求是当前用户最新的。 比如 $url_path 也要和请求的接口对得上,不能一个是sandbox一个是正式环境的url

你可以给一个实例看看?

回到顶部