正文
由于最近自己在做小程序的支付,就在这里简单介绍一下讲一下用python做小程序支付这个流程。当然在进行开发之前还是建议读一下具体的流程,清楚支付的过程。
1.支付交互流程
当然具体的参数配置可以参考官方文档https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php"htmlcode">
import requests from config import APPID, SECRET class OpenidUtils(object): def __init__(self, jscode): self.url = "https://api.weixin.qq.com/sns/jscode2session" self.appid = APPID # 小程序id self.secret = SECRET # 不要跟后面支付的key搞混 self.jscode = jscode # 前端传回的动态jscode def get_openid(self): # url一定要拼接,不可用传参方式 url = self.url + "" + self.appid + "&secret=" + self.secret + "&js_code=" + self.jscode + "&grant_type=authorization_code" r = requests.get(url) print(r.json()) openid = r.json()['openid'] return openid
3.支付请求
# -*- coding:utf-8 -*- import requests import hashlib import xmltodict import time import random import string import urllib2 import sys class WX_PayToolUtil(): """ 微信支付工具 """ def __init__(self, APP_ID, MCH_ID, API_KEY, NOTIFY_URL): self._APP_ID = APP_ID # 小程序ID self._MCH_ID = MCH_ID # # 商户号 self._API_KEY = API_KEY self._UFDODER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder" # 接口链接 self._NOTIFY_URL = NOTIFY_URL # 异步通知 def generate_sign(self, param): '''生成签名''' stringA = '' ks = sorted(param.keys()) # 参数排序 for k in ks: stringA += (k + '=' + param[k] + '&') # 拼接商户KEY stringSignTemp = stringA + "key=" + self._API_KEY # md5加密,也可以用其他方式 hash_md5 = hashlib.md5(stringSignTemp.encode('utf8')) sign = hash_md5.hexdigest().upper() return sign ''' # python2另外一种实现方法 def generate_sign(self, params): ret = [] for k in sorted(params.keys()): if (k != 'sign') and (k != '') and (params[k] is not None): ret.append('%s=%s' % (k, params[k])) params_str = '&'.join(ret) params_str = '%(params_str)s&key=%(partner_key)s' % {'params_str': params_str, 'partner_key': key} reload(sys) sys.setdefaultencoding('utf8') params_str = hashlib.md5(params_str.encode('utf-8')).hexdigest() sign = params_str.upper() return sign ''' def getPayUrl(self, orderid, openid, goodsPrice, **kwargs): """向微信支付端发出请求,获取url""" key = self._API_KEY nonce_str = ''.join(random.sample(string.letters + string.digits, 30)) # 生成随机字符串,小于32位 params = { 'appid': self._APP_ID, # 小程序ID 'mch_id': self._MCH_ID, # 商户号 'nonce_str': nonce_str, # 随机字符串 "body": '测试订单', # 支付说明 'out_trade_no': orderid, # 生成的订单号 'total_fee': str(goodsPrice), # 标价金额 'spbill_create_ip': "127.0.0.1", # 小程序不能获取客户ip,web用socekt实现 'notify_url': self._NOTIFY_URL, 'trade_type': "JSAPI", # 支付类型 "openid": openid, # 用户id } # 生成签名 params['sign'] = self.generate_sign(params) # python3一种写法 param = {'root': params} xml = xmltodict.unparse(param) response = requests.post(self._UFDODER_URL, data=xml.encode('utf-8'), headers={'Content-Type': 'text/xml'}) # xml 2 dict msg = response.text xmlmsg = xmltodict.parse(msg) # 4. 获取prepay_id if xmlmsg['xml']['return_code'] == 'SUCCESS': if xmlmsg['xml']['result_code'] == 'SUCCESS': prepay_id = xmlmsg['xml']['prepay_id'] # 时间戳 timeStamp = str(int(time.time())) # 5. 五个参数 data = { "appId": self._APP_ID, "nonceStr": nonce_str, "package": "prepay_id=" + prepay_id, "signType": 'MD5', "timeStamp": timeStamp, } # 6. paySign签名 paySign = self.generate_sign(data) data["paySign"] = paySign # 加入签名 # 7. 传给前端的签名后的参数 return data # python2一种写法 ''' request_xml_str = '<xml>' for key, value in params.items(): if isinstance(value, str): request_xml_str = '%s<%s><![CDATA[%s]]></%s>' % (request_xml_str, key, value, key,) else: request_xml_str = '%s<%s>%s</%s>' % (request_xml_str, key, value, key,) request_xml_str = '%s</xml>' % request_xml_str # 向微信支付发出请求,并提取回传数据 res = urllib2.Request(self._UFDODER_URL, data=request_xml_str.encode("utf-8")) res_data = urllib2.urlopen(res) res_read = res_data.read() doc = xmltodict.parse(res_read) return_code = doc['xml']['return_code'] if return_code == "SUCCESS": result_code = doc['xml']['result_code'] if result_code == "SUCCESS": doc = doc['xml'] data = { "appId": self._APP_ID, "nonceStr": nonce_str, "package": "prepay_id=" + doc["prepay_id"], "signType": 'MD5', "timeStamp": str(int(time.time())), } # paySign签名 paySign = self.generate_sign(data) data["paySign"] = paySign # 加入签名 return data else: err_des = doc['xml']['err_code_des'] return err_des else: fail_des = doc['xml']['return_msg'] return fail_des '''
当然你可能会遇到的错误有签名错误,一般的情况是你的appSecret和商户号的API密钥两个弄错了,当然如果不是还有可能是其他问题,解决方案链接 https://www.jb51.net/article/166176.htm 。
其他的支付方式获取用户的ip地址可以通过socket.gethostbyname(socket.gethostname())方法来获取。
4.支付回调
# 统一下单回调处理 import xmltodict from django.http import HttpResponse def payback(request): msg = request.body.decode('utf-8') xmlmsg = xmltodict.parse(msg) return_code = xmlmsg['xml']['return_code'] if return_code == 'FAIL': # 官方发出错误 return HttpResponse("""<xml><return_code><![CDATA[FAIL]]></return_code> <return_msg><![CDATA[Signature_Error]]></return_msg></xml>""", content_type='text/xml', status=200) elif return_code == 'SUCCESS': # 拿到这次支付的订单号 out_trade_no = xmlmsg['xml']['out_trade_no'] # 根据需要处理业务逻辑 return HttpResponse("""<xml><return_code><![CDATA[SUCCESS]]></return_code> <return_msg><![CDATA[OK]]></return_msg></xml>""", content_type='text/xml', status=200)
当然微信回调的参数有很多详细可以参考https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php"htmlcode">
# _oo8oo_ # o8888888o # 88" . "88 # (| -_- |) # 0\ = /0 # ___/'==='\___ # .' \\| |# '. # / \\||| : |||# # / _||||| -:- |||||_ # | | \\\ - #/ | | # | \_| ''\---/'' |_/ | # \ .-\__ '-' __/-. / # ___'. .' /--.--\ '. .'___ # ."" '< '.___\_<|>_/___.' >' "". # | | : `- \`.:`\ _ /`:.`/ -` : | | # \ \ `-. \_ __\ /__ _/ .-` / / # =====`-.____`.___ \_____/ ___.`____.-`===== # `=---=` # # # ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ # #
总结
以上所述是小编给大家介绍的Python实现微信小程序支付功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件! 如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?
更新日志
- 雨林唱片《赏》新曲+精选集SACD版[ISO][2.3G]
- 罗大佑与OK男女合唱团.1995-再会吧!素兰【音乐工厂】【WAV+CUE】
- 草蜢.1993-宝贝对不起(国)【宝丽金】【WAV+CUE】
- 杨培安.2009-抒·情(EP)【擎天娱乐】【WAV+CUE】
- 周慧敏《EndlessDream》[WAV+CUE]
- 彭芳《纯色角3》2007[WAV+CUE]
- 江志丰2008-今生为你[豪记][WAV+CUE]
- 罗大佑1994《恋曲2000》音乐工厂[WAV+CUE][1G]
- 群星《一首歌一个故事》赵英俊某些作品重唱企划[FLAC分轨][1G]
- 群星《网易云英文歌曲播放量TOP100》[MP3][1G]
- 方大同.2024-梦想家TheDreamer【赋音乐】【FLAC分轨】
- 李慧珍.2007-爱死了【华谊兄弟】【WAV+CUE】
- 王大文.2019-国际太空站【环球】【FLAC分轨】
- 群星《2022超好听的十倍音质网络歌曲(163)》U盘音乐[WAV分轨][1.1G]
- 童丽《啼笑姻缘》头版限量编号24K金碟[低速原抓WAV+CUE][1.1G]