diff --git a/backend/application/common/service/EasyWeChatService.php b/backend/application/common/service/EasyWeChatService.php index 38e95fb..82fa77d 100644 --- a/backend/application/common/service/EasyWeChatService.php +++ b/backend/application/common/service/EasyWeChatService.php @@ -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) diff --git a/backend/application/common/service/TransferAuthorizationService.php b/backend/application/common/service/TransferAuthorizationService.php index b85b538..f22f527 100644 --- a/backend/application/common/service/TransferAuthorizationService.php +++ b/backend/application/common/service/TransferAuthorizationService.php @@ -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;