python后端对接微信支付
注意:原创文章,转载请注明出处。
引言
我从未想到就调两个接口那么难!
前段时间由于项目需要,开发的应用对接了微信公众号、微信支付。对接微信公众号比较简单,官网有详细的操作指南,但是微信支付却遇到了较大的困难,主要是因为官方的文档较为简陋,且代码演示是JAVA语言,在查阅了大量网上教程并摸索实践后,终于成功对接了微信支付,这篇文章在分享技术的同时,也算是回炉温习。
一、流程简述&难点简析
发起微信支付的后端流程:前期准备 => 调用微信支付“统一下单”接口生成订单 => 生成参数提供前端生成支付窗口。
整个流程并不复杂,难点在于捋清整个流程以及各个参数的收集或生成,既然流程已经清楚了,那么就按照流程一步步走。
二、前期准备
前期准备是收集后续使用到的参数,这里默认已经开通了公众平台服务号、微信商户平台账号(微信支付),并将公众号和商户平台账号绑定,同时公众号和微信支付都授权了后端服务器,那么你将会获得下面参数信息:
①公众号APPID
②公众号APPSECRET
③商户ID
④商户API**
三、统一下单
准备工作做好后,接下来是最大的挑战——调用微信支付“统一下单”接口生成订单,我们来看看接口需要提供哪些参数:
那么多参数,有些不是必要的,那么必填的参数有:
- appid: 公众账号ID (已有)
- mch_id: 商户号 (已有)
- nonce_str: 随机字符串
- sign: 签名
- body: 商品描述
- out_trade_no: 商户订单号
- total_fee: 标价金额
- spbill_create_ip: 终端IP
- notify_url: 通知地址
- trade_type: 交易类型
- openid: 用户标识
前两个参数已经有了,从第三个参数开始收集:
① nonce_str: 调用random函数生成随机字符串即可(32位以内)
② sign: 在其他参数完成后,将所有非空参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA,
在字符串最后拼接上key(即商户API**),然后对字符串进行MD5运算,最后将得到的所有字符串转化大写,示例代码:
③body: 自定义
④out_trade_no: 自定义,保证商户内唯一
⑤total_fee: 支付金额,默认单位为“分”
⑥spbill_create_ip: 用户IP,从request里获取
⑦notify_url: 搭建一个接口接收用户支付情况
⑧trade_type: 公众号支付填“JSAPI”
⑨openid: 公众号交互获取
注意:统一参数名和参数值的编码格式,避免编码错误。
参数准备完成,将参数转化为XML格式,即可调用接口。
四、生成前端所需参数
前端执行JS调起支付需要的参数有:
我们可以看到都是必要参数,前面4个都比较好获取,package是由后端调用“统一下单”接口后获取的prepay_id,paySign签名则是和前面叙述过的生成方法一样。
不同的是,参数收集完毕后,不需要转化为XML格式,直接以JSON格式传给前端,前端拿到数据后调起支付窗口的代码如下:
五、总结
微信支付被网上评价是所有支付中最好对接的,把流程捋清后发现确实不难,但因为官方文档过于青涩,网上又多是不捋思路,光一堆代码抛上来的“教程”,因此更让初学者感到无从下手。
希望这篇文章能给大家带来帮助和启发。