Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Pembangunan PHP WeChat: Bagaimana untuk melaksanakan pembayaran JSAPI

Pembangunan PHP WeChat: Bagaimana untuk melaksanakan pembayaran JSAPI

WBOY
WBOYasal
2023-05-13 19:21:202633semak imbas

Dengan pembangunan Internet mudah alih, WeChat telah menjadi bahagian yang amat diperlukan dalam kehidupan orang ramai, dan semakin ramai peniaga memilih untuk menjalankan perniagaan di platform WeChat. Melaksanakan fungsi pembayaran WeChat sangat diperlukan untuk peniaga. Artikel ini akan memperkenalkan cara menggunakan PHP untuk melaksanakan pembayaran JSAPI.

Pertama sekali, kita perlu faham apa itu pembayaran JSAPI. JSAPI ialah sejenis fungsi pembayaran akaun rasmi WeChat Ia memanggil antara muka pembayaran WeChat melalui JS untuk merealisasikan pembayaran. Kelebihan pembayaran JSAPI ialah pengguna hanya perlu membayar dalam WeChat tanpa melompat ke halaman lain, yang lebih mudah.

Seterusnya, kita perlu membuat beberapa persiapan:

  1. Daftar akaun platform pedagang WeChat dan lengkapkan pengesahan nama sebenar
  2. Buat akaun rasmi WeChat dan lengkapkan rasmi pengesahan akaun
  3. Dapatkan ID permohonan (APPID) dan nombor pedagang (MCHID) WeChat Pay
  4. Jana kunci APISecret

Selepas melengkapkan persediaan di atas, kita perlu untuk memuat turun Penyatuan WeChat Untuk PHP SDK API pembayaran, anda boleh mencari "wechatpay-GuzzleHttp" di GitHub, memuat turunnya dan meletakkannya dalam direktori akar projek.

Seterusnya, kita perlu menulis kod PHP untuk melaksanakan pembayaran JSAPI. Mula-mula, anda perlu memperkenalkan fail:

require_once 'wechatpay-GuzzleHttp/autoload.php';
use WeChatPayGuzzleMiddlewareUtilPemUtil;
use WeChatPayGuzzleMiddlewareWeChatPayMiddleware;
use GuzzleHttpClient;
use GuzzleHttpHandlerStack;

Kemudian, anda perlu menetapkan parameter yang berkaitan dan mencipta objek 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]);

Dalam kod di atas, kami menggunakan PHP pihak ketiga perpustakaan "wechatpay-GuzzleHttp", Ia merangkumi API pembayaran WeChat dan melaksanakan pemprosesan permintaan dan tindak balas melalui perisian tengah.

Kemudian, kami perlu menulis kod untuk mendapatkan openid pengguna:

// 获取用户的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'];

Dalam kod di atas, kami memperoleh akses_token dan openid pengguna melalui kebenaran OAuth2.0, yang akan digunakan dalam proses pembayaran seterusnya openid.

Akhir sekali, kami perlu menulis kod pembayaran 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));
}

Dalam kod di atas, kami menggunakan fungsi "chooseWXPay" dalam WeChat JS-SDK untuk melaksanakan fungsi pembayaran. Khususnya, kami memperoleh ID sesi transaksi prabayar (prepay_id) dengan memanggil API pesanan bersatu WeChat Pay, dan kemudian menghantar parameter jsapi yang dijana ke dalam fungsi chooseWXPay untuk memanggil antara muka pembayaran WeChat untuk pembayaran.

Pada ketika ini, kami telah berjaya melaksanakan pembayaran JSAPI. Untuk meringkaskan, langkah berikut perlu dilengkapkan untuk melaksanakan pembayaran JSAPI:

  1. Daftar akaun platform pedagang WeChat dan lengkapkan pengesahan nama sebenar
  2. Buat akaun rasmi WeChat dan lengkapkan rasmi pengesahan akaun
  3. Dapatkan ID aplikasi (APPID) dan nombor pedagang (MCHID) WeChat Pay
  4. Jana kunci APISecret
  5. Muat turun SDK PHP WeChat Unified Payment API dan perkenalkan fail berkaitan
  6. Dapatkan Openid pengguna
  7. Panggil WeChat Pay unified ordering API untuk menjana ID sesi transaksi prabayar (prepay_id)
  8. Kira antara muka pembayaran WeChat melalui fungsi chooseWXPay

Semoga artikel Pengenalan ini dapat membantu pembangun PHP melaksanakan fungsi pembayaran JSAPI dengan cepat.

Atas ialah kandungan terperinci Pembangunan PHP WeChat: Bagaimana untuk melaksanakan pembayaran JSAPI. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn