微信支付整理 (微信公众号支付)

由于本人愚钝,在最初接触微信支付时遇到很多坑。在第一次将微信支付调试成功之后在网上炫耀般的留了一个qq(24xxxx)号,以便帮助到更多的人。由此便接触到了大概100多号人的qq询问,期间也拒绝了很多人的好友请求。

届时不入把微信支付仔细整理下(本人的第一篇博文):

要了解微信得要有一个大概的脉络。你得知道微信公众号支付涉及2个东西  微信公众平台 和 微信商户平台(微信支付的账号)。

当时在开发微信支付时在网上有看到过很好的解释。这就有点像一个餐厅里面有收银台(微信支付)以及不同的餐桌(公众平台)。当我们需要涉及金钱交易时才和微信支付打交道。其余的操作都是和微信公众平台打交道(如:唤起微信的语音、卡券功能等)。

在理解了上述概念后,就得详细查阅微信支付文档里,我就不按照官方文档的步骤进行了。

第一步:要搞定就是【统一下单】在调用接口时我们内部系统已经生成了对应客户的订单号 以及内部财务系统的流水号以便对账。一般很多网友咨询都是调用这个微信返回 ”签名错误“,而且很多网友是和官方签名调试工具返回的结果是一样的也返回 签名错误。所以这里就很纳闷了一度陷入苦苦挣扎。

第一步需要注意的地方有以下几点:

1.发起请求的参数名要和文档一致,包括字母大小写

2.规定必须要传的参数一定要传,特别注意参数的定义与规则。例如:通知地址【notify_url】,官方规定:通知url必须为外网可访问的url,不能携带参数。有很多网友是直接拷贝的示例值或者localhost的url地址发起请求。由此一定要看清文档的规定

3.生成签名sign。

官方举例:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=4_3

有好几个网友在进行到这一步时由于比较暴力,在看到官方示例中只有【appid  mch_id  device_info  body  nonce_str 】这几个参数后就强行忽视文档中规定的必须传递的参数只保留这几个参数进行接口访问 这也是比较粗心的问题造成;

当然还有需要注意的是在参与签名时需要附加一个key(支付密钥:是在微信支付平台里面进行设置的)进行md5加密以保证数据是安全,因为我当初开发的时候也在这里迷惑了很久。在开发微信商城时一开始记得的密钥是appsecret(这个紧跟的一般是appid),所以很多网友一直将这个appsecret作为key进行签名;

如若以上问题你都确定无误恭喜你,你还是有可能得到”签名错误“,一般这种时候整个人都不好了。没事我来给你举例子,到这个地步了朋友再坚持坚持 你就胜利。往往这个时候我们不能总是怪文档写的不过清晰明白,我们得体会了。你懂了吧。因为我们已经严格按照文档进行的每一步操作,所以我们有必要在进行一次上述问题的查漏。看是否有粗心造成的或者是复制粘贴的是在字符串中多留了一个空字符。如果你能1000%的确定上述提到过的地方我都检查过了。那么你只剩下最后一步了,检查你的MD5加密方法,在与网友交流的过程中他们最后发现 由内部同时提供的工具类Md5加密中居然悄悄的将utf-8格式给换了。修复这个bug你就成功了。

说道这里可算是解决了关键的一步:向微信下单【统一下单】

接下来就到了第二步:前台js唤起微信支付

官方文档地址为:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115

模块为:微信网页开发->微信JS-SDK说明文档->发起一个微信支付请求

wx.chooseWXPay({
timestamp: 0, // 支付签名时间戳,注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
nonceStr: '', // 支付签名随机串,不长于 32 位
package: '', // 统一支付接口返回的prepay_id参数值,提交格式如:prepay_id=\*\*\*)
signType: '', // 签名方式,默认为'SHA1',使用新版支付需传入'MD5'
paySign: '', // 支付签名
success: function (res) {
// 支付成功后的回调函数
}
});

