python réaliser applet de paiement micro-canal

Transfert: https://www.cnblogs.com/zzqit/p/9952302.html#_label3

Avant d'écrire la fonction, le dos et l'examiner, faire une note de

Vous voulez réaliser cette fonction, l'applet côté micro canal est:

wx.requestPayment ( 
            { 
              ' timeStamp ' : res.data.data [ " timeStamp " ],
               ' nonceStr ' : res.data.data [ " nonceStr " ],
               ' package ' : res.data.data [ " paquet " ],
               ' signType ' : ' MD5 ' ,
               ' paySign ' : res.data.data [ " paySign " ],
              " succès' : Function (res) {
                 si (res.errMsg == " requestPayment: ok " ) { 
                  wx.showToast ({ 
                    title: ' 支付成功' 
                    icône: ' succès ' 
                    durée: 1000 
                  }) 
                } 
              }, ' échec ' : fonction (res) { 
              }, ' complète ' : function (res) { 
              } 
            })
              
              

Avant d'appeler wx.requestPayment façon de le faire, nous devons préparer les données à res.data.data fournies, qui est, backstage pass sur les données

Contexte générer ces données ne nécessite qu'un petit programme utilisateur fournit Openid sur elle

Arrière-plan généré des données de code:

wechat_pay DEF (): 
    goods_price . = request.args GET ( "prix " ) 
    Openid . = g.current_user GET ( " openid " ) 
    AppID = " " # applet appid, applets - développement - paramètres de développement où trouver 
    mch_id = " « payer le numéro de marchand # micro-canal, pay micro-canal | plateforme marchand - Centre des comptes - des informations commerciales où trouver 
    api_key = » « touches #api, pay micro-canal | plateforme marchand - compte de la sécurité Centre -API dans la recherche 
    notify_url = » « # rappel succès de paiement chemin 
    OrderID = datetime.datetime.now (). la strftime ( ' % m% D le% Y H% m% S% ' =) Nombre de temps pour le numéro de commande
    infosWX_PayToolUtil (AppID, mch_id, api_key, notify_url) 
    données = info.getPayUrl (orderid, Openid, goods_price)
     retour json_response ( 0 , data = données)
Procédé WX_PayToolUtil:
# Codage = UTF- 8 
Importation Demande d' 
importation hashlib 
importation xmltodict 
importation Temps d' 
importation aléatoire 
Importation chaîne 
de hasard Importation aléatoire 


classe WX_PayToolUtil ():
  " "" instruments de paiement microcanaux " "" 
 DEF __init __ (Self APP_ID MCH_ID, api_key, notify_url): 
  self._APP_ID = APP_ID # applet ID 
  self._MCH_ID = MCH_ID # # numéro d' entreprise 
  self._API_KEY = clés marchands api_key n 
  self._UFDODER_URL = " https://api.mch.weixin.qq.com/pay/unifiedorder " # Interface lien 
  self._NOTIFY_URL= Notify_url # notification asynchrone 


 DEF generate_sign (Self, param): 
   '' ' pour générer une signature ' '' 
   stringUn = '' 
   KS = le trié (param.keys ()) les valeurs des paramètres # clés sont triés
    pour K dans KS: 
    stringUn + = (K + ' = ' + param [K] + ' & ' ) 
   # marchand d'épissure KEY 
   stringSignTemp = stringUn + " Key = " + self._API_KEY 
   # cryptage MD5, peut également être utilisé dans d' autres façons 
   hash_md5 = hashlib.md5 (stringSignTemp.encode ( ' UTF8 '))
   Signe = . Hash_md5.hexdigest () supérieur ()
    retour signe 


 DEF random_str (Self): 
  "" "
   générer une chaîne aléatoire 
  : param randomlength: longueur de la chaîne 
  : retour :
   " ""
   DOD = '' 
  caractères = ' AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz0123456789 ' 
  longueur = (len caractères) - 1. 
  aléatoire = le Random ()
   pour I dans Range ( 0 , 30 ): 
   DOD + = caractères [la random.randint ( 0 , longueur)]
   retour DOD


 getPayUrl DEF (auto, OrderID, OpenID, goodsPrice, ** kwargs):
   "" " envoie une demande au terminal de paiement micro-canal, acquiert URL " "" 
  Key = self._API_KEY 
  nonce_str = self.random_str () # génère une chaîne aléatoire, est inférieure à 32
   params = {
    ' AppID ' : self._APP_ID, # applet ID
    ' mch_id ' : self._MCH_ID, numéro de marchand #
    ' nonce_str ' : nonce_str, string # aléatoire
    " corps " : ' Learning Card ' , # paiement
    ' out_trade_no ': ORDERID, # produit Numéro de commande
   ' Total_fee ' : str (goodsPrice), # montant de l' enchère
    ' de spbill_create_ip ' : " " , # IP du terminal, votre serveur IP
    ' notify_url ' : self._NOTIFY_URL,
    ' trade_type ' : " JSAPI " , # type de paiement
    " OpenId " : Openid , l' utilisateur ID # 
   } 
  # génère la signature 
  des params [ ' signe ' ] = self.generate_sign ( les params ) 
  param = { ' la racine ' : }params 
  xml = xmltodict.unparse (param) 
  réponse = requests.post (self._UFDODER_URL, data = xml.encode ( ' utf-8 ' ), les en- têtes = { ' Content-Type ' : ' text / xml ' }) 
  # xml 2 dict 
  msg = response.text 
  xmlmsg = xmltodict.parse (msg) 
  # 4 . 获取prepay_id
   si xmlmsg [ ' xml ' ] [ ' code_retour ' ] == ' SUCCES ' :
    prepay_id = xmlmsg [ ' xml ' ] [ ' prepay_id ' ] 
    #时间戳
    timeStamp = str ( int (time.time ())) 
    # 5 . 五个Liste de paramètres 
    données = {
      " appId " : self._APP_ID,
      " nonceStr " : nonce_str,
      " paquet " : " prepay_id = " + prepay_id,
      " signType " : ' MD5 ' ,
     " : TimeStamp, 
    } 
    # . 6 . Signature PaySign 
    paySign = self.generate_sign (données) de 
    données [ " paySign " ] = paySign signatures ajoutées # 
    # 7 après les paramètres passés à l'avant d'une signature.
     Retour de données

Les données générées en réponse à l'applet peut alors appeler le début de wx.requestPayment

Ne pas oublier d'appeler avant l'entreprise associée micro-canal micro-canal à un petit nombre, applets plate-forme publique micro lettre à payer le numéro de marchand associé

documentation de développement microcanal, spécifique sur le terrain signifie aller à l' intérieur pour trouver: https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=9_1

 

 

 

 

Je suppose que tu aimes

Origine www.cnblogs.com/Strangers/p/12606969.html
conseillé
Classement