Heim  >  Artikel  >  Backend-Entwicklung  >  PHP WeChat-Entwicklung: So implementieren Sie die JSAPI-Zahlung

PHP WeChat-Entwicklung: So implementieren Sie die JSAPI-Zahlung

WBOY
WBOYOriginal
2023-05-13 19:21:202610Durchsuche

Mit der Entwicklung des mobilen Internets ist WeChat zu einem unverzichtbaren Bestandteil des Lebens der Menschen geworden und immer mehr Händler entscheiden sich dafür, ihre Geschäfte über die WeChat-Plattform abzuwickeln. Die Implementierung der WeChat-Zahlungsfunktion ist für Händler sehr wichtig. In diesem Artikel wird erläutert, wie Sie PHP zur Implementierung der JSAPI-Zahlung verwenden.

Zuerst müssen wir verstehen, was eine JSAPI-Zahlung ist. JSAPI ist eine Art Zahlungsfunktion des offiziellen WeChat-Kontos. Es ruft die WeChat-Zahlungsschnittstelle über JS auf, um die Zahlung zu realisieren. Der Vorteil der JSAPI-Zahlung besteht darin, dass Benutzer nur in WeChat bezahlen müssen, ohne zu anderen Seiten springen zu müssen, was bequemer ist.

Als nächstes müssen wir einige Vorbereitungen treffen:

  1. Registrieren Sie ein WeChat-Händlerplattform-Konto und führen Sie die Authentifizierung mit echtem Namen durch.
  2. Erstellen Sie ein offizielles WeChat-Konto und führen Sie die offizielle Kontoauthentifizierung durch.
  3. Besorgen Sie sich die WeChat-Zahlungsanwendungs-ID (APPID) und Händlernummer (MCHID)
  4. API-Geheimschlüssel generieren

Nach Abschluss der oben genannten Vorbereitungen müssen wir das PHP SDK der WeChat Unified Payment API herunterladen. Sie können auf GitHub nach „wechatpay-GuzzleHttp“ suchen und es nach dem Herunterladen platzieren im Stammverzeichnis des Projekts.

Als nächstes müssen wir PHP-Code schreiben, um die JSAPI-Zahlung zu implementieren. Zuerst müssen Sie die Datei einführen:

require_once 'wechatpay-GuzzleHttp/autoload.php';
use WeChatPayGuzzleMiddlewareUtilPemUtil;
use WeChatPayGuzzleMiddlewareWeChatPayMiddleware;
use GuzzleHttpClient;
use GuzzleHttpHandlerStack;

Dann müssen Sie die relevanten Parameter festlegen und das GuzzleHttpClient-Objekt erstellen:

// 设置相关参数
$appid = "xxxxxxxxx"; // 微信支付的应用ID(APPID)
$mchid = "xxxxxxxxx"; // 商户号(MCHID)
$apiKey = "xxxxxxxxx"; // APISecret密钥
$notifyUrl = "http://example.com/notify.php"; // 异步通知URL

// 创建GuzzleHttpClient对象
$stack = HandlerStack::create();
$privateKey = PemUtil::loadPrivateKey('file://path/to/your/key.pem'); // 加载私钥文件
$wechatpayMiddleware = WeChatPayMiddleware::builder()
    ->withMerchant($appid, $mchid, $apiKey)
    ->withNotifyUrl($notifyUrl)
    ->withKey($privateKey)   
    ->build();
$stack->push($wechatpayMiddleware, 'wechatpay');
$client = new Client(['handler' => $stack, 'verify' => false]);

Im obigen Code verwenden wir eine PHP-Bibliothek eines Drittanbieters „wechatpay-GuzzleHttp“, die kapselt die WeChat-Zahlungs-API und implementiert über Middleware die Anforderungs- und Antwortverarbeitung.

Dann müssen wir Code schreiben, um die OpenID des Benutzers zu erhalten:

// 获取用户的openid
$code = $_GET['code']; // 通过微信OAuth2.0授权获取的code
$accessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid={$appid}&secret={$secret}&code={$code}&grant_type=authorization_code";
$accessTokenResponse = $client->get($accessTokenUrl);
$accessTokenBody = $accessTokenResponse->getBody()->getContents();
$accessToken = json_decode($accessTokenBody, true)['access_token'];
$openid = json_decode($accessTokenBody, true)['openid'];

