首頁  >  文章  >  後端開發  >  PHP微信開發:如何實現JSAPI支付

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

WBOY
WBOY原創
2023-05-13 19:21:202610瀏覽

隨著行動互聯網的發展,微信已經成為了人們生活中不可或缺的一部分,越來越多的商家選擇在微信平台上開展業務。實現微信支付功能對商家來說是非常必要的。本文將介紹如何使用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 = <<<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付款需要完成以下步驟:

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

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

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

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn