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

Pembangunan PHP WeChat: Bagaimana untuk melaksanakan pembayaran JSAPI

WBOY
Lepaskan: 2023-05-13 19:24:01
asal
2662 orang telah melayarinya

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;
Salin selepas log masuk

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]);
Salin selepas log masuk

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'];
Salin selepas log masuk

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));
}
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan