PHP微信開發:如何實現JSAPI支付

WBOY
發布: 2023-05-13 19:24:01
原創
2525 人瀏覽過

隨著行動互聯網的發展,微信已經成為了人們生活中不可或缺的一部分,越來越多的商家選擇在微信平台上開展業務。實現微信支付功能對商家來說是非常必要的。本文將介紹如何使用PHP實作JSAPI支付。

首先,我們需要了解什麼是JSAPI支付。 JSAPI是微信公眾號支付功能的一種,透過JS呼叫微信支付介面來實現支付。 JSAPI支付的優點在於用戶只需要在微信中進行支付,不需要跳到其他頁面,更方便。

接下來,我們需要進行一些準備工作:

  1. 註冊微信商家平台帳號並完成實名認證
  2. 建立微信公眾號碼並完成公眾號認證
  3. 取得微信支付的應用程式ID(APPID)與商家號碼(MCHID)
  4. #產生APISecret金鑰

完成上述準備工作後,我們需要下載微信統一支付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 = << 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) { // 支付失败调用的函数 } }); });  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付款需要完成以下步驟:

  1. 註冊微信商家平台帳號並完成實名認證
  2. 建立微信公眾號碼並完成公眾號碼認證

########################################取得微信支付的應用程式ID(APPID)與商家號碼(MCHID)######產生APISecret金鑰######下載微信統一支付API的PHP SDK並引入相關文件#######取得使用者的openid######呼叫微信支付統一下單API產生預付交易會話標識(prepay_id)######透過chooseWXPay函數調起微信支付介面##########希望本文的介紹能夠幫助PHP開發人員快速實現JSAPI支付功能。 ###

以上是PHP微信開發:如何實現JSAPI支付的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
最新問題
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!