一、微信支付分介绍及开通
- 产品介绍: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', ]; } }
五、注意事项
- 严格遵循文档中的参数要求,出现问题第一时间比较传入参数和官方示例的区别
-
支付分订单必须取消,或完结
未经允许不得转载:任鹏个人博客 » 一文详解PHP如何接入微信支付分(代码示例)
最新评论
Forex wiki. https://lt.forex-stock-bitcoin-brokers.com
Magnificent items from you, man. I have take note your stuff
Following on from the 3rd March Meetings held by economic de
It is remarkable, rather valuable message dfgdlfg2131.32
一般都会有一个沙盒期的,过了沙盒期就会慢慢放出来
百度不收录是应为是新站的原因吗?
The spike in consumer prices that left inflation at a four-d