Maison  >  Article  >  Applet WeChat  >  PHP : Explication détaillée du programme WeChat Mini Explication du serveur de paiement WeChat

PHP : Explication détaillée du programme WeChat Mini Explication du serveur de paiement WeChat

高洛峰
高洛峰original
2017-01-10 09:49:412393parcourir

Ensemble de serveur de paiement WeChat mini programme WeChat

Théoriquement, tout le travail d'intégration du paiement WeChat peut être effectué du côté du mini programme, car le mini programme js a la capacité d'accéder au réseau, mais pour le bien de sécurité, les clés sensibles ne sont pas exposées et vous pouvez utiliser la démo php officielle prête à l'emploi pour économiser plus d'efforts, vous complétez donc la signature et lancez la demande côté serveur, et l'applet se connecte uniquement à un wx.requestPayment ( OBJET).

Le processus d'intégration global est similaire à JSAPI et APP. Passez d'abord une commande de manière unifiée, puis utilisez les résultats renvoyés pour demander le paiement.

Un total de trois étapes :

1. L'applet échange le code renvoyé par wx.login contre openid 2. Le serveur passe une commande à WeChat 3. L'applet initie le paiement

Préparez ces choses à l'avance :

APPID = 'wx426b3015555a46be';
MCHID = '1900009851';
KEY = '8934e7d15453e97507ef794cf7b0519d';
APPSECRET = '7813490da6f1265e4901ffb80afaa36f';

PHP SDK, le lien de téléchargement est à la fin de l'article

Les 1er et 4ème éléments sont quand candidature au mini-programme Les 2ème et 3ème éléments ont été obtenus lors de la demande de paiement WeChat. Notez que les 3ème et 4ème éléments se ressemblent, mais sont en fait deux choses. La confusion des deux entraînera un échec de signature.

Passez une commande sur WeChat et obtenez le prepay_id

1 Créez un contrôleur et importez la classe WxPay.Api.php

<?php
require_once __DIR__ . &#39;/BaseController.php&#39;;
require_once __DIR__ . &#39;/../third_party/wxpay/WxPay.Api.php&#39;;
 
class WXPay extends BaseController {
  function index() {
  }
}

Vous pouvez faire des demandes d'accès via index.php/wxpay

2 Modifier le fichier de configuration WxPay.Config.php

et le modifier pour demander vous-même la clé correspondante

. 3. Implémenter la méthode d'index

