paymen 支付模块
目录结构
payment
│ README.md # 说明文档
│ __init__.py # 包描述(默认为空)
│ admin.py # 管理员
│ apps.py # Django-APP注册文件
│ urls.py # 路径
│
└───alipay
│ │ __init__.py # 包描述(默认为空)
│ │ ali_pay.py # 阿里支付逻辑代码(原项目为alipay.py)
│ │ alipay_config.py # 阿里支付全局配置
│ │ alipaycore.py # 阿里支付编码处理
│
└───weixinpay
│ __init__.py # 包描述(默认为空)
│ wx_pay.py # 微信支付逻辑代码(原项目为weixinpay.py,但是这个文件会跟文件夹名字冲突)
│ weixinpay_config.py # 微信支付全局配置
│ weixinpaycore.py # 微信支付编码处理
微信支付
微信支付开发者文档
GitHub原代码 源码与本博客有部分出入.
- 采用模式二
业务流程说明:
(1)商户后台系统根据用户选购的商品生成订单。
(2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
(3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
(4)商户后台系统根据返回的code_url生成二维码。
(5)用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统。
(6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
(7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
(8)微信支付系统根据用户授权完成支付交易。
(9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
(10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
(11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
(12)商户确认订单已支付后给用户发货。
其中开发者需要处理(1), (2), (4), (10), (11) 五个方面
流程(1)本模块不涉及订单生成程序,但订单生成程序函数需要向流程(2)统一下单调用程序传入两个参数:
- 商户订单号
out_trade_no
- 交易金额
total_fee
流程(2)统一预下单API需要一下参数:
appid 公众账号ID # 公众号,需要申请,在微信支付后台产品中心APPID管理中绑定
mch_id 商户号产 # 在微信支付后台账户中心中查找
nonce_str 随机字符串 # 本模块采用 uuid
sign 签名 # 需要根据传输参数生成
body 商品描述 # 根据自己喜欢随便起
out_trade_no 商户订单号 # 需要程序调用者传入
total_fee 标价金额 # 需要程序调用者传入
notify_url 通知地址 # 回传地址,需要确认订单生成
spbill_create_ip 服务器地址 # 你的服务器地址
limit_pay 指定支付方式 # 本模块针对 NATIVE 支付方式而编写
-
首先在全局配置文件
weixinpay_config
中配置:appid 公众账号ID # 公众号,需要申请,在微信支付后台产品中心APPID管理中绑定 mch_id 商户号产 # 在微信支付后台账户中心中查找 body 商品描述 # 根据自己喜欢随便起 notify_url 通知地址 # 回传地址,需要确认订单生成 spbill_create_ip 服务器地址 # 你的服务器地址 limit_pay 指定支付方式 # 本模块针对 NATIVE 支付方式而编写 key 秘钥 # 微信支付后台>账户中心>API安全>API秘钥 中设置
等六个基本配置信息
-
在本模块中随机字符串采用的是
uuid
模块中的uuid4()
函数生成的32位字符串(原本带四个-
需要去掉) -
订单生成程序调用统一下单程序时传入 商户订单号
out_trade_no
以及 交易金额total_fee
def make_payment_request_wx(out_trade_no, total_fee): total_fee = int(float(total_fee) * 100) payment_info = make_payment_info(out_trade_no=out_trade_no, total_fee=total_fee) res = weixinpay_core.make_payment_request(payment_info) return res
-
统一下单程序再调用传输参数列表
def make_payment_info(out_trade_no=None, total_fee=None