Heim >WeChat-Applet >Mini-Programmentwicklung >PHP: WeChat Mini-Programm WeChat Payment Server-Integrationsbeispiel Detaillierte Erklärung

PHP: WeChat Mini-Programm WeChat Payment Server-Integrationsbeispiel Detaillierte Erklärung

高洛峰
高洛峰Original
2017-01-10 09:49:412464Durchsuche

WeChat-Miniprogramm WeChat-Zahlungsserver-Set

Theoretisch kann die gesamte Arbeit zur Integration der WeChat-Zahlung auf der Seite des Miniprogramms erledigt werden, da das Miniprogramm js die Möglichkeit hat, auf das Netzwerk zuzugreifen, aber um der Sache willen Aus Sicherheitsgründen werden vertrauliche Schlüssel nicht offengelegt, und Sie können die offizielle vorgefertigte PHP-Demo verwenden, um mehr Aufwand zu sparen. Sie vervollständigen also die Signatur und initiieren die Anforderung auf der Serverseite, und das Applet stellt nur eine Verbindung zu einem wx.requestPayment her ( OBJECT)-Schnittstelle.

Der gesamte Integrationsprozess ähnelt JSAPI und APP. Geben Sie zunächst eine Bestellung auf einheitliche Weise auf und fordern Sie dann die Zahlung anhand der zurückgegebenen Ergebnisse an.

Insgesamt drei Schritte:

1. Das Applet tauscht den von wx.login zurückgegebenen Code gegen openid aus. 2. Der Server gibt eine Bestellung an WeChat auf. 3. Das Applet leitet die Zahlung ein.

Bereiten Sie diese Dinge im Voraus vor:

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

PHP SDK, der Download-Link befindet sich am Ende des Artikels

Der 1. und 4. Punkt sind wann Beantragung des Miniprogramms Der 2. und 3. Artikel wurden bei der Beantragung der WeChat-Zahlung erhalten. Beachten Sie, dass der 3. und 4. Artikel ähnlich aussehen, es sich jedoch tatsächlich um zwei Dinge handelt, die zu einer fehlgeschlagenen Signatur führen.

Eine Bestellung auf WeChat aufgeben und die prepay_id erhalten

1. Erstellen Sie einen Controller und importieren Sie die Klasse 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() {
  }
}

Sie können Zugriffsanfragen über index.php/wxpay stellen

2. Ändern Sie die Konfigurationsdatei WxPay.Config.php

und ändern Sie sie, um den entsprechenden Schlüssel selbst zu beantragen

3. Implementieren Sie die Indexmethode

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);
  }

Hinweis 1: Der im Dokument erwähnte nonce_str wird nicht übermittelt, sondern vom SDK für uns ausgefüllt

Der Quelle ist WxPay.Api.php Zeile 55

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

Erklärung 2: sign wurde freundlicherweise auch an setSign übergeben. Die Quelle befindet sich in WxPay.Data.php Zeile 111, in 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. Rufen Sie die Anmeldeschnittstelle im Miniprogramm auf, um die OpenID zu erhalten

Stellen Sie eine Anmeldeanfrage an WeChat, holen Sie sich den Code und dann Senden Sie den Code im Austausch gegen 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)
      }
     }
    });

Auf der Konsole können Sie sehen, dass Sie die openID erfolgreich erhalten haben. Sie müssen sie nur noch an den Server weitergeben die Serverseite, $this->input->post('openId ') Wartet auf Abholung.

5. Das Miniprogramm initiiert eine Anfrage an https://lendoo.leanapp.cn/index.php/WXPay, um eine einheitliche Bestellung aufzugeben

//统一下单接口对接
      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;
    },
      });

und erhalten Die folgenden Ergebnisse sind

{
 "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"
}

vorausgesetzt, dass https://lendoo.leanapp.cn bereits in der Whitelist ist:

6. Miniprogramm Rufen Sie die Zahlungs-API auf

// 发起支付
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);
  }
});

um den Simulator zu testen, ein QR-Code wird zum Scannen angezeigt

Der Ergebnis ist ein Fehler:

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

Schlüssel muss zur Signatur hinzugefügt werden! ! ! 'appId='+appId+'&nonceStr='+nonceStr+'&package='+pkg+'&signType=MD5&timeStamp='+timeStamp+"&key=d27551c7803cf16*e536b192d5d03b"Dies ist abgeschlossen.

Aber der Schlüssel wird im Dokument nicht erwähnt

Screenshot der erfolgreichen Zahlung

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

Mehr PHP: WeChat Bitte beachten Sie die chinesische PHP-Website für verwandte Artikel mit detaillierten Erläuterungen zu WeChat-Zahlungsserver-Integrationsbeispielen, Miniprogrammen und Quellcode-Downloads!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn