微信小程序+Python Django后端实现小程序线上微信支付,包含完整参数配置、关键代码和注意事项!!

本人也是第一次接触微信支付部分的开发,网上到处翻也没看到一篇能快速帮助梳理的文章,摸索了很久也踩坑无数,发出来一是记录,二是希望能帮到跟我一样对微信支付开发流程不熟悉的人,三是希望大家可以一起交流讨论,看看还有没有值得优化的地方~

目录

参数配置部分

开发部分(Django版本)

1. 前端_将用户openid和支付金额传回后端,用于生成预订单(示例如下)

2. 后端_预订单生成接口,并构造前端所需支付参数返回

(1)settings.py配置

(2)urls.py配置

(3)生成预订单的支付接口(views.py & functions.py)

3. 前端_获取支付参数,调用 wx.requestPayment 发起支付

4. 后端_支付成功后结果回调(views.py & functions.py)

首次开发过程中遇到的部分大小坑,欢迎一起探讨补充~

1. 首先一定一定要提前设置好APIv3密钥

2. 微信支付v3版本接口的参数结构体和v1v2不太一样,注意区分

3. 加载公钥私钥时的读取方式

4. Http头Authorization值格式错误

5. 生成预订单时用到的两次参数字符串,注意一致性

6. 支付时间写入数据库注意修正时区


参数配置部分

官方文档如下:开发必要参数说明,下面我按照过程中使用的先后顺序对参数作简要说明: 

  1. 商户号mchid——不多说,微信支付和小程序后台都可见,唯一注意的是需和appid关联

  2. appid——同样不多说

  3. 商户API证书——

    1. 官方配置指南:什么是商户API证书?如何获取商户API证书和私钥?_通用规则|微信支付商户文档中心;配置好后会提供一个压缩包,下载解压,包含如图内容:2个apiclient_cert是不同格式的商户API证书,apiclient_key.pem是证书生成的商户私钥,记事本是官方说明文档

    2. 主要使用以下两个参数:

      1. 私钥apiclient_key.pem地址:用于签名,发起生成预订单的请求和前端调起支付

      2. 证书序列号serial_no:因为证书中包含商户的商户号、公司名称、公钥信息,微信支付可使用序列号调用证书中的公钥对上述签名进行验签;使用openssl x509 -in apiclient_cert.pem -noout -serial命令获取,会得到类似【serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C】的结果,记录=后边的序列号

  4. 微信支付公钥——

    1. 官方配置指南:微信支付公钥产品简介及使用说明_微信支付公钥|微信支付商户文档中心;配置好后会提供一个pub_key.pem文件,可以跟商户API证书放到一个文件夹里

    2. 作用:支付回调时需要先用微信支付公钥进行验签(不难看出两个公钥都是拿来验签的,只是时机不同:API证书公钥是在生成预订单的时候用,微信支付公钥是在支付完成后回调结果的时候用),再处理加密数据

    3. 注意:官方提供的“开发必要参数说明”文档里还有一个【微信支付平台证书】,这俩的作用是一样的,但官方目前更推荐用【微信支付公钥】,后续代码也是基于公钥完成的

  5. APIv3——

    1. 官方配置指南:配置API key_通用规则|微信支付合作伙伴文档中心;

    2. 作用:支付回调数据解密,因为微信在支付成功后向回调地址发送的数据包是加密后的,只有使用APIv3将其解密才能获取真实的订单支付信息;

    3. 注意:这是个自定义的由32个数字/大小写字符构成的密钥,长度不能错,且不要和APIv2混淆,想要调用微信支付v3接口必须设置!必须设置!否则无法回调支付结果!

开发部分(Django版本)

1. 前端_将用户openid和支付金额传回后端,用于生成预订单(示例如下)

export function createOrderAPI(params) {
  return request({
    url: '/pay/',
    method: 'GET',
    data: params
  })
}

let para = {
      openid: wx.getStorageSync('openid'),
      amount: this.data.amount,
    }
let res = await createOrderAPI(para)

2. 后端_预订单生成接口,并构造前端所需支付参数返回

(1)settings.py配置
// settings.py

WECHAT_PAY = {
    'APPID': 'wx90XXXXXXXXXXXXXX',
    'MCHID': 'XXXXXXXXXX',
    'API_V3_KEY': '之前设置的32个字符的密钥',
    'CERT_SERIAL':'之前保存的商户API证书序列号',  # API证书序列号
    'NOTIFY_URL': 'https://yourdomain.com/pay/notify',  # 支付结果通知地址(pay可以替换成前端createOrderAPI里的接口名字,意思是回调地址最好和生成预订单的接口地址在一个目录下;该地址必须外网可访问;如果服务器设置了防火墙,记得把微信支付的IP段加入白名单)
    "CERT_PATH":BASE_DIR / "certs/apiclient_cert.pem",  # API证书pem版本地址,certs文件夹直接放在跟manage.py同级的根目录下
    "KEY_PATH":BASE_DIR / "certs/apiclient_key.pem",  # API证书私钥地址
    "PUB_KEY_PATH":BASE_DIR / "certs/pub_key.pem"  # 微信支付公钥地址
}
(2)urls.py配置
// urls.py

path('pay/', views.create_recharge_order, name='create_recharge_order'),  # 支付接口
path('pay/notify', views.pay_notify, name='pay_notify'),  # 微信支付结果通知
(3)生成预订单的支付接口(views.py & functions

作者:mangoac

物联沃分享整理
物联沃-IOTWORD物联网 » 微信小程序+Python Django后端实现小程序线上微信支付,包含完整参数配置、关键代码和注意事项!!

发表回复