微信Native支付 商户端python SDK
最近接触到了微信支付,主要做的是用django实现PC端的Native支付模式,即商户系统页面生成支付二维码,用户用“扫一扫”完成支付的模式,下面简单了解一下微信支付的开发文档。
文章目录
- 微信支付模式分类
- Native支付模式
- 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 = sign_func(params, API_KEY) # 调用签名生成函数 params["sign"] = sign req_xml = re_dict_to_xml(params) # 调用函数将dict转为xml格式 res_xml = requests.post(UNIFIED_ORDER_URL, req_xml, verify=False) # 调用统一下单API res_xml.encoding = 'utf-8' _, res_obj = xml_to_dict(res_xml.text) # 调用函数将结果转成dict 方便后续的解析 code_url = res_obj["code_url"] # 此处获得二维码url
关于接口其他返回参数的详细信息及使用方法,可参考官方文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url,然后商户后台系统根据返回的code_url生成二维码。
此处返回的ur需自行调用JS(如QRCode)转成二维码图片;
QRCode使用可参考:https://www.runoob.com/w3cnote/javascript-qrcodejs-library.html
用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统, 微信支付系统根据用户授权完成支付交易,微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
异步通知接口需要自行撰写,返回return_code和return_msg给微信即可;
代码实现
@csrf_exempt def wechatpay_notify(request):xml = request.bodyWECHAT_SUCCESS = re_dict_to_xml({'return_code': 'SUCCESS','return_msg': 'OK'})WECHAT_FAIL = re_dict_to_xml({'return_code': 'FAIL','return_msg': 'ERROR',})sign, xml_obj = xml_to_dict(xml)check_sign = sign_func(xml_obj, API_KEY)if sign != check_sign: # 校验签名return HttpResponse(WECHAT_FAIL)if xml_obj['result_code'] != 'SUCCESS':return HttpResponse(WECHAT_FAIL)else:return HttpResponse(WECHAT_SUCCESS)
除了等待微信支付系统的通知,商户后台系统也可调用查询订单API来自主查询订单支付情况。
关键参数:QUERY_ORDER_URL统一查询地址,nonce_str随机字符串,sign签名。
代码实现
def query_order(request):data = {'out_trade_no': out_trade_no,'pay_status': 0,'err_msg': None}nonce_str = generate_nonce_str()params = {"appid": APP_ID,"mch_id": MCH_ID,"nonce_str": nonce_str,"out_trade_no": out_trade_no,}sign = sign_func(params, API_KEY)params["sign"] = signreq_xml = re_dict_to_xml(params)res_xml = requests.post(QUERY_ORDER_URL, req_xml, verify=False)res_xml.encoding = 'utf8'_, res_obj = xml_to_dict(res_xml.text)if res_obj["return_code"] == "FAIL":return Response(res_obj["err_code_des"])else:result_code = res_obj["result_code"]trade_state = res_obj["trade_state"]if result_code == "SUCCESS":if trade_state == "SUCCESS":data['pay_status'] = 1else:data['err_msg'] = res_obj['trade_state_desc']else:data['err_msg'] = res_obj['err_code_des']return Response(data)
关于接口其他返回参数的详细信息及使用方法,可参考官方文档:
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_2
注意:微信API接口均采用POST
自定义的部分关键函数
随机字符串函数
微信支付API接口协议中使用的nonce_str,主要用来保证签名不可预测。
# 生成随机字符串
def generate_nonce_str(size=32):charsets = string.ascii_uppercase + string.digitsresult = []for index in range(0, size):result.append(random.choice(charsets))return "".join(result)
校验签名
关于生成签名的规则和参数拼接顺序可参考
https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=4_3
# 生成签名
def sign_func(payload, sign_key=None):params_list = []for key, value in payload.items():if value:params_list.append("%s=%s" % (key, value))params_list.sort()raw_str = "&".join(params_list)if sign_key:raw_str += "&key=%s" % sign_keymd5 = hashlib.md5()md5.update(raw_str.encode('utf8'))return md5.hexdigest().upper()
微信支付API官方文档 https://pay.weixin.qq.com/wiki/doc/api/index.html
微信Native支付 商户端python SDK相关推荐
- 微信Native支付简单实现
文章目录 微信Native支付简单实现 微信支付提供的几种对接方式 Native方式 JSAPI支付 APP支付 H5支付 小程序支付 正文开始 二维码生成 代码示例:源码才是做好的API 微信Nat ...
- 微信app支付服务端开发记录
微信APP支付服务端 调用接口需要注意事项: 1.签名:需要全部参数参加签名,空值去掉.(实际传递了什么参数需要,就根据实际参数进行签名) 2.签名参数:appid是申请支付功能的app对于的ID,k ...
- Laravel微信Native支付、微信jsapi支付
** 之前一直使用thinkphp做开发,偶然的一次机会运用了laravel框架并且做了一个微信扫码支付功能,发现laravel扩展功能大大超过了tp,接下来分享一下laravel的EasyWeCha ...
- 微信Native支付V3版本
微信Native支付V3版本 微信支付在开发之前也是需要进行商户接入的 接入文档链接: https://pay.weixin.qq.com/index.php/core/home/login Nati ...
- (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正...
原文:(用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正 native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.nativ ...
- 微信、企业微信、支付窗、微博SDK 四合一,JeeWx-api 1.2.2 版本发布!
JeeWx-API 1.2.2 版本发布,微信.企业微信.支付窗.微博SDK四合一 JEEWX-API 是第一款JAVA版微信极速SDK,同时集成企业微信SDK,支付窗SDK,微博SDK,可以快速的基 ...
- phpcms实现PC网站接入微信Native支付
微信支付-PC网站接入支付 微信支付支持完成域名ICP备案的网站接入支付功能.PC网站接入支付后,可以通过JSAPI支付或Native支付,自行开发生成二维码,用户使用微信"扫一扫" ...
- 微信APP支付服务端和Android 端详解及其demo
最近在开发APP微信支付和支付宝支付,Android 端和后端都是我自己开发的,发现两家公司的文档都不是很友好,特别是微信,接触过或者开发过的人都应该有所体会.因此我特意把开发的过程梳理了,做下记录, ...
- 微信Native支付接入教程(2022简洁版)
PC网站接入支付 微信支付支持完成域名ICP备案的网站接入支付功能.PC网站接入支付后,可以通过JSAPI支付或Native支付,自行开发生成二维码,用户使用微信"扫一扫"来完成支 ...
最新文章
- 如何理解soft target这一做法?
- 常用的数据结构-队列
- python综合案例分享_Python面向对象 三大特性 综合案例+1(视频里的作业)
- Linux信号 三 信号发送接口集合
- B站一季度营收超预期,月活跃用户达1.72亿
- PHP前端和数据库的连接
- 【Mac软件推荐】Alfred:Mac下最好的快速启动工具
- parted如何将磁盘所有空间格式化_linux下大于2T的硬盘格式化问题
- IGDB|2021年大学生夏令营开始报名啦!
- 用Python一次性把论文作图与数据处理全部搞定!
- 跟我学ModelArts丨探索ModelArts平台个性化联邦学习API
- 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)
- 数据仓库与数据挖掘实践期末复习总结
- 机器视觉运动控制一体机应用|工件同心度检测
- 移动设备支持方式-移动设备管理MDM
- echarts 设置地图外边框以及多个geo实现缩放拖曳同步
- 域名被劫持应该如何处理
- allegro 封装shape焊盘问题 Unable to load shape symbol
- 4、(四)外汇学习基础篇之银行间外汇远期交易
- (日常)Dell R740 XD 服务器安装GPU显卡记录
热门文章
- 经典线性降维算法—局部保持投影(LPP)
- 1.前端HTML开发规范
- 厦门市租房情况分析App02项目
- 电池健康测试软件,iPhone电池不耐用?教你查看测试一下iPhone电池健康度..
- 解决邮箱下载下来的word打不开的问题
- java支持库(_Java运行环境支持库下载-Java Runtime Environment(JRE) v9.1.8官方64位版-ucbug下载站...
- 5G NAS (SA) 基础知识
- msdn library january 2001 下载审明
- python/多进程笔记以及一些理解
- <金融绘图>学习笔记