一文详解PHP如何接入微信支付分(代码示例)

一文详解PHP如何接入微信支付分(代码示例),第1张

概述一文详解PHP如何接入微信支付分(代码示例) 一、微信支付分介绍及开通

产品介绍:https://pay.weixin.qq.com/wiki/doc/APIv3/open/pay/chapter3_1_0.sHTML接入前准备:https://pay.weixin.qq.com/wiki/doc/APIv3/open/pay/chapter3_1_1.sHTML测试号配置:https://pay.weixin.qq.com/wiki/doc/APIv3/open/pay/chapter3_1_5.sHTML

二、免确认模式开发

参考网址:https://pay.weixin.qq.com/wiki/doc/APIv3/open/pay/chapter3_1_3.sHTML

步骤1 用户在商户侧下单购买产品或服务,此时,我们需要先对用户的授权状态进行查询步骤2 引导用户开启授权服务步骤3 创建支付分订单步骤4 商户为用户提供服务,待服务结束后,商户调用完结订单接口完结当前订单。步骤5 收到用户扣款成功通知,业务流程结束

三、SDK相关

官方文档:https://pay.weixin.qq.com/wiki/doc/APIv3/wechatpay/wechatpay6_0.sHTMLwechatpay-PHP(推荐):https://github.com/wechatpay-APIv3/wechatpay-PHP

四、代码示例

/**     * 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',            ];        }    }
五、注意事项严格遵循文档中的参数要求,出现问题第一时间比较传入参数和官方示例的区别

支付分订单必须取消,或完结

推荐学习:《PHP视频教程》 总结

以上是内存溢出为你收集整理的一文详解PHP如何接入微信支付分(代码示例)全部内容,希望文章能够帮你解决一文详解PHP如何接入微信支付分(代码示例)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1008683.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-22
下一篇 2022-05-22

发表评论

登录后才能评论

评论列表(0条)

保存