备注:prepay_id 通过微信支付统一下单接口拿到,paySign 采用统一的微信支付 Sign 签名生成方法,注意这里 appId 也要参与签名,appId 与 config 中传入的 appId 一致,即最后参与签名的参数有appId, timeStamp, nonceStr, package, signType。

但是在微信支付平台的文档中也有一个示例:

模块为:公众号支付->微信内H5调起支付

示例代码如下:

function onBridgeReady(){
   WeixinJSBridge.invoke(
       'getBrandWCPayRequest', {
           "appId":"wx2421b1c4370ec43b",     //公众号名称,由商户传入     
           "timeStamp":"1395712654",         //时间戳,自1970年以来的秒数     
           "nonceStr":"e61463f8efa94090b1f366cccfbbb444", //随机串     
           "package":"prepay_id=u802345jgfjsdfgsdg888",     
           "signType":"MD5",         //微信签名方式:     
           "paySign":"70EA570631E4BB79628FBCA90534C63FF7FADD89" //微信签名 
       },
       function(res){     
           if(res.err_msg == "get_brand_wcpay_request:ok" ) {}     // 使用以上方式判断前端返回,微信团队郑重提示:res.err_msg将在用户支付成功后返回    ok,但并不保证它绝对可靠。 
       }
   ); 
}


这里很多人就有点懵了,我们先不管。分析其中的共同点,在js调起中涉及的appId, timeStamp, nonceStr, package, signType生成

在文档中没有明确的说明生成这个js调起支付的sign 是和 发起【统一下单】的生成规则是一样的。因为在开发微信时很多时候要使用到像获取用户相机、录音等功能。里面也涉及到sign。

我这里就不ao述这其中的曲折故事。只是要明白的就是这个sign 生成方法和【统一下单】生成规则一样。具体请看第一步中的注意事项

顺利到达这里,我相信你已经不会再犯参数字母错别字等等错误了

第二步需要注意的有以下几点:

1.其中"package":"prepay_id=u802345jgfjsdfgsdg888",     在这个字段的值要按照这种格式组装

2.生成签名时也是需要【支付密钥】进行信息加密处理的

接下来就到了html页面了。将刚刚生成的 appId, timeStamp, nonceStr, package, signType 以及 sign 通过接口的方式返回给前端进行script 组装

这里 一般会报调起支付失败,一般原因有以下几种可能(wx.chooseWXPay({})的调起方式):

a.js接口没有验证通过(这个就自己参考文档了https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115        按照文档一步一步就可以了)

b.js权限没有注册,将接口添加到权限列表中即可

c.支付目录没有设置正确 ,支付目录的设置目前已经搬迁到 微信商户平台进行设置了(最开始的时候是在公众平台进行设置)。设置支付目录需要注意设置的url必须要和你发起请求的url完全一致,例如:发起请求的url为:http://a.xxx.com/abc/def;但是设置的支付目录url为:http://a.xxx.com/Abc/Def;这其实是错误的设置方式。在设置支付目录时官方的提示是最好是能到具体的action(http://xxxx/controller/action)称为三级支付目录,在我开发中 只设置了 二级支付目录(http://xxxx/controller/),这样设置有一个好处就是,当你需要在这个controller下面涉及多个支付页面时不需要再新增支付目录了。当然我没有试过最暴力的设置只填写域名(http://xxx/),(在官网介绍中提及测试支付目录,我没有使用过也就不说了)。

到这里 基本就能调起微信支付了

其实这个过程忽略了很多其他例如:获取用户openid,以及微信的access_token的获取等,这些信息的获取的话严格按照文档进行是ok的。

微信公众号支付  总结:

其实遇到这么多错误,很多时候我们就是一味的吐槽和抱怨 官方文档的 不清晰明了。转而让自身陷入一个负面情绪中去,其实程序员也是需要 匠心独运 的一个艺术活。不过微信支付涉及的东西比较杂但是官方文档却没有一个比较清晰的说明。只是纯粹的说明api接口以及js调用的规则,而并没有一个比较概括性的东西 着眼于全局的思想进行考虑这个文档该如何布局和呈现。

















  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值