function index() {
//     初始化值对象
    $input = new WxPayUnifiedOrder();
//     文档提及的参数规范:商家名称-销售商品类目
    $input->SetBody("灵动商城-手机");
//     订单号应该是由小程序端传给服务端的,在用户下单时即生成,demo中取值是一个生成的时间戳
    $input->SetOut_trade_no(&#39;123123123&#39;);
//     费用应该是由小程序端传给服务端的,在用户下单时告知服务端应付金额,demo中取值是1,即1分钱
    $input->SetTotal_fee("1");
    $input->SetNotify_url("http://paysdk.weixin.qq.com/example/notify.php");
    $input->SetTrade_type("JSAPI");
//     由小程序端传给服务端
    $input->SetOpenid($this->input->post(&#39;openId&#39;));
//     向微信统一下单,并返回order,它是一个array数组
    $order = WxPayApi::unifiedOrder($input);
//     json化返回给小程序端
    header("Content-Type: application/json");
    echo json_encode($order);
  }

Remarque 1 : Le nonce_str mentionné dans le document n'est pas soumis, mais rempli par le sdk pour nous

Le. la source est WxPay.Api.php Ligne 55

$inputObj->SetNonce_str(self::getNonceStr());//随机字符串

Explication 2 : le signe a également été aimablement donné à setSign La source est dans WxPay.Data.php ligne 111, dans MakeSign. ()

/**
  * 生成签名
  * @return 签名,本函数不覆盖sign成员变量,如要设置签名需要调用SetSign方法赋值
  */
 public function MakeSign()
 {
   //签名步骤一:按字典序排序参数
   ksort($this->values);
   $string = $this->ToUrlParams();
   //签名步骤二:在string后加入KEY
   $string = $string . "&key=".WxPayConfig::KEY;
   //签名步骤三:MD5加密
   $string = md5($string);
   //签名步骤四:所有字符转为大写
   $result = strtoupper($string);
   return $result;
 }

4. Appelez l'interface de connexion dans le mini programme pour obtenir l'openid

Faites une demande de connexion à WeChat, obtenez le code, puis soumettez le code en échange d'openId

wx.login({
     success: function(res) {
      if (res.code) {
       //发起网络请求
       wx.request({
        url: &#39;https://api.weixin.qq.com/sns/jscode2session?appid=wx9114b997bd86f***&secret=d27551c7803cf16015e536b192******&js_code=&#39;+res.code+&#39;&grant_type=authorization_code&#39;,
        data: {
         code: res.code
        },
        success: function (response) {
          console.log(response);
        }
       })
      } else {
       console.log(&#39;获取用户登录态失败!&#39; + res.errMsg)
      }
     }
    });

Depuis la console, vous pouvez voir que vous avez obtenu avec succès l'openid. Il ne reste plus qu'à le transmettre au serveur. côté serveur, $this->input->post('openId ') En attente de collecte.

5. Le mini programme lance une demande à https://lendoo.leanapp.cn/index.php/WXPay pour passer une commande unifiée

//统一下单接口对接
      wx.request({
        url: &#39;https://lendoo.leanapp.cn/index.php/WXPay&#39;,
        data: {
          openId: openId
        },
        success: function (response) {
          console.log(response);
 
        },
            header: {
        &#39;content-type&#39;: &#39;application/x-www-form-urlencoded&#39;
    },
      });

et obtenez Les résultats suivants sont

{
 "appid": "wx9114b997bd86f8ed",
 "mch_id": "1414142302",
 "nonce_str": "eEICgYFuGqxFRK6f",
 "prepay_id": "wx201701022235141fc713b8f80137935406",
 "result_code": "SUCCESS",
 "return_code": "SUCCESS",
 "return_msg": "OK",
 "sign": "63E60C8CD90394FB50E612D085F5362C",
 "trade_type": "JSAPI"
}

à condition que https://lendoo.leanapp.cn soit déjà dans la liste blanche :

6. Mini programme Appelez l'API de paiement

// 发起支付
var appId = response.data.appid;
var timeStamp = (Date.parse(new Date()) / 1000).toString();
var pkg = &#39;prepay_id=&#39; + response.data.prepay_id;
var nonceStr = response.data.nonce_str;
var paySign = md5.hex_md5(&#39;appId=&#39;+appId+&#39;&nonceStr=&#39;+nonceStr+&#39;&package=&#39;+pkg+&#39;&signType=MD5&timeStamp=&#39;+timeStamp+"&key=d27551c7803cf16***e536b192d5d03b").toUpperCase();
console.log(paySign);
console.log(appId);
wx.requestPayment({
  &#39;timeStamp&#39;: timeStamp,
  &#39;nonceStr&#39;: nonceStr,
  &#39;package&#39;: pkg,
  &#39;signType&#39;: &#39;MD5&#39;,
  &#39;paySign&#39;: paySign,
  &#39;success&#39;:function(res){
    console.log(&#39;success&#39;);
    console.log(res);
  }
});

pour tester le simulateur, un code QR apparaîtra pour être scanné

Le le résultat est une erreur :

errMsg:"requestPayment:fail"
err_code:2
err_desc:"支付验证签名失败"

la clé doit être ajoutée à la signature ! ! ! 'appId=' appId '&nonceStr=' nonceStr '&package=' pkg '&signType=MD5&timeStamp=' timeStamp "&key=d27551c7803cf16*e536b192d5d03b"Ceci est terminé.

Mais il n'y a aucune mention de clé dans le document

Capture d'écran du paiement réussi

PHP:微信小程序 微信支付服务端集成实例详解及源码下载

Plus PHP : WeChat Veuillez prêter attention au site Web PHP chinois pour des articles connexes sur des exemples détaillés d'intégration de serveur de paiement WeChat pour les mini-programmes et les téléchargements de code source !

Déclaration:
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