授权确认优化

This commit is contained in:
Dev
2026-10-10 17:39:33 +08:00
parent a04418a453
commit c25e827a36
@@ -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