fengketrade/addons/shopro/library/InviteHelper.php
2025-11-07 14:03:57 +08:00

164 lines
4.7 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace addons\shopro\library;
use app\admin\model\shopro\user\User as UserModel;
/**
* 邀请码工具类
*/
class InviteHelper
{
/**
* 为用户生成邀请码
* @param int $userId 用户ID
* @return string 邀请码
*/
public static function generateCode($userId)
{
$user = UserModel::find($userId);
if (!$user) {
return '';
}
// 已有邀请码直接返回
if ($user->invite_code) {
return $user->invite_code;
}
// 生成唯一邀请码(排除易混淆字符)
$chars = 'ABCDEFGHJKMNPQRSTUVWXYZ23456789';
$maxAttempts = 50;
for ($i = 0; $i < $maxAttempts; $i++) {
$code = '';
for ($j = 0; $j < 6; $j++) {
$code .= $chars[mt_rand(0, strlen($chars) - 1)];
}
// 检查是否重复
if (!UserModel::where('invite_code', $code)->find()) {
$user->invite_code = $code;
$user->save();
return $code;
}
}
// 兜底用MD5
$code = strtoupper(substr(md5($userId . time() . mt_rand()), 0, 6));
$user->invite_code = $code;
$user->save();
return $code;
}
/**
* 验证邀请码或手机号
* @param string $inviteCode 邀请码或手机号
* @return array
*/
public static function validate($inviteCode)
{
$input = trim($inviteCode);
// 判断输入类型11位纯数字识别为手机号否则识别为邀请码
if (preg_match('/^\d{11}$/', $input)) {
// 手机号模式
$inviter = UserModel::where('mobile', $input)
->where('status', 'normal')
->field(['id', 'nickname', 'avatar', 'invite_code', 'mobile'])
->find();
} else {
// 邀请码模式
$input = strtoupper($input);
if (strlen($input) !== 6) {
return ['code' => 0, 'msg' => '邀请信息格式错误'];
}
$inviter = UserModel::where('invite_code', $input)
->where('status', 'normal')
->field(['id', 'nickname', 'avatar', 'invite_code', 'mobile'])
->find();
}
if (!$inviter) {
return ['code' => 0, 'msg' => '邀请信息无效'];
}
return [
'code' => 1,
'msg' => '邀请信息有效',
'data' => [
'user_id' => $inviter->id,
'invite_code' => $inviter->invite_code,
'inviter' => [
'id' => $inviter->id,
'nickname' => $inviter->nickname,
'avatar' => $inviter->avatar
]
]
];
}
/**
* 绑定上下级关系
* @param string $inviteCode 邀请码或手机号
* @param int $userId 被邀请人ID
* @return array
*/
public static function bind($inviteCode, $userId)
{
$input = trim($inviteCode);
$user = UserModel::find($userId);
if (!$user) {
return ['code' => 0, 'msg' => '用户不存在'];
}
// 已绑定过上级
if ($user->parent_user_id !== null) {
return ['code' => 0, 'msg' => '您已有推荐人,无法修改'];
}
// 验证邀请码或手机号
$validateResult = self::validate($input);
if ($validateResult['code'] != 1) {
return $validateResult;
}
$inviterUserId = $validateResult['data']['user_id'];
// 不能邀请自己
if ($inviterUserId == $userId) {
return ['code' => 0, 'msg' => '不能使用自己的邀请信息'];
}
// 绑定
$user->parent_user_id = $inviterUserId;
$user->invite_code_used = $validateResult['data']['invite_code']; // 统一使用邀请码保存
$user->save();
// 判断是手机号还是邀请码用于日志
$inputType = preg_match('/^\d{11}$/', $input) ? '手机号' : '邀请码';
\think\Log::info("邀请绑定: 邀请人[{$inviterUserId}] -> 被邀请人[{$userId}] {$inputType}[{$input}]");
// 触发分销业绩统计
$agent = new \addons\shopro\service\commission\Agent($userId);
$agent->createAsyncAgentUpgrade($userId);
// 添加分销推广记录
\app\admin\model\shopro\commission\Log::add(
$inviterUserId,
'share',
['user' => $user, 'type' => 'invite_code']
);
return [
'code' => 1,
'msg' => '绑定成功',
'data' => $validateResult['data']
];
}
}