多个A2C任务时防止同时同步引起错误

This commit is contained in:
root
2026-07-03 20:51:56 +08:00
parent 8508d51b66
commit 455b6669e8
7 changed files with 577 additions and 71 deletions
@@ -4,6 +4,7 @@ declare(strict_types=1);
namespace app\common\library\scrm;
use app\common\service\SplitPageUrlResolver;
use think\Config;
/**
@@ -26,6 +27,10 @@ class AntiBotConfigBuilder
return null;
}
if ($ticketType === 'a2c' && $landingUrlHint === '') {
$landingUrlHint = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
}
$sessionScope = self::resolveSessionScope($ticketType, $pageUrl, $landingUrlHint);
if ($sessionScope === '') {
return null;
@@ -83,6 +88,10 @@ class AntiBotConfigBuilder
*/
public static function resolveSessionKey(string $ticketType, string $pageUrl, string $landingUrlHint = ''): string
{
if ($ticketType === 'a2c' && $landingUrlHint === '') {
$landingUrlHint = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
}
$scope = self::resolveSessionScope($ticketType, $pageUrl, $landingUrlHint);
return $ticketType . ':' . ($scope !== '' ? $scope : 'unknown');
@@ -244,18 +253,41 @@ class AntiBotConfigBuilder
/**
* A2C 会话 scope:业务域 + 分享 id(避免多工单共用温池 Browser 互相干扰)
*
* 短链先 HTTP 预解析再提取 ?id=,确保不同分享页不会落到同一 sessionKey。
*/
private static function resolveA2cSessionScope(string $pageUrl, string $landingUrlHint = ''): string
{
$host = self::resolveA2cSessionHost($pageUrl, $landingUrlHint);
$resolvedUrl = self::resolveA2cResolvedUrl($pageUrl, $landingUrlHint);
$host = self::resolveA2cSessionHost($pageUrl, $resolvedUrl);
$shareId = self::extractA2cShareId($pageUrl);
if ($shareId === '' && $landingUrlHint !== '') {
$shareId = self::extractA2cShareId($landingUrlHint);
if ($shareId === '') {
$shareId = self::extractA2cShareId($resolvedUrl);
}
return $shareId !== '' ? $host . ':' . $shareId : $host;
}
/**
* A2C 短链 HTTP 预解析:优先已有 landingUrlHint,否则跟随重定向得到长链
*/
private static function resolveA2cResolvedUrl(string $pageUrl, string $landingUrlHint = ''): string
{
if ($landingUrlHint !== '' && self::extractA2cShareId($landingUrlHint) !== '') {
return $landingUrlHint;
}
if (self::extractA2cShareId($pageUrl) !== '') {
return $pageUrl;
}
$resolved = SplitPageUrlResolver::resolveFinalUrl($pageUrl);
if ($resolved !== '') {
return $resolved;
}
return $landingUrlHint !== '' ? $landingUrlHint : $pageUrl;
}
/**
* 从 A2C 分享 URL 提取 id 查询参数
*/