一、微信支付分介紹及開通
二、免確認模式開發
- 步驟1 使用者在商戶側下單購買產品或服務,此時,我們需要先對使用者的授權狀態進行查詢
- 步驟2 引導使用者開啟授權服務
- 步驟3 建立支付分訂單
- 步驟4 商戶為使用者提供服務,待服務結束後,商戶呼叫完結訂單介面完結當前訂單。
- 步驟5 收到使用者扣款成功通知,業務流程結束
三、SDK相關
四、程式碼示例
/**
* 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',
];
}
}
五、注意事項
- 嚴格遵循文件中的引數要求,出現問題第一時間比較傳入引數和官方示例的區別
- 支付分訂單必須取消,或完結
本作品採用《CC 協議》,轉載必須註明作者和本文連結