微信公账号支付:签名验证失败的解决办法

来源:互联网 发布:邓肯季后赛数据 编辑:程序博客网 时间:2024/05/16 04:44

微信公众号支付总结:做完了微信支付想趁着这把火没灭继续把公众号支付也做完,但是没想到中途出了呢么多意外,每次都是感觉解决了这个问题就可以支付了,但每次都是一个问题接另一个问题的出现,特此总结一下出现的问题及原因。

1.没仔细看文档(有人会一个字一个字的全看完么。。。还是只有我一目十行。。)。如果你仔细把官方文档看完,那你必定能减少至少一半的出错。

①但是我感觉有个参数说明挺坑的,就是那个openid!!!



变量名 

openid     

   

必填 

 否 


描述

 trade_type=JSAPI时(即公众号支付),此参数必传,此参数为微信用户在商户对应appid下的唯一标识。openid如何获取,可参考【获取openid】。企业号请使用【企业号OAuth2.0接口】获取企业号内成员userid,再调用【企业号userid转openid接口】进行转换


一堆参数,这个用户标志是在最后一个,看到这里的时候早就没耐心了,一开始做想只用必须参数,然后再扩展,看到是否必填的选项为 否之后,我就连看没看,在网上看 demo的时候 大家都说openid必填,我还以为官方文档又更新了,openid都省了,后来每次做好像是提示签名错误还是没有权限啥的,记不清了,我又上网查,仔细对着文档一个个的找才发现了后面这个描述:trade_type=JSAPI时(即公众号支付),此参数必传。感觉很无语,那你写个不是必传干嘛,好歹这个也是公众号支付里的页面,你能在后面加个备注就不能顺手把前面也改掉。


②其实那个trade_type我也没注意,因为刚做完APP支付,所以这个字段我就直接写上了APP,其实他也是有具体的取值的,如:JSAPI,NATIVE,APP等,说明详见参数规定。一开始值为APP时,预支付标志直接生成成功,后来我拿这个预支付标识去支付的时候 总是提示我没权限。。尴尬,希望大家不要和我这么粗心。


2.参数配置有问题

微信公众号支付需要的配置有 :

微信支付目录:app_id (和微信app支付不是一个id)

商户key(key设置路径:微信商户平台(pay.weixin.qq.com)-->账户设置-->API安全-->密钥设置),加签的时候是用这个加签,不要和我似得傻乎乎的用 app_secret去加签。。为了获得这个secret还去重置了,中间又因为忘了公众号密码耽误了好久,,最后好像还没用到这个,无语问苍天。。

微信支付目录:支付授权目录

接口列表:网页授权获得用户资料,点修改,里面有域名相关的配置,我因为写乱七八糟的报错,所以把里面的一个js安全域名和回调域名都填写了,也不清楚到底起作用了没。


3.加签出错

如果提示验签失败那么别怀疑,就是你加签有问题,微信支付已经用了这么久,他的服务端代码有问题那几乎是不可能的,你愿意听我一言那么就立马进入这里:https://pay.weixin.qq.com/wiki/doc/api/jsapi.PHP?chapter=20_1  用官方提供的验签工具去检查你的签名是否和他的一样,如果不一样你就一步步照着他的步骤检查,看看是加签过程出了问题还是你的XML有问题,我曾遇见的问题有:中文乱码,排序,大小写。(是不是加签上文档说明的雷全被我踩了。。)

如果你的加签结果和他的一样,那就说明是你的参数有问题了。再次确认一下配置的参数,我在网上看到一个说一直提示验签失败,然后对比的结果也没问题,最后重置了一下key就好了,我没遇到过,但是如果你真走投无路那你可以尝试一下,不尝试怎么知道 真的是不行呢哈哈哈哈。


4.支付授权目录

(这也是一个坑啊,一开始他还有个 测试授权目录的配置,然后我添加了一个公司ip的映射地址测试,结果第二天这个测试目录取消了,就是这么的快,然后我就添加不上公司ip了,我编辑正式的支付授权目录时候,我昨天添加的那个还在,我啥都没动保存的时候提示我昨天添加的呢个未认证,又让我删掉。。感觉好无语,怎么就偏偏被我碰上了,这里倒也不是说微信不好,就是吐槽下。。)

如果支付授权目录没有设置正确,在请求JSAPI时,会提示“当前页面的url未注册”的错误。具体配置的话,我总结一下就是你调起支付的那个html,jsp,php页面的上一级目录 ,例如 http://www.baidu.com/a/a.html的授权目录就是http://www.baidu.com/a/ 。

5.最坑地方是这里

sdk里面这个方法

   public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
        this.config = config;
        this.notifyUrl = notifyUrl;
        this.autoReport = autoReport;
        this.useSandbox = useSandbox;
        if (useSandbox) {
            this.signType = SignType.MD5; // 沙箱环境
        }
        else {
            this.signType = SignType.MD5;
           // 微信源码是这个主意 this.signType = SignType.HMACSHA256,主意要改成SignType.MD5;


        }
        this.wxPayRequest = new WXPayRequest(config);
    }



原创粉丝点击