范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

Win10基于Vue。jsDjangoPython3微信扫码支付流程

  之前的一篇文章:mpvue1.0+python3.7+Django2.0.4实现微信小程序的支付功能,主要介绍了微信小程序内部支付的流程,然而实际上微信小程序有一定的局限性,也就是用户范围仅限于小程序内部生态圈,在生活中真正具有广泛性、高效性、使用方便性的支付方式还得是扫码支付,扫码的优点在于推广成本低,上至钓鱼台国宾馆,下至发廊地摊都能用,打印出来就完事了,而相比其他支付方式,现金的找零及假钞问题,信用卡的办理门槛、pos机的沉没成本,就算微信可集成的h5支付和小程序支付,奈何很多老年人根本不会用小程序和手机浏览器,更别说再进行支付操作了,所以基于二维码的扫码支付的确是非常符合国情的。
  本次我们使用前后端分离项目Vue.js+Django来集成微信的扫码支付功能,体验一下21世纪泛用性最高的支付方式,首先注册微信公众平台:https://mp.weixin.qq.com
  获得开发者id和秘钥(appid & appsecret)
  同时确保获取微信支付接口的权限:
  随后注册微信支付商户平台:https://pay.weixin.qq.com/
  获取微信支付的商户号(在账户信息页面):
  获取微信支付接口的秘钥(账户中心->api安全):
  同时在产品中心->开发配置页面,将支付域名配置好:
  这里不像微信小程序,小程序只能允许https协议接口,而扫码支付域名既支持https也支持http,非常方便,同时注意域名必须是一个备案域名。
  至此,微信支付的前置操作就搞定了,下面我们来编写后台接口wx_pay.py,首先导入依赖的库和一些工具方法: import requests from django.http import HttpResponse, HttpResponseRedirect  import random import time import hashlib  import qrcode from bs4 import BeautifulSoup  def trans_xml_to_dict(data_xml):     soup = BeautifulSoup(data_xml, features="xml")     xml = soup.find("xml")  # 解析XML     if not xml:         return {}     data_dict = dict([(item.name, item.text) for item in xml.find_all()])     return data_dict  def trans_dict_to_xml(data_dict):  # 定义字典转XML的函数     data_xml = []     for k in sorted(data_dict.keys()):  # 遍历字典排序后的key         v = data_dict.get(k)  # 取出字典中key对应的value         if k == "detail" and not v.startswith("".format(v)         data_xml.append("<{key}>{value}".format(key=k, value=v))     return "{}".format("".join(data_xml))  # 返回XML  def get_sign(data_dict, key):  # 签名函数,参数为签名的数据和密钥     params_list = sorted(data_dict.items(), key=lambda e: e[0], reverse=False)  # 参数字典倒排序为列表     params_str = "&".join(u"{}={}".format(k, v) for k, v in params_list) + "&key=" + key     # 组织参数字符串并在末尾添加商户交易密钥     md5 = hashlib.md5()  # 使用MD5加密模式     md5.update(params_str.encode())  # 将参数字符串传入     sign = md5.hexdigest().upper()  # 完成加密并转为大写     return sign
  qrcode模块用来生成二维码,bs4模块用来将微信接口返回的xml解析成json,在21世纪的第二十个年头,微信接口居然还在使用原始的xml,这种反人类行为实在不能理解。
  接下来我们来编写支付逻辑,参考微信官方文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5&index=3
  业务流程说明:
  (1)商户后台系统根据用户选购的商品生成订单。
  (2)用户确认支付后调用微信支付【统一下单API】生成预支付交易;
  (3)微信支付系统收到请求后生成预支付交易单,并返回交易会话的二维码链接code_url。
  (4)商户后台系统根据返回的code_url生成二维码。
  (5)用户打开微信"扫一扫"扫描二维码,微信客户端将扫码内容发送到微信支付系统。
  (6)微信支付系统收到客户端请求,验证链接有效性后发起用户支付,要求用户授权。
  (7)用户在微信客户端输入密码,确认支付后,微信客户端提交授权。
  (8)微信支付系统根据用户授权完成支付交易。
  (9)微信支付系统完成支付交易后给微信客户端返回交易结果,并将交易结果通过短信、微信消息提示用户。微信客户端展示支付交易结果页面。
  (10)微信支付系统通过发送异步消息通知商户后台系统支付结果。商户后台系统需回复接收情况,通知微信后台系统不再发送该单的支付通知。
  (11)未收到支付通知的情况,商户后台系统调用【查询订单API】。
  (12)商户确认订单已支付后给用户发货。
  一望而知,我们需要调用微信的统一下单接口,文档:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_1
  编写逻辑: def wx_pay(request):      url = "https://api.mch.weixin.qq.com/pay/unifiedorder"  # 微信扫码支付接口     key = "945bec********a8fbf7d7"  #商户api秘钥     total_fee = 1 #支付金额,单位分     body = "123123"  # 商品描述     out_trade_no = "order_%s" % random.randrange(100000, 999999)  # 订单编号     params = {         "appid": "wx09*****f",  # APPID         "mch_id": "16****08",  # 商户号         "notify_url": "http://wxpay.v3u.cn/wx_back/",  # 支付域名回调地址         "product_id": "goods_%s" % random.randrange(100000, 999999),  # 商品编号         "trade_type": "NATIVE",  # 支付类型(扫码支付)         "spbill_create_ip": "114.254.176.137",  # 发送请求服务器的IP地址         "total_fee": total_fee,  # 订单总金额         "out_trade_no": out_trade_no,  # 订单编号         "body": body,  # 商品描述         "nonce_str": "ibuaiVcKdpRxkhJA"  # 字符串     }     sign = get_sign(params, key)  # 获取签名     params.setdefault("sign", sign)  # 添加签名到参数字典     xml = trans_dict_to_xml(params)  # 转换字典为XML     response = requests.request("post", url, data=xml)  # 以POST方式向微信公众平台服务器发起请求     data_dict = trans_xml_to_dict(response.content)  # 将请求返回的数据转为字典     print(data_dict)     qrcode_name = out_trade_no + ".png"  # 支付二维码图片保存路径     if data_dict.get("return_code") == "SUCCESS":  # 如果请求成功         img = qrcode.make(data_dict.get("code_url"))  # 创建支付二维码片         img.save("./" + qrcode_name)  # 保存支付二维码     return HttpResponse(qrcode_name)
  随后配置路由: from myapp.wx_pay import wx_pay from django.contrib.staticfiles.urls import staticfiles_urlpatterns  # ... the rest of your URLconf goes here ... urlpatterns = [     #定义超链接路由     re_path("^static/upload/(?P.*)#39;,serve,{"document_root":"/static/upload/"}),     path("wx_pay/", wx_pay), ]
  启动django服务: python manage.py runserver
  访问http://localhost:8000/wx_pay/
  没有问题,查看后台日志: {"return_code": "SUCCESS", "return_msg": "OK", "appid": "wx092344a76b9979ff", "mch_id": "1602932608", "nonce_str": "bnJwGlXZ3eDSNgjs", "sign": "2D81402DABEDF75E9A58F200FE7B6775", "result_code": "SUCCESS", "prepay_id": "wx1816114416896958d6f84177bd71da0000", "trade_type": "NATIVE", "code_url": "weixin://wxpay/bizpayurl?pr=JgBYgTS00"}
  可以看到已经下单成功,不过订单状态处于预支付状态,同时检查二维码图片是否生成:
  至此,后台逻辑基本搞定,下面就是如何在前端进行调用,同时让用户进行扫描操作,编写wx_pay.vue组件: 
  当用户点击按钮之后,旋即请求后端支付接口,将接口生成的二维码返回给前端,效果是这样的:
  随后使用微信扫一扫功能进行扫码支付,需要注意的是,该二维码有效期只有五分钟,所以最好加上刷新功能。
  支付成功之后,我们还需要对交易进行确认,所以根据微信官方文档,调用统一查询接口:
  https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=9_2,根据接口文档编写逻辑: def wx_check(request):      #统一订单查询接口      url = "https://api.mch.weixin.qq.com/pay/orderquery"      out_trade_no = "order_537236" #支付后的商户订单号     key = "945b******d7"  # 商户api密钥      params = {         "appid": "wx0*****ff",  # APPID         "mch_id": "16*****08",  # 商户号         "out_trade_no": out_trade_no,  # 订单编号         "nonce_str": "ibuaiVcKdpRxkhJA"  # 随机字符串     }     sign = get_sign(params, key)  # 获取签名     params.setdefault("sign", sign)  # 添加签名到参数字典     xml = trans_dict_to_xml(params)  # 转换字典为XML     response = requests.request("post", url, data=xml)  # 以POST方式向微信公众平台服务器发起请求     data_dict = trans_xml_to_dict(response.content)  # 将请求返回的数据转为字典     print(data_dict)      return HttpResponse("ok")
  这里需要注意的是,查询的订单编号可以使商户自己的订单编号,也可以是微信订单号,二者必取其一:
  访问接口 http://localhost:8000/wx_check/
  返回结果: {"return_code": "SUCCESS", "return_msg": "OK", "appid": "wx092344a76b9979ff", "mch_id": "1602932608", "nonce_str": "BVoaDmxxADkpSFEl", "sign": "23A86EB406B743E0C2C61C7E78DC9373", "result_code": "SUCCESS", "openid": "oy9q36f9Dpeokj9FWyN3j0znpIqE", "is_subscribe": "N", "trade_type": "NATIVE", "bank_type": "OTHERS", "total_fee": "1", "fee_type": "CNY", "transaction_id": "4200000806202012174121934231", "out_trade_no": "order_537236", "attach": " ", "time_end": "20201217231553", "trade_state": "SUCCESS", "cash_fee": "1", "trade_state_desc": "支付成功", "cash_fee_type": "CNY"}
  可以看到没有问题,但是由于涉及金钱业务,为了养成良好的测试习惯,最好登录商户后台再次确认:
  结语:至此,整个微信扫码支付流程全部跑通,流程上比微信小程序支付逻辑要简单一些,同时由于不需要在线用户的openid,所以像微信小程序获取不到openid这样的大坑并不存在,后续会分享一些关于微信扫码订单退款的逻辑,搞笑的是,统一下单和查询接口没有并发限制,而申请退款居然有qps上的限制,所以退款流程应该会需要消息队列的介入。

