Maison > Applet WeChat > Développement de mini-programmes > Programme WeChat Mini : Processus de piège des paiements WeChat

Programme WeChat Mini : Processus de piège des paiements WeChat

高洛峰
Libérer: 2017-03-01 10:58:47
original
2430 Les gens l'ont consulté

Jetons d'abord un coup d'œil aux étapes de développement du mini programme

Programme WeChat Mini : Processus de piège des paiements WeChat

wx.login appelle l'interface pour obtenir les informations de connexion (code)

code est échangé contre l'identifiant unique de l'utilisateur (openid)

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

Programme WeChat Mini : Processus de piège des paiements WeChat

Passer une commande unifiée

Adresse URL : https://api.mch.weixin.qq.com/pay/unifiedorder

post

Le paramètre est XML

wx.requestPayment for payment

Programme WeChat Mini : Processus de piège des paiements WeChat

Chaikeng

Signature Cryptage MD5, certains algorithmes sur Internet ont tort, vous avez toujours besoin du MD5 en ligne après l'avoir écrit vous-même. Outil de cryptage pour vérification (j'ai passé tout l'après-midi à essayer de savoir si ce que j'ai écrit est correct, mais il ne peut tout simplement pas sortir. La raison est que l'outil MD5 est utilisé incorrectement, ce qui est une arnaque - -)

Notes sur les règles de signature (obligatoire)

◆ Les codes ASCII des noms de paramètres sont triés du plus petit au plus grand (ordre lexicographique) ;

◆ Si la valeur du paramètre est vide, elle ne participera pas à la signature

◆ Les noms des paramètres sont sensibles à la taille Écrire

◆ Lorsque l'appel de vérification revient ou WeChat notifie activement la signature, le paramètre de signe transmis ne participe pas à la signature et la signature générée est vérifiée par rapport à la valeur du signe.

◆ L'interface WeChat peut ajouter des champs, et les champs étendus ajoutés doivent être pris en charge lors de la vérification des signatures

Unifier l'appid de signature de commande, wx.requestPayment signature appId (le cas doit être distingué, vraiment difficile à trouver) Aveugle mes yeux de chien en alliage de titane - - )

Le paramètre package dans wx.requestPayment doit être package:"prepay_id=wx21************* *", sinon, un appel aura lieu. Le paiement JSAPI manque de points appid/total_fee

total_fee et est int

pour générer des nombres aléatoires et des horodatages. Assurez-vous de vous assurer que la signature est cohérente avec les paramètres de téléchargement dans le cas

. . N'oubliez pas de noter que

Applet WeChat trade_type=JSAPI, le paramètre openid doit être transmis

wx.requestPayment génère une signature avec appId, mais il n'y a pas d'appId lors de la demande

D'accord, voici le code (le code est très original et non encapsulé)

