feat: unify invite flow with referral ref

This commit is contained in:
2026-08-17 13:49:59 +08:00
parent f1d6809109
commit b501cf4611
47 changed files with 1083 additions and 2548 deletions
+36 -44
View File
@@ -11,10 +11,6 @@ trait ServicePart1a {
public static function register_user(array $post, array $context = []): array {
// 先 reset pending invite context,避免同一进程内残留污染
self::$pending_invite_inviter_id = 0;
self::$pending_invite_code = '';
$user_login = sanitize_user(wp_unslash($post['user_login'] ?? ''), true);
$user_email = sanitize_email(wp_unslash($post['user_email'] ?? ''));
$password = (string) ($post['user_pass'] ?? '');
@@ -60,53 +56,47 @@ trait ServicePart1a {
}
}
// ====== 解析邀请码 ======
// 优先级:表单 invite_code(用户显式填写) > cookie aksrt_invite
$invite_registration_enabled = class_exists('\AKSRT\Settings\Settings') && \AKSRT\Settings\Settings::invite_registration_enabled();
$invite_mode = $invite_registration_enabled && class_exists('\AKSRT\Settings\Settings')
? \AKSRT\Settings\Settings::invite_register_field_mode()
: 'hidden';
$invite_code = isset($post['invite_code']) ? sanitize_key((string) wp_unslash($post['invite_code'])) : '';
$resolved_inviter_id = 0;
$invite_is_valid = false;
if (!$invite_registration_enabled) {
// 邀请功能关闭,忽略所有邀请码
$invite_code = '';
} elseif ($invite_code !== '') {
if (class_exists('\AKSRT\Credits\Invite')) {
$invite_service = \AKSRT\Credits\Invite::get_instance();
$resolved_inviter_id = $invite_service->resolve_code($invite_code);
$invite_is_valid = $invite_service->validate_code($invite_code);
}
// 必填模式下,邀请码无效时根据后台开关决定是否拒绝
$reject_invalid = class_exists('\AKSRT\Settings\Settings') && \AKSRT\Settings\Settings::invite_reject_invalid();
if ($invite_mode === 'required' && $reject_invalid && !$invite_is_valid) {
return ['success' => false, 'error' => __('邀请码无效,请检查后重试', 'aksrt')];
}
} elseif ($invite_mode === 'required') {
return ['success' => false, 'error' => __('请填写邀请码', 'aksrt')];
$ref_service = class_exists('\AKSRT\Payment\ReferralAttribution')
? \AKSRT\Payment\ReferralAttribution::get_instance()
: null;
if ($ref_service) {
$ref_service->clear_registration_context();
}
$registration = class_exists('\AKSRT\Settings\Settings')
? \AKSRT\Settings\Settings::get_referral_registration_settings()
: ['enabled' => false, 'register_field' => 'hidden', 'reject_invalid' => true];
$submitted_ref = isset($post['ref']) ? sanitize_key((string) wp_unslash($post['ref'])) : '';
$field_mode = !empty($registration['enabled'])
? (string) ($registration['register_field'] ?? 'hidden')
: 'hidden';
$accept_submitted = !empty($registration['enabled']) && $field_mode !== 'hidden';
$ref_context = $ref_service
? $ref_service->prepare_registration($accept_submitted ? $submitted_ref : '')
: ['ref' => '', 'valid' => false, 'submitted_valid' => false, 'conflict' => false, 'source' => 'none'];
// 把解析到的 inviter_id 暂存到静态字段,user_register hook 内部读取(优先于 cookie)
self::$pending_invite_inviter_id = $resolved_inviter_id;
self::$pending_invite_code = $invite_code;
if ($field_mode === 'required' && empty($ref_context['valid'])) {
if ($submitted_ref === '') {
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => __('请填写推广码', 'aksrt')];
}
if (!empty($registration['reject_invalid'])) {
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => __('推广码无效,请检查后重试', 'aksrt')];
}
}
$user_id = wp_create_user($user_login, $password, $user_email);
if (is_wp_error($user_id)) {
self::$pending_invite_inviter_id = 0;
self::$pending_invite_code = '';
if ($ref_service) {
$ref_service->clear_registration_context();
}
return ['success' => false, 'error' => $user_id->get_error_message()];
}
if ($invite_code !== '' && $resolved_inviter_id <= 0 && class_exists('\AKSRT\Credits\Invite')) {
\AKSRT\Credits\Invite::get_instance()->handle_registration_invite((int) $user_id, $invite_code);
}
// wp_create_user 内部已触发 user_register hook,\AKSRT\Credits\Invite::on_user_register 已读取 pending 字段。
// 这里清空,避免污染后续请求。
self::$pending_invite_inviter_id = 0;
self::$pending_invite_code = '';
$ref_notice = $ref_service ? $ref_service->take_registration_notice() : '';
$user = get_userdata($user_id);
if (!$user || is_wp_error($user)) {
@@ -124,6 +114,7 @@ trait ServicePart1a {
'user_id' => (int) $user_id,
'user' => $user,
'user_login' => $user_login,
'notice' => $ref_notice,
];
}
@@ -150,6 +141,7 @@ trait ServicePart1a {
'verification_method' => $method,
'verify_url' => self::get_email_verification_url((int) $user_id, ['mode' => $method]),
'message' => $begin['message'] ?? '',
'notice' => $ref_notice,
];
}