python實現微信小程序支付


轉自: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

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM