微信支付获取prepay_id返回签名错误,官方demo中的签名方法MD5验证有问题


引用官方V3微信支付PHP版的demo做的改动,在获取prepay_id发现总是返回签名错误,经与腾讯官方的“微信公众平台支付接口调试工具”对比发现MD5不一样,找到demo中代码有问题部分:


 function formatBizQueryParaMap($paraMap, $urlencode)
{
    $buff = "";
    ksort($paraMap);

    foreach ($paraMap as $k => $v)
    {
        if($urlencode)
        {
           $v = urlencode($v);
        }
        //$buff .= strtolower($k) . "=" . $v . "&";
        $buff .= $k . "=" . $v . "&";
    }

    $reqPar;
    if (strlen($buff) > 0) 
    {
        $reqPar = substr($buff, 0, strlen($buff)-1);
    }


    return $reqPar;
}

$buff .= $k . "=" . $v . "&";在用&进行参数的字符串拼接的时候 &notify_url变成了-ify_url,网上查找是&not的编码问题,在传递的时候不影响,只是输出会有问题,请问这里到底会不会影响MD5的生成?如果影响要怎么改呢?

微信支付 php

wsxnd 10 years, 5 months ago

$buff .= strtolower($k) . "=" . $v . "&";
这里没有问题 检测下你输出的代码

爱loli傲娇 answered 10 years, 5 months ago

楼主有解决办法么? qq:315747294
那个问题不用管,是正常的前台显示 后台php会把&not 转成¬ 关于调用jsapi时可以在state后带入你想要传入的参数

22336 answered 10 years, 5 months ago

我也遇到了同样的问题, 求解答啊

和道一文字 answered 10 years, 5 months ago

问题已解决,我说一下主要遇到的情况吧:
1.获取prepay_id返回签名错误是因为我用的商户密匙不对,开始以为是腾讯返回的邮件中那个6位数的,正确的应该是要自己设置一个32位的支付密匙。这里的说的问题在页面上调试的时候显示&not确实会出问题,但是在后台里面没有影响,不用管它。
2.获取prepay_id后,发起支付一度出现system:access_denied,检查各项配置都没错,按照开发文档说的公众号配置的支付目录也没错,后来没辙了,就把所有目录都配到了支付目录中,一下子成功了!腾讯巨坑,文档上说只要配“发起支付请求的目录”,我是把相关支付代码用到的目录都配了才可以。
3.PHP版的DEMO中有几个小BUG,一个是有一处不要转换大小写,还有几个忘记在哪了,大家仔细看下代码吧。
再次表示,腾讯大坑,给的DMEO有BUG不说,文档写的又简略,很多要注意的问题都没写,也没说清楚,还望各路高手慎行,莫掉坑中!

遗忘的雷扎德 answered 10 years, 5 months ago

Your Answer