From c25e827a36a26df7937bf0101f0bb869aef2dfbf Mon Sep 17 00:00:00 2001 From: Dev Date: Sat, 10 Oct 2026 17:39:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8E=88=E6=9D=83=E7=A1=AE=E8=AE=A4=E4=BC=98?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/TransferAuthorizationService.php | 45 ++++++++----------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/backend/application/common/service/TransferAuthorizationService.php b/backend/application/common/service/TransferAuthorizationService.php index d324411..165987d 100644 --- a/backend/application/common/service/TransferAuthorizationService.php +++ b/backend/application/common/service/TransferAuthorizationService.php @@ -182,27 +182,13 @@ class TransferAuthorizationService /** * 向微信发起授权申请 - * @param bool $isRetry 是否为换号重试(防止递归) + * @param bool $isRetry 是否为重试(防止递归) */ private static function requestAuthorization($user, string $authNo, string $displayName, EasyWeChatService $wechat, bool $renew, bool $isRetry = false): array { $userId = $user->id; $res = $wechat->applyTransferAuthorization($authNo, $user->openid, $displayName); - //单号已被占用(已受理/已终结/重入参数不一致):查单按微信侧实际状态处理 - if (self::isApplyConflict($res)) { - $query = $wechat->queryTransferAuthorization($authNo, false); - $resolved = self::resolveByWechatState($userId, $authNo, $query, $wechat, self::getByUserId($userId)); - if ($resolved !== null) { - return $resolved; - } - //原单已无法拉起授权页:已终结,或重入参数不一致导致该单号不可复用。 - //换全新单号重新发起,保证用户一定能拿到 package;原未确认单 24 小时后自动关闭 - if (!$isRetry) { - return self::requestAuthorization($user, self::generateAuthNoUnique($userId), $displayName, $wechat, true, true); - } - } - if (self::isQuantityLimit($res)) { $record = self::getByUserId($userId); if ($record && $record->state === self::STATE_WAIT_USER_CONFIRM && !empty($record->package_info)) { @@ -212,7 +198,23 @@ class TransferAuthorizationService } if (empty($res['package_info'])) { - throw new \Exception($res['message'] ?? '发起免确认收款授权失败'); + //发起失败(单号已被占用/重入参数不一致/系统异常等,不同版本文案不同,故不做关键字匹配): + //先查单按微信侧实际状态处理,而不是把原始错误抛给用户 + $query = $wechat->queryTransferAuthorization($authNo, false); + $resolved = self::resolveByWechatState($userId, $authNo, $query, $wechat, self::getByUserId($userId)); + if ($resolved !== null) { + return $resolved; + } + if (!$isRetry) { + //微信侧查无此单(本次发起未落单):用同一单号重试一次 + if (self::isWechatNotFound($query)) { + return self::requestAuthorization($user, $authNo, $displayName, $wechat, $renew, true); + } + //单已存在但拿不到可拉起授权页的 package(已终结,或重入参数不一致导致该单号不可复用): + //换全新单号重新发起,保证用户一定能拿到 package;原未确认单 24 小时后自动关闭 + return self::requestAuthorization($user, self::generateAuthNoUnique($userId), $displayName, $wechat, true, true); + } + throw new \Exception('发起免确认收款授权失败:' . ($res['message'] ?? '请稍后重试')); } self::saveAuthorization( @@ -284,17 +286,6 @@ class TransferAuthorizationService return mb_strpos($message, '授权数量达到限制') !== false || mb_strpos($message, '数量达到限制') !== false; } - private static function isApplyConflict(array $res): bool - { - $message = (string)($res['message'] ?? ''); - - //单号已被占用:原单已解除/已授权成功,或重复发起时请求参数与原单不一致(重入校验) - return $message !== '' && ( - mb_strpos($message, '已解除或已授权成功') !== false - || mb_strpos($message, '重入参数不一致') !== false - ); - } - /** * 保存/更新授权记录 * @param int $userId