最近接触到了微信支付,主要做的是用django实现PC端的Native支付模式,即商户系统页面生成支付二维码,用户用“扫一扫”完成支付的模式,下面简单了解一下微信支付的开发文档。
微信支付模式分类
- 付款码支付
主要应用线下面对面收银的场景; - Native支付
Native支付是商户系统按微信支付协议生成支付二维码,用户再用微信“扫一扫”完成支付的模式。该模式适用于PC网站支付、实体店单品或订单支付、媒体广告支付等场景; - JSAPI支付
JSAPI支付是用户在微信中打开商户的H5页面,商户在H5页面通过调用微信支付提供的JSAPI接口调起微信支付模块完成支付; - APP支付
APP支付又称移动端支付,是商户通过在移动端应用APP中集成开放SDK调起微信支付模块完成支付的模式; - H5支付
H5支付主要是在手机、ipad等移动设备中通过浏览器来唤起微信支付的支付产品; - 小程序支付
小程序支付是专门被定义使用在小程序中的支付产品。目前在小程序中能且只能使用小程序支付的方式来唤起微信支付。
Native支付模式
Native支付有两种模式,我们可以根据支付场景选择相应的模式:
-
模式一
商户后台系统根据微信支付规则链接生成二维码,链接中带固定参数productid(可定义为产品标识或订单号)。用户扫码后,微信支付系统将productid和用户唯一标识(openid)回调商户后台系统(需要设置支付回调URL),商户后台系统根据productid生成支付交易,最后微信支付系统发起用户支付流程。 -
模式二
商户后台系统调用微信支付统一下单API生成预付交易,将接口返回的链接生成二维码,用户扫码后输入密码完成支付交易。该模式的预付单有效期为2小时,过期后无法支付。
相比之下,模式二较为简单,更容易上手,因此选择了模式二。
native模式二支付流程及核心代码(关键函数见尾部)
事先需获取到微信公众账号的appid和商户号mch_id
-
商户后台系统根据用户选购的商品生成订单;
关键参数:生成订单时需提供product_id,商户订单号out_trade_no以及订单金额total_fee(单位分);
-
用户确认支付后调用微信支付统一下单API生成预支付交易;
关键参数:UNIFIED_ORDER_URL统一下单地址,NOTIFY_URL自定义的支付回调地址,nonce_str随机字符串,sign签名,body商品描述,spbill_create_ip终端IP,trade_type此处为NATIVE。
以上所有参数(包含appid、mch_id等)均用来构建xml请求参数,xml示例如下:
<xml> <appid>xxxxxx</appid> <body>NATIVE支付测试</body> <mch_id>10000100</mch_id> <nonce_str>1add1a30ac87aa2db72f57a2375d8fec</nonce_str> <notify_url>xxx.com</notify_url> <out_trade_no>1415659990</out_trade_no> <spbill_create_ip>0.0.0.0</spbill_create_ip> <total_fee>1</total_fee> <trade_type>NATIVE</trade_type> <sign>0CB01533B8C1EF103065174F50BCA001</sign> </xml>
代码实现
# 构建原始参数dict,之后转成xml格式 params = { "appid": APP_ID, "mch_id": MCH_ID, "nonce_str": nonce_str, "out_trade_no": out_trade_no, "body": 'xxxx', "total_fee": total_fee, "spbill_create_ip": spbill_create_ip, "notify_url": NOTIFY_URL, "trade_type": "NATIVE", "product_id": product_id, } sign =