轉自:https://www.cnblogs.com/zzqit/p/9952302.html#_label3
之前寫的功能,回頭復習一下,做個筆記
想實現這個功能,微信小程序端方法是:
wx.requestPayment( { 'timeStamp': res.data.data["timeStamp"], 'nonceStr': res.data.data["nonceStr"], 'package': res.data.data["package"], 'signType': 'MD5', 'paySign': res.data.data["paySign"], 'success': function (res) { if (res.errMsg == "requestPayment:ok") { wx.showToast({ title: '支付成功', icon: 'success', duration: 1000 }) } }, 'fail': function (res) { }, 'complete': function (res) { } })
在調用wx.requestPayment方法之前呢,我們需要准備res.data.data里提供的數據,也就是后台傳過來的數據
后台生成這些數據只需要小程序提供用戶的openid就可以了
后台生成數據的代碼:
def wechat_pay(): goods_price = request.args.get("price") openid = g.current_user.get("openId") appid = "" #小程序appid,小程序-開發-開發設置里找 mch_id = "" #微信支付商戶號,微信支付|商戶平台-賬戶中心-商戶信息里找 api_key = "" #API秘鑰,微信支付|商戶平台-賬戶中心-API安全里找 notify_url = "" #支付成功回調路徑 orderid = datetime.datetime.now().strftime('%Y%m%d%H%M%S') #已時間為訂單號 info = WX_PayToolUtil(appid, mch_id, api_key, notify_url) data = info.getPayUrl(orderid, openid, goods_price) return json_response(0, data=data)
WX_PayToolUtil方法:
# coding=utf-8 import requests import hashlib import xmltodict import time import random import string from random import Random 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 def random_str(self): """ 生成隨機字符串 :param randomlength: 字符串長度 :return: """ strs = '' chars = 'AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789' length = len(chars) - 1 random = Random() for i in range(0, 30): strs += chars[random.randint(0, length)] return strs def getPayUrl(self, orderid, openid, goodsPrice, **kwargs): """向微信支付端發出請求,獲取url""" key = self._API_KEY nonce_str = self.random_str()# 生成隨機字符串,小於32位 params = { 'appid': self._APP_ID, # 小程序ID 'mch_id': self._MCH_ID, # 商戶號 'nonce_str': nonce_str, # 隨機字符串 "body": 'learning card', # 支付說明 'out_trade_no': orderid, # 生成的訂單號 'total_fee': str(goodsPrice), # 標價金額 'spbill_create_ip': "", # 終端IP,你服務器IP 'notify_url': self._NOTIFY_URL, 'trade_type': "JSAPI", # 支付類型 "openid": openid, # 用戶id } # 生成簽名 params['sign'] = self.generate_sign(params) 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': 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
將生成的數據響應給小程序再調用開頭的wx.requestPayment即可
調用前別忘了把微信商戶號關聯到微信小程序,小程序公眾平台微信支付中關聯商戶號
微信開發文檔,字段的具體含義去里面找:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1