/* 微信支付 */
  wxpay: function () {
    var that = this
    //登陆获取code
    wx.login({
      success: function (res) {
        console.log(res.code)
        //获取openid
        that.getOpenId(res.code)
      }
    });
  },

  /* 获取openId */
  getOpenId: function (code) {
    var that = this
    wx.request({
      url: "https://api.weixin.qq.com/sns/jscode2session?appid=wxbd5a8270399d41d9&secret=d8aac26a5a9c16266d1a23851ebb7d9b&js_code=" + code + "&grant_type=authorization_code",
      method: 'GET',
      success: function (res) {
        //统一支付签名
        var appid = '';//appid  
        var body = '';//商户名
        var mch_id = '';//商户号  
        var nonce_str = that.randomString;//随机字符串,不长于32位。  
        var notify_url = '';//通知地址
        var spbill_create_ip = '';//ip
        // var total_fee = parseInt(that.data.wxPayMoney) * 100;
        var total_fee = 100;
        var trade_type = "JSAPI";
        var key = '';
        var unifiedPayment = 'appid=' + appid + '&body=' + body + '&mch_id=' + mch_id + '&nonce_str=' + nonce_str + '¬ify_url=' + notify_url + '&openid=' + res.data.openid + '&out_trade_no=' + that.data.paySn + '&spbill_create_ip=' + spbill_create_ip + '&total_fee=' + total_fee + '&trade_type=' + trade_type + '&key=' + key
        var sign = MD5.MD5(unifiedPayment).toUpperCase()
        console.log(sign)

        //封装统一支付xml参数
        var formData = ""
        formData += "" + appid + ""
        formData += "" + body + ""
        formData += "" + mch_id + ""
        formData += "" + nonce_str + ""
        formData += "" + notify_url + ""
        formData += "" + res.data.openid + ""
        formData += "" + that.data.paySn + ""
        formData += "" + spbill_create_ip + ""
        formData += "" + total_fee + ""
        formData += "[tr]" + trade_type + ""
        formData += "" + sign + ""
        formData += ""

        //统一支付
        wx.request({
          url: 'https://api.mch.weixin.qq.com/pay/unifiedorder',
          method: 'POST',
          head: 'application/x-www-form-urlencoded',
          data: formData, // 设置请求的 header
          success: function (res) {
            console.log(res.data)
          
            var result_code = that.getXMLNodeValue('result_code', res.data.toString("utf-8"))
            var resultCode = result_code.split('[')[2].split(']')[0]
            if (resultCode == 'FAIL') {
              var err_code_des = that.getXMLNodeValue('err_code_des', res.data.toString("utf-8"))
              var errDes = err_code_des.split('[')[2].split(']')[0]
              wx.navigateBack({
                delta: 1, // 回退前 delta(默认为1) 页面
                success: function (res) {
                  wx.showToast({
                    title: errDes,
                    icon: 'success',
                    duration: 2000
                  })
                },

              })
            } else {

              //发起支付
              var prepay_id = that.getXMLNodeValue('prepay_id', res.data.toString("utf-8"))
              var tmp = prepay_id.split('[')
              var tmp1 = tmp[2].split(']')
              //签名  
              var key = '';
              var appId = '';
              var timeStamp = that.createTimeStamp();
              var nonceStr = that.randomString();
              var stringSignTemp = "appId=&nonceStr=" + nonceStr + "&package=prepay_id=" + tmp1[0] + "&signType=MD5&timeStamp=" + timeStamp + "&key="
              var sign = MD5.MD5(stringSignTemp).toUpperCase()
              console.log(sign)
              var param = { "timeStamp": timeStamp, "package": 'prepay_id=' + tmp1[0], "paySign": sign, "signType": "MD5", "nonceStr": nonceStr }
              that.pay(param)
            }



          },

        })
      },
      fail: function () {
        // fail
      },
      complete: function () {
        // complete
      }
    })
  },
  /* 随机数 */
  randomString: function () {
    var chars = 'ABCDEFGHJKMNPQRSTWXYZabcdefhijkmnprstwxyz2345678';    /****默认去掉了容易混淆的字符oOLl,9gq,Vv,Uu,I1****/
    var maxPos = chars.length;
    var pwd = '';
    for (var i = 0; i < 32; i++) {
      pwd += chars.charAt(Math.floor(Math.random() * maxPos));
    }
    return pwd;
  },
  /* 获取prepay_id */
  getXMLNodeValue: function (node_name, xml) {
    var tmp = xml.split("<" + node_name + ">")
    var _tmp = tmp[1].split("")
    return _tmp[0]
  },

  /* 时间戳产生函数   */
  createTimeStamp: function () {
    return parseInt(new Date().getTime() / 1000) + &#39;&#39;
  },
  /* 支付   */
  pay: function (param) {
    wx.requestPayment({
      timeStamp: param.timeStamp,
      nonceStr: param.nonceStr,
      package: param.package,
      signType: param.signType,
      paySign: param.paySign,
      success: function (res) {
        // success
        console.log(res)
        wx.navigateBack({
          delta: 1, // 回退前 delta(默认为1) 页面
          success: function (res) {
            wx.showToast({
              title: &#39;支付成功&#39;,
              icon: &#39;success&#39;,
              duration: 2000
            })
          },
          fail: function () {
            // fail
          },
          complete: function () {
            // complete
          }
        })
      },
      fail: function () {
        // fail
        console.log("支付失败")
      },
      complete: function () {
        // complete
        console.log("pay complete")
      }
    })
  }
Copier après la connexion

Pour plus de mini-programmes WeChat : articles liés au processus de piège de paiement WeChat, veuillez faire attention au PHP Site chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal