fengketrade/addons/shopro/library/InviteHelper.php
2025-10-29 12:01:14 +08:00

150 lines
4.0 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)
{
$inviteCode = strtoupper(trim($inviteCode));
if (strlen($inviteCode) !== 6) {
return ['code' => 0, 'msg' => '邀请码格式错误'];
}
$inviter = UserModel::where('invite_code', $inviteCode)
->where('status', 'normal')
->field(['id', 'nickname', 'avatar', 'invite_code'])
->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)
{
$inviteCode = strtoupper(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($inviteCode);
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 = $inviteCode;
$user->save();
\think\Log::info("邀请码绑定: 邀请人[{$inviterUserId}] -> 被邀请人[{$userId}] 邀请码[{$inviteCode}]");
// 触发分销业绩统计
$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']
];
}
}