>백엔드 개발 >PHP 튜토리얼 >PHP로 WeChat 결제 포인트에 액세스하는 방법을 자세히 설명하는 기사(코드 예)

PHP로 WeChat 결제 포인트에 액세스하는 방법을 자세히 설명하는 기사(코드 예)

藏色散人
藏色散人앞으로
2021-09-16 14:02:314728검색

1. 위챗결제 도입 및 활성화

  1. 상품소개 : https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_0.shtml
  2. 접속 전 준비사항 : https : //pay.weixin.qq.com/wiki/doc/apiv3/open/pay/chapter3_1_1.shtml
  3. 테스트 번호 구성: https://pay.weixin.qq.com/wiki/doc/apiv3/open/pay /chapter3_1_5.shtml

2. 확인 없는 모드 개발

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

  • 단계 1 사용자가 가맹점 측에서 제품이나 서비스를 구매하기 위해 주문을 하면 먼저 사용자의 승인 상태를 확인해야 합니다
  • Step 2 사용자에게 승인 서비스를 열도록 안내합니다
  • Step 3 결제 하위 생성 order
  • Step 4 가맹점은 사용자에게 다음을 제공합니다. 서비스가 완료된 후 가맹점은 주문 완료 인터페이스를 호출하여 현재 주문을 완료합니다.
  • 5단계: 사용자로부터 차감 성공 알림을 받고 비즈니스 프로세스가 종료됩니다

3. SDK 관련

  1. 공식 문서: https://pay.weixin.qq.com/wiki/doc/ apiv3/wechatpay/ wechatpay6_0.shtml
  2. wechatpay-php (권장): https://github.com/wechatpay-apiv3/wechatpay-php

4. 코드 예시

/**
     * 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 '';
        }
    }

결제 하위 주문 완료, 취소 지불 하위 주문 및 쿼리 지불 하위 주문은 유사하므로 여기에 기록되지 않습니다.

/**
     * 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. 참고 사항

  1. 문서의 매개변수 요구 사항을 엄격히 따르십시오. 문제가 있는 경우 가능한 한 빨리 들어오는 매개변수와 공식 예제의 차이를 비교하십시오.
  2. 결제 하위 주문을 취소하거나 완료

추천 학습: "PHP 비디오 튜토리얼"

위 내용은 PHP로 WeChat 결제 포인트에 액세스하는 방법을 자세히 설명하는 기사(코드 예)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 learnku.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제