Avec le développement de l'Internet mobile, WeChat est devenu un élément indispensable dans la vie des gens, et de plus en plus de commerçants choisissent de faire des affaires sur la plateforme WeChat. La mise en œuvre de la fonction de paiement WeChat est très nécessaire pour les commerçants. Cet article explique comment utiliser PHP pour implémenter le paiement JSAPI.
Tout d'abord, nous devons comprendre ce qu'est le paiement JSAPI. JSAPI est une sorte de fonction de paiement du compte officiel WeChat. Il appelle l'interface de paiement WeChat via JS pour effectuer le paiement. L'avantage du paiement JSAPI est que les utilisateurs n'ont qu'à payer dans WeChat sans accéder à d'autres pages, ce qui est plus pratique.
Ensuite, nous devons faire quelques préparatifs :
Après avoir terminé les préparatifs ci-dessus, nous devons télécharger le SDK PHP de l'API de paiement unifié WeChat. Vous pouvez rechercher "wechatpay-GuzzleHttp" sur GitHub, et après le téléchargement, placez-le. dans le répertoire racine du projet.
Ensuite, nous devons écrire du code PHP pour implémenter le paiement JSAPI. Tout d'abord, vous devez introduire le fichier :
require_once 'wechatpay-GuzzleHttp/autoload.php'; use WeChatPayGuzzleMiddlewareUtilPemUtil; use WeChatPayGuzzleMiddlewareWeChatPayMiddleware; use GuzzleHttpClient; use GuzzleHttpHandlerStack;
Ensuite, vous devez définir les paramètres pertinents et créer l'objet GuzzleHttpClient :
// 设置相关参数 $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]);
Dans le code ci-dessus, nous utilisons une bibliothèque PHP tierce "wechatpay-GuzzleHttp", qui encapsule l'API de paiement WeChat, via un middleware, implémente le traitement des demandes et des réponses.
Ensuite, nous devons écrire du code pour obtenir l'openid de l'utilisateur :
// 获取用户的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'];
Dans le code ci-dessus, nous obtenons le access_token et l'openid de l'utilisateur via l'autorisation OAuth2.0, et le processus de paiement ultérieur doit utiliser openid.
Enfin, nous devons écrire le code de paiement JSAPI :
// 支付 $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)); }
Dans le code ci-dessus, nous utilisons la fonction "chooseWXPay" dans WeChat JS-SDK pour implémenter la fonction de paiement. Plus précisément, nous obtenons l'ID de session de transaction de prépaiement (prepay_id) en appelant l'API de commande unifiée WeChat Pay, puis transmettons les paramètres jsapi générés dans la fonction ChooseWXPay pour appeler l'interface de paiement WeChat pour le paiement.
À ce stade, nous avons mis en œuvre avec succès le paiement JSAPI. Pour résumer, vous devez suivre les étapes suivantes pour mettre en œuvre le paiement JSAPI :
J'espère que l'introduction de cet article pourra aider les développeurs PHP à implémenter rapidement la fonction de paiement JSAPI.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!