最近在处理民生制药的项目时,涉及到了微信支付的模块,本猿不负重托承担起了微信支付接口开发的工作。虽说不是什么很高含金量的业务,但毕竟是属于以前没处理过的支付领域,所以保持着足够的好奇心和耐心。每次遇到这种情况,都是快速积累开发经验的过程。但是在开发流程中,真是坑雷满天炸啊,有一种被虐的感觉。不过最后还是完成了支付业务,回头一看,确实有一种拨开云雾见青天的感觉。可能这就是所谓:领悟。
至于微信支付官方的 API 文档在此我就不费口舌了,真是太混乱了。我只能简要的告诉那些后继的微信支付开发猿:API 文档有两种(本猿项目使用的是公众号支付模式,通过网页授权的方式进行处理),一种是支付接口文档,这是都要调用处理的,是统一的;还有一种是JS SDK 文档,用于处理微信浏览器的内置支付模块,这个文档有 V2 版和 V3 版,一不留神就搞杂了,望留心。
微信支付V2版
1 2 3 4 5 6 7 8 9 |
WeixinJSBridge.invoke( 'getBrandWCPayRequest', { "appId" : "wx2421b1c4370ec43b", //公众号名称,由商户传入 "timeStamp":" 1395712654", //时间戳,自1970年以来的秒数 "nonceStr" : "e61463f8efa94090b1f366cccfbbb444", //随机串 "package" : "prepay_id=u802345jgfjsdfgsdg888", "signType" : "MD5", //微信签名方式: "paySign" : "70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 } |
微信支付V3版
1 2 3 4 5 6 7 8 9 10 |
wx.chooseWXPay({ timestamp: 0, // 支付签名时间戳 nonceStr: '', // 支付签名随机串,不长于 32 位 package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=*** signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5' paySign: '', // 支付签名 success: function (res) { // 支付成功后的回调函数 } }); |
有网友查看了微信的封装代码,发现 V3 版是基于 V2 版改版过来的,也就是说 V3 版的实现方法中也使用了 V2 版的原支付方法。至于说为什么这么处理,本猿就不得而知了,可能是有支付漏洞,可能曝光度太高,可能微信支付部门领导换届了……既然是新版本,微信官方还是建议和推荐的。V2 版本有些网友测试说是有功能故障,本猿没有测试过,有兴趣的网友可以测试测试。
微信支付闪现问题
在调用微信预支付接口,得到预支付编号之后,开始发起支付。这时发生了一种无比诡异的问题,微信支付加载进度条闪现了一次,就消失没影了。控制台没有报错,没有JS报错,没有页面报错!消失后,页面静止。由于这里边的配置项不少,所以开发时并不清楚是什么地方没配好,最终我们用了两三天的时间才明确了所有配置的生效范围。
1.APPID和密钥
APPID是公众号 id ,但密钥不是公众号密钥,而是申请支付的商户号密钥(在商户后台中,只有设置,不能修改)。
2.微信支付授权和测试授权目录
授权目录取决于你的请求 URL ,与项目物理目录、绝对路径没有任何关系。
3.接口权限
在接口权限中,修改“网页帐号”-“网页授权获取基本信息”的域名,否则微信项目拿不到用户的 openid ,无法识别是哪个用户。
4.签名算法
这里面至关重要的就是签名算法,因为只有公司和微信知道本次支付请示的 key 值,通过 md5 对所有传输参数进行加密。一旦有人拦截程序、恶意篡改数据,都会导致加密后的签名不一致。对于这种非法签名,程序控制时一律不要应答。而我也是被签名坑了,签名有误,也会导致微信支付的闪现状态。
上图是微信JS SDK 支付的文档说明,我也是被这一段话误解了,导致了最终支付时传参签名错误。因为这个函数标明了“最后参与签名的参数有appID,timeStamp,nonceStr,package,signType。”所以,我在加密签名的时候并没有把 key 当参数传进去一块加密,结果签名错误。其实微信也说明了要把 key 值加上,但是这个地方说的有点含蓄,就是“pagSign采用统一的微信支付Sign签名生成方法”,这个“统一的”意思就是每次加密参数都要封装 key 值,这是微信加密签名的潜规则。详情可以查看签名生成算法。能够把文档含蓄到这份上,我也是醉了……
转载请注明:似水流年 » 微信支付V3.0开发 支付进度闪现一两秒后消失