授权确认优化

This commit is contained in:
Dev
2026-10-10 17:10:38 +08:00
parent beffbd6489
commit 5f451e1d66
2 changed files with 16 additions and 5 deletions
@@ -297,7 +297,10 @@ class EasyWeChatService
* 接口:GET /v3/fund-app/mch-transfer/user-confirm-authorization/out-authorization-no/{no}
* 文档:https://pay.weixin.qq.com/doc/v3/merchant/4015901167
* @param string $out_authorization_no 商户侧授权单号
* @param bool $isDisplayAuthorization 是否在响应中返回 package_info(调起授权页/授权信息页)
* @param bool $isDisplayAuthorization 是否请求展示授权信息页的 package_info。
* 注意:仅当授权已生效(TAKING_EFFECT)时才有效;
* 待确认/已关闭状态下微信会返回 INVALID_REQUEST 且不返回 state,
* 因此“查状态”必须传 false,拉起授权确认页的 package 应取申请接口的响应
* @return array {out_authorization_no, authorization_id, state, ...};失败时含 message
*/
public function queryTransferAuthorization($out_authorization_no, $isDisplayAuthorization = false)
@@ -105,7 +105,11 @@ class TransferAuthorizationService
: self::generateAuthNo($userId);
$displayName = self::sanitizeDisplayName($displayName ?: ($user->nickname ?: ('用户' . $userId)));
$query = $wechat->queryTransferAuthorization($authNo, true);
//注意:is_display_authorization=true 只在授权已生效(TAKING_EFFECT)时可用;
//待确认(WAIT_USER_CONFIRM)/已关闭(CLOSED)会被微信以 INVALID_REQUEST 拒绝且不返回 state,
//会导致误判为“查询授权状态失败”。查状态必须用 false,
//拉起授权页所需的 package 只能来自申请接口的响应或本地记录。
$query = $wechat->queryTransferAuthorization($authNo, false);
$resolved = self::resolveByWechatState($userId, $authNo, $query, $wechat, $record);
if ($resolved !== null) {
return $resolved;
@@ -156,9 +160,13 @@ class TransferAuthorizationService
return null;
}
//查询失败时禁止再开新单,避免把同一 openid 的待确认/已生效单堆到 5 笔上限
//查询异常(网络/系统错误)时:本地已生效的授权直接放行,避免误报“查询授权状态失败”;
//不允许再开新单,防止把同一 openid 的待确认/已生效单堆到 5 笔上限
if ($record && $record->state === self::STATE_TAKING_EFFECT) {
throw new \Exception('查询授权状态失败,请稍后重试');
return [
'authorized' => true,
'state' => self::STATE_TAKING_EFFECT,
];
}
if ($record && $record->state === self::STATE_WAIT_USER_CONFIRM && !empty($record->package_info)) {
return self::pendingAuthResponse($wechat, self::STATE_WAIT_USER_CONFIRM, (string)$record->package_info);
@@ -180,7 +188,7 @@ class TransferAuthorizationService
//当前单已受理/已终结:改为查单,禁止换号重试
if (self::isApplyConflict($res)) {
$query = $wechat->queryTransferAuthorization($authNo, true);
$query = $wechat->queryTransferAuthorization($authNo, false);
$resolved = self::resolveByWechatState($userId, $authNo, $query, $wechat, self::getByUserId($userId));
if ($resolved !== null) {
return $resolved;