PHP如何接入微信支付分(代码示例)
4458
一、微信支付分介绍及开通
产品介绍: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.shtml
wechatpay-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',
- ];
- }
- }
五、注意事项
严格遵循文档中的参数要求,出现问题第一时间比较传入参数和官方示例的区别
支付分订单必须取消,或完结
本文网址:https://www.zztuku.com/detail-9250.html
站长图库 - PHP如何接入微信支付分(代码示例)
申明:如有侵犯,请 联系我们 删除。
您还没有登录,请 登录 后发表评论!
提示:请勿发布广告垃圾评论,否则封号处理!!