隨著行動互聯網的發展,微信已經成為了人們生活中不可或缺的一部分,越來越多的商家選擇在微信平台上開展業務。實現微信支付功能對商家來說是非常必要的。本文將介紹如何使用PHP實作JSAPI支付。
首先,我們需要了解什麼是JSAPI支付。 JSAPI是微信公眾號支付功能的一種,透過JS呼叫微信支付介面來實現支付。 JSAPI支付的優點在於用戶只需要在微信中進行支付,不需要跳到其他頁面,更方便。
接下來,我們需要進行一些準備工作:
完成上述準備工作後,我們需要下載微信統一支付API的PHP SDK,可以在GitHub上搜尋“wechatpay-GuzzleHttp”,下載後將其放到專案的根目錄。
接下來,我們需要寫PHP程式碼實作JSAPI支付。首先,需要引入檔案:
require_once 'wechatpay-GuzzleHttp/autoload.php'; use WeChatPayGuzzleMiddlewareUtilPemUtil; use WeChatPayGuzzleMiddlewareWeChatPayMiddleware; use GuzzleHttpClient; use GuzzleHttpHandlerStack;
然後,需要設定相關參數並建立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]);
在上述程式碼中,我們使用了一個第三方PHP函式庫“wechatpay-GuzzleHttp”,它封裝了微信支付API,透過中間件實現請求與回應的處理。
然後,我們需要寫程式碼來取得使用者的openid:
// 获取用户的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'];
在上述程式碼中,我們透過OAuth2.0授權取得到使用者的access_token和openid,後續的付款流程需要使用到openid。
最後,我們需要寫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)); }
在上述程式碼中,我們使用了微信JS-SDK中的「chooseWXPay」函數來實現支付功能。具體來說,我們透過呼叫微信支付統一下單API獲得預付交易會話標識(prepay_id),然後將產生的jsapi參數傳入chooseWXPay函數,調起微信支付介面進行支付。
至此,我們已經成功實現了JSAPI支付。總結一下,實現JSAPI付款需要完成以下步驟:
以上是PHP微信開發:如何實現JSAPI支付的詳細內容。更多資訊請關注PHP中文網其他相關文章!