Im obigen Code erhalten wir das Access_token und die OpenID des Benutzers über die OAuth2.0-Autorisierung, und der anschließende Zahlungsprozess muss OpenID verwenden.

Schließlich müssen wir den JSAPI-Zahlungscode schreiben:

// 支付
$request = $client->request('POST', 'https://api.mch.weixin.qq.com/pay/unifiedorder', [
    'xml' => [
        'body' => '商品描述',
        'out_trade_no' => '商户订单号',
        'fee_type' => 'CNY',
        'total_fee' => '1',
        'spbill_create_ip' => $_SERVER['REMOTE_ADDR'],
        'notify_url' => $notifyUrl,
        'trade_type' => 'JSAPI',
        'openid' => $openid,
        'sign_type' => 'MD5',
        'nonce_str' => uniqid(),
        'appid' => $appid,
        'mch_id' => $mchid,
    ],
]);
$response = $request->getBody()->getContents();
$xml = simplexml_load_string($response, 'SimpleXMLElement', LIBXML_NOCDATA);
$resultCode = json_decode(json_encode($xml), true)['result_code'];
if ($resultCode == 'SUCCESS') {
    $prepayId = json_decode(json_encode($xml), true)['prepay_id'];
    $jsapiConfig = [
        'appId' => $appid,
        'timestamp' => time(),
        'nonceStr' => uniqid(),
        'package' => "prepay_id={$prepayId}",
        'signType' => 'MD5',
    ];
    $jsapiConfig['paySign'] = sign($jsapiConfig, $apiKey); // 生成签名
    $jsapiConfig['debug'] = true; // 开启调试模式
    $jsapiConfigJson = json_encode($jsapiConfig);
    $jsapi = <<<EOF
<script>
wx.config({}); // 微信JS-SDK配置
wx.ready(function() {
    wx.chooseWXPay({
        timestamp: '{$jsapiConfig['timestamp']}',
        nonceStr: '{$jsapiConfig['nonceStr']}',
        package: '{$jsapiConfig['package']}',
        signType: '{$jsapiConfig['signType']}',
        paySign: '{$jsapiConfig['paySign']}',
        success: function(res) {
            // 支付成功调用的函数
        },
        fail: function(res) {
            // 支付失败调用的函数
        }
    });
});
</script>
EOF;
echo $jsapi; // 输出JSAPI支付代码
}

// 生成签名
function sign($data, $apiKey)
{
    ksort($data);
    $query = urldecode(http_build_query($data) . "&key={$apiKey}");
    return strtoupper(md5($query));
}

Im obigen Code verwenden wir die Funktion „chooseWXPay“ im WeChat JS-SDK, um die Zahlungsfunktion zu implementieren. Konkret erhalten wir die Sitzungs-ID der Vorauszahlungstransaktion (prepay_id), indem wir die einheitliche Bestell-API von WeChat Pay aufrufen und dann die generierten JSAPI-Parameter an die Funktion ChooseWXPay übergeben, um die WeChat-Zahlungsschnittstelle zur Zahlung aufzurufen.

Zu diesem Zeitpunkt haben wir die JSAPI-Zahlung erfolgreich implementiert. Zusammenfassend müssen Sie die folgenden Schritte ausführen, um die JSAPI-Zahlung zu implementieren:

  1. Registrieren Sie ein WeChat-Händlerplattformkonto und führen Sie die Authentifizierung mit echtem Namen durch.
  2. Erstellen Sie ein offizielles WeChat-Konto und führen Sie die offizielle Kontoauthentifizierung durch.
  3. Besorgen Sie sich die Anwendungs-ID (APPID). ) und Händlernummer (MCHID) der WeChat-Zahlung)
  4. API-Geheimschlüssel generieren
  5. Laden Sie das PHP SDK der WeChat Unified Payment API herunter und führen Sie zugehörige Dateien ein
  6. Erhalten Sie die OpenID des Benutzers
  7. Rufen Sie die WeChat Pay Unified Order API auf, um eine Vorauszahlungstransaktionssitzung zu generieren ID (prepay_id)
  8. Über die Funktion „selectWXPay“ die WeChat-Zahlungsschnittstelle aufrufen

Ich hoffe, dass die Einführung in diesem Artikel PHP-Entwicklern dabei helfen kann, die JSAPI-Zahlungsfunktion schnell zu implementieren.

Das obige ist der detaillierte Inhalt vonPHP WeChat-Entwicklung: So implementieren Sie die JSAPI-Zahlung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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