Heim  >  Artikel  >  Backend-Entwicklung  >  Ein Artikel, der ausführlich erklärt, wie man mit PHP auf WeChat-Zahlungspunkte zugreift (Codebeispiel)

Ein Artikel, der ausführlich erklärt, wie man mit PHP auf WeChat-Zahlungspunkte zugreift (Codebeispiel)

藏色散人
藏色散人nach vorne
2021-09-16 14:02:314672Durchsuche

1. Einführung und Aktivierung der WeChat-Zahlung

  1. Produkteinführung: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_0.shtml
  2. Vorbereitung vor dem Zugriff: https: //pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_1.shtml
  3. Konfiguration der Testnummer: https://pay.weixin.qq.com/wiki/doc/apiv3/open/ pay /chapter3_1_5.shtml

2. Bestätigungsfreie Modusentwicklung

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

  • Schritte 1 Der Benutzer gibt eine Bestellung zum Kauf von Produkten oder Dienstleistungen auf der Händlerseite auf. Zu diesem Zeitpunkt müssen wir zunächst den Autorisierungsstatus des Benutzers überprüfen. Schritt 2: Führen Sie den Benutzer zum Öffnen des Autorisierungsdienstes. Schritt 3: Erstellen Sie eine Zahlungsunterschrift. Bestellung
  • Schritt 4 Der Händler stellt dem Benutzer Folgendes zur Verfügung: Nachdem der Dienst abgeschlossen ist, ruft der Händler die Bestellabschlussschnittstelle auf, um die aktuelle Bestellung abzuschließen.
  • Schritt 5: Erhalten Sie eine Benachrichtigung über den erfolgreichen Abzug vom Benutzer und der Geschäftsprozess endet
  • 3. SDK-bezogen

Offizielle Dokumentation: https://pay.weixin.qq.com/wiki/doc/apiv3 /wechatpay/ wechatpay6_0.shtml

wechatpay-php (empfohlen): https://github.com/wechatpay-apiv3/wechatpay-php
  1. Vier. Codebeispiele
/**
     * 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 '';
        }
    }

Zahlungsunteraufträge abschließen, Zahlung stornieren Unteraufträge und Abfrage Der Zahlungsunterauftrag ist ähnlich und wird hier nicht ausgeschrieben.

/**
     * 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. Hinweise

Befolgen Sie strikt die Parameteranforderungen im Dokument. Wenn ein Problem auftritt, vergleichen Sie so schnell wie möglich die Differenz zwischen den eingehenden Parametern und den offiziellen Beispielen.

    Zahlungsunteraufträge müssen storniert werden abgeschlossen
  1. Empfohlenes Lernen: „

    PHP-Video-Tutorial

Das obige ist der detaillierte Inhalt vonEin Artikel, der ausführlich erklärt, wie man mit PHP auf WeChat-Zahlungspunkte zugreift (Codebeispiel). Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:learnku.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen