fengketrade/addons/shopro/library/InviteHelper.php

150 lines
4.0 KiB
PHP
Raw Normal View History

2025-10-29 12:01:14 +08:00
<?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']
];
}
}