最近接触到了微信支付,主要做的是用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

  1. 商户后台系统根据用户选购的商品生成订单;

    关键参数:生成订单时需提供product_id,商户订单号out_trade_no以及订单金额total_fee(单位分);
    
  2. 用户确认支付后调用微信支付统一下单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

  3. 微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url,然后商户后台系统根据返回的code_url生成二维码。

    此处返回的ur需自行调用JS(如QRCode)转成二维码图片;
    

    QRCode使用可参考:https://www.runoob.com/w3cnote/javascript-qrcodejs-library.html

  4. 用户打开微信“扫一扫”扫描二维码,微信客户端将扫码内容发送到微信支付系统, 微信支付系统根据用户授权完成支付交易,微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。

  5. 微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。

    异步通知接口需要自行撰写,返回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)
    
  6. 除了等待微信支付系统的通知,商户后台系统也可调用查询订单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相关推荐

  1. 微信Native支付简单实现

    文章目录 微信Native支付简单实现 微信支付提供的几种对接方式 Native方式 JSAPI支付 APP支付 H5支付 小程序支付 正文开始 二维码生成 代码示例:源码才是做好的API 微信Nat ...

  2. 微信app支付服务端开发记录

    微信APP支付服务端 调用接口需要注意事项: 1.签名:需要全部参数参加签名,空值去掉.(实际传递了什么参数需要,就根据实际参数进行签名) 2.签名参数:appid是申请支付功能的app对于的ID,k ...

  3. Laravel微信Native支付、微信jsapi支付

    ** 之前一直使用thinkphp做开发,偶然的一次机会运用了laravel框架并且做了一个微信扫码支付功能,发现laravel扩展功能大大超过了tp,接下来分享一下laravel的EasyWeCha ...

  4. 微信Native支付V3版本

    微信Native支付V3版本 微信支付在开发之前也是需要进行商户接入的 接入文档链接: https://pay.weixin.qq.com/index.php/core/home/login Nati ...

  5. (用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正...

    原文:(用微信扫的静态链接二维码)微信native支付模式官方提供的demo文件中的几个bug修正 native支付模式一demo(用微信扫的静态链接二维码)BUG修复,一共4个BUG 1.nativ ...

  6. 微信、企业微信、支付窗、微博SDK 四合一,JeeWx-api 1.2.2 版本发布!

    JeeWx-API 1.2.2 版本发布,微信.企业微信.支付窗.微博SDK四合一 JEEWX-API 是第一款JAVA版微信极速SDK,同时集成企业微信SDK,支付窗SDK,微博SDK,可以快速的基 ...

  7. phpcms实现PC网站接入微信Native支付

    微信支付-PC网站接入支付 微信支付支持完成域名ICP备案的网站接入支付功能.PC网站接入支付后,可以通过JSAPI支付或Native支付,自行开发生成二维码,用户使用微信"扫一扫" ...

  8. 微信APP支付服务端和Android 端详解及其demo

    最近在开发APP微信支付和支付宝支付,Android 端和后端都是我自己开发的,发现两家公司的文档都不是很友好,特别是微信,接触过或者开发过的人都应该有所体会.因此我特意把开发的过程梳理了,做下记录, ...

  9. 微信Native支付接入教程(2022简洁版)

    PC网站接入支付 微信支付支持完成域名ICP备案的网站接入支付功能.PC网站接入支付后,可以通过JSAPI支付或Native支付,自行开发生成二维码,用户使用微信"扫一扫"来完成支 ...

最新文章

  1. 如何理解soft target这一做法?
  2. 常用的数据结构-队列
  3. python综合案例分享_Python面向对象 三大特性 综合案例+1(视频里的作业)
  4. Linux信号 三 信号发送接口集合
  5. B站一季度营收超预期,月活跃用户达1.72亿
  6. PHP前端和数据库的连接
  7. 【Mac软件推荐】Alfred:Mac下最好的快速启动工具
  8. parted如何将磁盘所有空间格式化_linux下大于2T的硬盘格式化问题
  9. IGDB|2021年大学生夏令营开始报名啦!
  10. 用Python一次性把论文作图与数据处理全部搞定!
  11. 跟我学ModelArts丨探索ModelArts平台个性化联邦学习API
  12. 使用Maven+Nexus+Jenkins+Svn+Tomcat+Sonar搭建持续集成环境(一)
  13. 数据仓库与数据挖掘实践期末复习总结
  14. 机器视觉运动控制一体机应用|工件同心度检测
  15. 移动设备支持方式-移动设备管理MDM
  16. echarts 设置地图外边框以及多个geo实现缩放拖曳同步
  17. 域名被劫持应该如何处理
  18. allegro 封装shape焊盘问题 Unable to load shape symbol
  19. 4、(四)外汇学习基础篇之银行间外汇远期交易
  20. (日常)Dell R740 XD 服务器安装GPU显卡记录

热门文章

  1. 经典线性降维算法—局部保持投影(LPP)
  2. 1.前端HTML开发规范
  3. 厦门市租房情况分析App02项目
  4. 电池健康测试软件,iPhone电池不耐用?教你查看测试一下iPhone电池健康度..
  5. 解决邮箱下载下来的word打不开的问题
  6. java支持库(_Java运行环境支持库下载-Java Runtime Environment(JRE) v9.1.8官方64位版-ucbug下载站...
  7. 5G NAS (SA) 基础知识
  8. msdn library january 2001 下载审明
  9. python/多进程笔记以及一些理解
  10. <金融绘图>学习笔记