Python后端对接微信支付


注意:原创文章,转载请注明出处。

引言

我从未想到就调两个接口那么难!

前段时间由于项目需要,开发的应用对接了微信公众号、微信支付。对接微信公众号比较简单,官网有详细的操作指南,但是微信支付却遇到了较大的困难,主要是因为官方的文档较为简陋,且代码演示是JAVA语言,在查阅了大量网上教程并摸索实践后,终于成功对接了微信支付,这篇文章在分享技术的同时,也算是回炉温习。

一、流程简述&难点简析

发起微信支付的后端流程:前期准备 => 调用微信支付“统一下单”接口生成订单 => 生成参数提供前端生成支付窗口。

整个流程并不复杂,难点在于捋清整个流程以及各个参数的收集或生成,既然流程已经清楚了,那么就按照流程一步步走。

二、前期准备

前期准备是收集后续使用到的参数,这里默认已经开通了公众平台服务号、微信商户平台账号(微信支付),并将公众号和商户平台账号绑定,同时公众号和微信支付都授权了后端服务器,那么你将会获得下面参数信息:
①公众号APPID
②公众号APPSECRET
③商户ID
④商户API**

三、统一下单

准备工作做好后,接下来是最大的挑战——调用微信支付“统一下单”接口生成订单,我们来看看接口需要提供哪些参数:
Python后端对接微信支付
Python后端对接微信支付
Python后端对接微信支付
那么多参数,有些不是必要的,那么必填的参数有:

  1. appid: 公众账号ID (已有)
  2. mch_id: 商户号 (已有)
  3. nonce_str: 随机字符串
  4. sign: 签名
  5. body: 商品描述
  6. out_trade_no: 商户订单号
  7. total_fee: 标价金额
  8. spbill_create_ip: 终端IP
  9. notify_url: 通知地址
  10. trade_type: 交易类型
  11. openid: 用户标识

前两个参数已经有了,从第三个参数开始收集:
① nonce_str: 调用random函数生成随机字符串即可(32位以内)
② sign: 在其他参数完成后,将所有非空参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=value1&key2=value2…)拼接成字符串stringA,
在字符串最后拼接上key(即商户API**),然后对字符串进行MD5运算,最后将得到的所有字符串转化大写,示例代码:
Python后端对接微信支付
③body: 自定义
④out_trade_no: 自定义,保证商户内唯一
⑤total_fee: 支付金额,默认单位为“分”
⑥spbill_create_ip: 用户IP,从request里获取
⑦notify_url: 搭建一个接口接收用户支付情况
⑧trade_type: 公众号支付填“JSAPI”
⑨openid: 公众号交互获取
注意:统一参数名和参数值的编码格式,避免编码错误。

参数准备完成,将参数转化为XML格式,即可调用接口。

四、生成前端所需参数

前端执行JS调起支付需要的参数有:
Python后端对接微信支付
我们可以看到都是必要参数,前面4个都比较好获取,package是由后端调用“统一下单”接口后获取的prepay_id,paySign签名则是和前面叙述过的生成方法一样。

不同的是,参数收集完毕后,不需要转化为XML格式,直接以JSON格式传给前端,前端拿到数据后调起支付窗口的代码如下:
Python后端对接微信支付

五、总结

微信支付被网上评价是所有支付中最好对接的,把流程捋清后发现确实不难,但因为官方文档过于青涩,网上又多是不捋思路,光一堆代码抛上来的“教程”,因此更让初学者感到无从下手。

希望这篇文章能给大家带来帮助和启发。