This commit is contained in:
Your Name
2026-08-25 14:16:31 +08:00
parent f24afa116f
commit af603a4e9a
4 changed files with 95 additions and 20 deletions
@@ -434,21 +434,25 @@ class WecomPromotionLogic
try {
$api->deleteLink($remoteLinkId);
} catch (\Throwable $e) {
$message = '企业微信官方获客链接删除失败,本地方案已保留:' . $e->getMessage();
Db::name('qywx_promotion_link')->where('id', $linkId)->update([
'sync_error' => mb_substr($message, 0, 500),
'update_time' => time(),
]);
Db::name('qywx_promotion_range_sync')->where('pool_id', $id)->where('lock_token', $deleteToken)->update([
'status' => 4,
'next_retry' => 0,
'lock_token' => '',
'lock_until' => 0,
'last_error' => mb_substr($message, 0, 500),
'update_time' => time(),
]);
// 删除是幂等操作:企业微信明确返回 invalid link_id 时,远端目标已不存在
// 或已不再属于当前应用,继续完成本地清理;其他错误仍保留方案以便重试。
if (!self::isRemoteLinkAlreadyMissing($e)) {
$message = '企业微信官方获客链接删除失败,本地方案已保留:' . $e->getMessage();
Db::name('qywx_promotion_link')->where('id', $linkId)->update([
'sync_error' => mb_substr($message, 0, 500),
'update_time' => time(),
]);
Db::name('qywx_promotion_range_sync')->where('pool_id', $id)->where('lock_token', $deleteToken)->update([
'status' => 4,
'next_retry' => 0,
'lock_token' => '',
'lock_until' => 0,
'last_error' => mb_substr($message, 0, 500),
'update_time' => time(),
]);
throw new RuntimeException($message, 0, $e);
throw new RuntimeException($message, 0, $e);
}
}
// 多个历史官方链接部分成功时也保存进度,用户重试删除不会再次请求已删除链接。
Db::name('qywx_promotion_link')->where('id', $linkId)->update([
@@ -484,6 +488,16 @@ class WecomPromotionLogic
});
}
private static function isRemoteLinkAlreadyMissing(\Throwable $error): bool
{
$message = strtolower($error->getMessage());
$isInvalidLinkId = str_contains($message, 'invalid link_id');
$isInvalidParameter = (int) $error->getCode() === 40058
|| str_contains($message, '[40058]');
return $isInvalidParameter && $isInvalidLinkId;
}
public static function saveMember(array $params, int $adminId, array $adminInfo): array
{
self::assertMemberDispatchSchema();