八省联考为什么没有浙江吗?还想让浙江剃兄弟省几个光头吗?浙江现在太小了,没法再拆了。明代二次科举中榜的全是浙江学子,朱元璋为了政治平衡,制约浙江,对南京,淮河,苏北地区的经济,文化扶贫把苏州,无锡,常州,上来例假可以泡脚吗?泡脚是一个很养生的事情,能促进血液的循环,如果睡前泡脚还能帮助睡眠。现在很多女性还用各种花材或是药材泡脚,也是不错的选择。很多人认为泡脚能活血,所以是不能在月经期间泡脚,其实不对的小米手机正常的寿命到底有几年?小米手机正常的寿命到底有几年?曾经是半个米粉,因为用了大概6年小米系列手机,但现在购买了华为手机,与小米手机同时用。不吹不黑小米手机作为普通老百姓来说,非常接地气。小米手机正常的使最近想换一个手机,有什么推荐?以下内容仅为个人观点,且由于个人没有使用过苹果手机因此本篇仅包含安卓阵营一入门机型本类机型适合对手机依赖程度不高的人群,也就是主要使用通讯功能和社交功能。推荐1红米k30系列,在低为什么旅行车不如SUV?真是消费者不懂么?开车10多年,轿车和城市SUV以及硬派越野车都开过由于工作相关,这些年的确开过不少车型,奔驰S宝马7系奥迪A8L奥迪Q7奔驰GLS450奥迪Q5L等,此外也经常测试各种类型的高中低长期用降尿酸药物会不会伤肾?这个问题的答案是肯定的。高尿酸血症,是继高血压高血糖高血脂之后又一个发生率很多的疾病,现在并称为四高症。它最直接的后果就是引起痛风,长期高尿酸还会损害全身的各个器官,所以要重视并积农行卡因玩虚拟货币搬砖,频繁深夜大额快进出转账,被银行限制,全部冻结不收不付。请问要怎么和银行解释?不用和银行解释,你这个属于虚拟货币交易中的黑产冻结。从2019年开始,以比特币为首的虚拟数字货币交易平台中,如果想要安全出入金的话,基本上都会通过平台撮合交易的法币系统。但是这个法领导在批示中只批一个阅是什么意思?大领导批阅文件是非常有学问的。曾经看过一个段子,有的领导批阅文件,下属到底办不办不看批阅内容,就看领导的签名,签名是横着写的,可以不办或缓办公室,签名是竖着写的,不仅要办,而且必须哪些电视剧角色的颜值,会让人很介意,直接影响看剧的心情?演员的颜值作为一部电视剧不可缺少的要素之一,可以说很多电视剧的火热最先被关注的便是演员的颜值。如果演员的颜值都一言难尽的话,这一部剧大概也就一言难尽了。空气刘海小辫子,他被称史上最王力宏返台车子冲撞记者,场面混乱,这是放开不再经营人设了吗?王力宏离婚这事件越扯越破,连他的老父亲都出来发文否认自己的儿子不是渣男,不知道娱乐圈渣男的标准是什么?找小姐算不算渣男?公说有公理婆说有婆理。做为吃瓜群众,真相到底是什么样的,我们DNF为何我剑魂刷深渊遇到七彩柱子出了一把史诗光剑,不是说碰到七彩柱子一定出神话吗?众所周知,自从DNF的100级版本上线之后,很多玩家都开始了自己的深渊之旅,毕竟在新版本中,你要想得到毕业装备,就必须去刷,这个时候就要看谁的运气比较好了,可是有位DNF玩家发现用
刚上高中,竞赛加上学习导致我力不从心,现在连续两次周测爆炸,我该怎么办?我们学校是奥赛名校,有专门的奥赛班,据我的观察,奥赛学习是一把双刃剑,虽然有极个别的学生通过奥赛比赛,获得国家奖牌,提前锁定北大清华,但是对于其他多数学生来说,奥赛就是陪练,练不好作为家长你敢把孩子从校外辅导班撤出来吗?说实话我不敢,虽然我本身也是老师,但是自从孩子上了高中,超出了我的辅导能力,我就针对他的薄弱学科,在征求了他的意见之后,把他送到了课后辅导班。现在跟着课后辅导班儿已经上了快两年了,坚持喝银耳汤,会产生什么变化?网上盛传银耳莲子羹天天喝,皮肤水嫩白滑富有光泽银耳更有穷人燕窝的名号,虽然这句话听起来更像是挖苦嘲讽,但是也一定程度上表现在了在老百姓心目中银耳的地位隔夜银耳有毒?新鲜银耳不能吃?房贷有70万,手上有70万现金,是提前还款好,还是投资理财划算?最典型的误区,就是把贷款利率和理财收益去做比较。银行贷款是雷打不动,必须要还的,理财收益可有可无的,不必然存在,甚至有风险的。这两者性质完全不同,怎么能放在同一维度去比较?对于那些有100万要怎么理财,借朋友做生意利息1分5,还是买房子好?朋友们好,标题中这位投资人有100万元,想了解怎么理财。他现在有两个思路一是买房但是还不够首付,可能是一线城市吧。2试借给朋友1分5的利。结合现代的实践来看,哪个好,还要看你,对理什么样的工作可以辞职了?以下几种情形,就可以辞职了1。没有上升空间没有上升空间,就很难在职场上混下去,在一个岗位做久了,会发现其他的都不会,一旦离开这个公司,就会失去竞争力。2。只谈理想,不加薪无论工作是创业初期,如何管理合伙人?三次创业合伙的血泪教训,每条里充满着财富与人性的真相!还给一个真心忠告如无绝对必要,尽量不要在初期合伙。直接说说血泪经历吧第一次,太年轻了,几个人有兴趣的人就攒了一个校园创业项目,怎样快速让宝宝停止打嗝?你好,很高兴有机会为您解答!宝宝打嗝是一个非常常见的情况,和我们大人不一样,他们其实并不会觉得打嗝有多么不舒服。相反,很多宝宝甚至在嗝声中入睡,睡着了,也就不打嗝了。当然,也有一些欧美老人为什么都不跳广场舞?他们做什么打发自己的退休时光呢?我知道一对外国老夫妻,都70多岁了,俩个人都很胖,他们退休后,不会帮子女带孩子,一般上午自己磨咖啡,咖啡煮好了,两个人坐下细细的慢慢品咖啡,然后就到离家不远的草坪上去溜溜狗,俩个人江苏公务员福利待遇怎么样?江苏公务员待遇主要有这几个大类。苏南,苏州无锡常州。苏州是江苏公务员待遇最高的地方,市直公务员加公积金一年20w,各区直张家港昆山常熟的公务员加公积金大于25w,乡镇公务员加公积金欠平安信用卡5万2,银行说要上门,我要请个律师吗?欠银行的信用卡是要还的,你请谁都没用。如果有钱请律师还不如用来还债。银行的催收第一步是短信提醒,接下来是电话催收(这过程中平安银行的会用很多手段),第三步电话催收没有效果时可能会选