ホームページ  >  記事  >  バックエンド開発  >  PHP WeChat 開発: JSAPI 決済の実装方法

PHP WeChat 開発: JSAPI 決済の実装方法

WBOY
WBOYオリジナル
2023-05-13 19:21:202633ブラウズ

モバイル インターネットの発展に伴い、WeChat は人々の生活に欠かせないものとなり、WeChat プラットフォーム上でビジネスを行うことを選択する販売業者がますます増えています。 WeChat決済機能の実装は加盟店にとって非常に必要です。この記事では、PHP を使用して JSAPI 決済を実装する方法を紹介します。

まず、JSAPI 支払いとは何かを理解する必要があります。 JSAPIはWeChat公式アカウントの決済機能の一種で、JSを通じてWeChat決済インターフェースを呼び出して決済を実現します。 JSAPI 支払いの利点は、ユーザーは他のページにジャンプすることなく WeChat 内で支払うだけで済み、より便利であることです。

次に、いくつかの準備をする必要があります。

  1. WeChat マーチャント プラットフォーム アカウントを登録し、実名認証を完了します
  2. WeChat 公式アカウントを作成し、公式認証を完了しますアカウント認証
  3. WeChat 決済のアプリケーション ID (APPID) と加盟店番号 (MCHID) の取得
  4. API シークレット キーの生成

上記の準備が完了したら、 WeChat Unification をダウンロードするには 決済 API の PHP SDK については、GitHub で「wechatpay-GuzzleHttp」を検索し、ダウンロードしてプロジェクトのルート ディレクトリに置きます。

次に、JSAPI 支払いを実装するための PHP コードを記述する必要があります。まず、ファイルを導入する必要があります:

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」。WeChat 決済 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));
}

上記のコードでは、WeChat JS-SDK の「chooseWXPay」関数を使用して支払い関数を実装します。具体的には、WeChat Pay 統合注文 API を呼び出して前払いトランザクション セッション ID (prepay_id) を取得し、生成された jsapi パラメーターをchooseWXPay 関数に渡して、支払いのために WeChat 支払いインターフェイスを呼び出します。

これまでのところ、JSAPI 支払いは正常に実装されています。要約すると、JSAPI 支払いを実装するには、次の手順を完了する必要があります。

  1. WeChat マーチャント プラットフォーム アカウントを登録し、実名認証を完了する
  2. WeChat 公式アカウントを作成し、公式認証を完了するアカウント認証
  3. WeChat決済のアプリケーションID(APPID)と加盟店番号(MCHID)を取得
  4. APIシークレットキーを生成
  5. WeChat統合決済APIのPHP SDKをダウンロードして導入関連ファイル
  6. ユーザーの openid を取得します
  7. WeChat 支払い統合注文 API を呼び出して前払いトランザクション セッション ID (prepay_id) を生成します
  8. chooseWXPay を介して WeChat 支払いインターフェイスを呼び出しますfunction

この記事が、PHP 開発者が JSAPI 支払い関数を迅速に実装するのに役立つことを願っています。

以上がPHP WeChat 開発: JSAPI 決済の実装方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。