Rumah >pembangunan bahagian belakang >tutorial php >Artikel yang menerangkan secara terperinci cara mengakses mata pembayaran WeChat dengan PHP (contoh kod)

Artikel yang menerangkan secara terperinci cara mengakses mata pembayaran WeChat dengan PHP (contoh kod)

藏色散人
藏色散人ke hadapan
2021-09-16 14:02:314721semak imbas

1. Pengenalan dan pengaktifan pembayaran WeChat

  1. Pengenalan produk: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay /chapter3_1_0.shtml
  2. Persediaan sebelum akses: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_1.shtml
  3. Konfigurasi nombor ujian: https ://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_5.shtml

Pembangunan model tanpa pengesahan

URL Rujukan: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_3.shtml

  • Langkah 1 Pengguna membuat pesanan untuk membeli produk di pihak pedagang atau perkhidmatan, pada masa ini, kami perlu menanyakan status kebenaran pengguna terlebih dahulu
  • Langkah 2 Bimbing pengguna untuk membuka perkhidmatan kebenaran
  • Langkah 3 Buat subpesanan pembayaran
  • Langkah 4 Pedagang ialah Pengguna menyediakan perkhidmatan, dan selepas perkhidmatan selesai, pedagang memanggil antara muka penyiapan pesanan untuk melengkapkan pesanan semasa.
  • Langkah 5: Terima pemberitahuan potongan yang berjaya daripada pengguna dan proses perniagaan tamat

3 berkaitan SDK

  1. Dokumen rasmi: https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay6_0.shtml
  2. wechatpay-php (disyorkan): https://github.com/wechatpay-apiv3 /wechatpay- php

4. Contoh kod

/**
     * Notes: 步骤1 用户在商户侧下单购买产品或服务,此时,我们需要先对用户的授权状态进行查询
     * User: XXX
     * DateTime: 2021/7/27 9:59
     */
    public function getAuthStatus(string $cid)
    {
        $openid = $this->getOpenid($cid);
        if (!$openid) {
            return false;
        }
        try {
            $resp = $this->instance->v3->payscore->permissions->openid->{'{openid}'}
                ->get(
                    [
                        'query'  => [
                            'appid'      => $this->appid,
                            'service_id' => $this->serviceId,
                        ],
                        // uri_template 字面量参数
                        'openid' => $openid,
                    ]
                );
            $res = json_decode($resp->getBody()->getContents(), true);
            if ($res['authorization_state'] == 'AVAILABLE') {
                return true;
            } else {
                return false;
            }
        } catch (\Exception $e) {
            return false;
            /*echo($e->getResponse()->getStatusCode());
            // 进行错误处理
            echo $e->getMessage()->getReasonPhrase(), PHP_EOL;
            if ($e instanceof \Psr\Http\Message\ResponseInterface && $e->hasResponse()) {
                echo $e->getResponse()->getStatusCode() . ' ' . $e->getResponse()->getReasonPhrase(), PHP_EOL;
                echo $e->getResponse()->getBody();
            }*/
        }
    }
/**
     * Notes:步骤2 引导用户开启授权服务-获取预授权码
     * User: XXX
     * DateTime: 2021/7/27 18:37
     */
    public function openAuthStatus()
    {
        try {
            $resp = $this->instance->v3->payscore->permissions->post(
                [
                    'json' => [
                        'service_id'         => $this->serviceId,
                        'appid'              => $this->appid,
                        'authorization_code' => $this->getRandStr(12), // 授权协议号,类似订单号
                        //'notify_url'         => 'https://weixin.qq.com/',
                    ]
                ]
            );
            $res = json_decode($resp->getBody(), true);
            return $res['apply_permissions_token'];
        } catch (\Exception $e) {
            // 进行错误处理
            /*if ($e->hasResponse()) {
                echo $e->getResponse()->getBody();
            }*/
            return false;
        }
    }
/**
     * Notes: 步骤3 创建支付分订单
     * User: xxx
     * DateTime: 2021/7/27 19:21
     * @param string $cid     用户ID
     * @param string $orderSn 订单号
     */
    public function makeOrder(string $cid, string $orderSn)
    {
        // 订单信息
        ....
        $openid = $this->getOpenid($cid);
        if (!$openid) {
            return [
                'code' => -1,
                'msg'  => 'openid不可以为空',
            ];
        }

        // 异步通知地址,有时候发现莫名的变成了localhost,这里先固定
        $notiryUrl = route('api.v1.wxpayPointsNotify');

        $json = [
            'out_order_no'         => $orderSn,                                                        // 商户服务订单号
            'appid'                => $this->appid,                                                    // 应用ID
            'service_id'           => $this->serviceId,                                                // 服务ID
            'service_introduction' => '换电费用',                                                          // 服务信息,用于介绍本订单所提供的服务 ,当参数长度超过20个字符时,报错处理
            'time_range'           => [
                'start_time' => $startTime, //'20210729160710',
            ],
            'risk_fund'            => [
                'name'   => 'ESTIMATE_ORDER_COST',         // 风险金名称
                'amount' => 300,                           // 风险金额 数字,必须>0(单位分)
            ],
            'attach'               => $orderSn,// 商户数据包
            'notify_url'           => $notiryUrl,
            'openid'               => $openid,// 用户标识
            'need_user_confirm'    => false,// 是否需要用户确认
        ];

        try {
            $resp = $this->instance->v3->payscore->serviceorder->post(
                [
                    'json' => $json
                ]
            );
            $res = json_decode($resp->getBody(), true);

            // 入库支付分订单
            ...
            return [
                'code' => 0,
                'msg'  => '支付分订单创建完成',
            ];
        } catch (\Exception $e) {
            // 进行错误处理
            if ($e->hasResponse()) {
                $body = $e->getResponse()->getBody();
                if ($body) {
                    return [
                        'code' => -1,
                        'msg'  => (string)$body,
                    ];
                }
            }
            return '';
        }
    }

Melengkapkan sub-pesanan pembayaran, membatalkan sub-pesanan pembayaran, dan menyoal subpesanan pembayaran adalah serupa , tidak lagi ditulis di sini.

/**
     * Notes: 异步通知
     * User: XXX
     * DateTime: 2021/8/3 14:20
     */
    public function notify()
    {
        // 获取返回的信息
        $responseBody = file_get_contents("php://input");
        $responseArr = json_decode($responseBody, true);
        if ($responseArr) {
            $res = AesGcm::decrypt($responseArr['resource']['ciphertext'], 'xxxapi密钥', $responseArr['resource']['nonce'], $responseArr['resource']['associated_data']);
            $resArr = json_decode($res, true);
            if ($resArr) {
                // 记录日志
                ...
                // 业务逻辑处理
                ...
                // 订单日志记录
               ...
            } else {
                return [
                    'code' => -1,
                    'msg'  => '解析有误',
                ];
            }
        } else {
            return [
                'code' => -1,
                'msg'  => 'nothing post',
            ];
        }
    }

5 Nota

  1. Patuhi dengan ketat keperluan parameter dalam dokumen dan bandingkan perbezaan antara parameter masuk dan contoh rasmi sebaik sahaja masalah timbul
  2. Subpesanan pembayaran mesti dibatalkan atau diselesaikan

Pembelajaran yang disyorkan: "Tutorial Video PHP"

Atas ialah kandungan terperinci Artikel yang menerangkan secara terperinci cara mengakses mata pembayaran WeChat dengan PHP (contoh kod). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:learnku.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam