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:
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:
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!