` 采集), * 新用户直接落库、老用户填了就更新,保证后台「会员列表」能看到真实微信昵称与头像。 */ public function wxLogin() { $code = trim((string)$this->input('code', '')); if (!$code) { $this->fail('缺少微信授权 code'); } $nickname = trim((string)$this->input('nickname', '')); $avatar = trim((string)$this->input('avatar', '')); if (mb_strlen($nickname) > 32) { $nickname = mb_substr($nickname, 0, 32); } $openid = $this->resolveOpenid($code); $ext = Db::name('fc_user_ext')->where('openid', $openid)->find(); $user = $ext ? Db::name('user')->where('id', $ext['user_id'])->find() : null; if (!$user) { // 首次登录:自动建号(有微信昵称/头像就落库,否则用占位昵称 + 字母头像) $uid = Db::name('user')->insertGetId([ 'group_id' => 1, 'username' => 'wx' . substr(md5($openid), 0, 10), 'nickname' => $nickname !== '' ? $nickname : '同城用户' . mt_rand(1000, 9999), 'password' => md5(mt_rand()), 'salt' => 'wx', 'email' => substr(md5($openid), 0, 12) . '@wx.local', 'mobile' => '', 'avatar' => $avatar, 'level' => 1, 'money' => 0, 'score' => 0, 'status' => 'normal', 'jointime' => time(), 'joinip' => $this->request->ip(), 'createtime' => time(), 'updatetime' => time(), ]); Db::name('fc_user_ext')->insert([ 'user_id' => $uid, 'openid' => $openid, 'user_type' => 1, 'realname_status' => 0, 'is_member' => 0, 'member_level' => '', 'member_expiretime' => null, 'invite_code' => strtoupper(substr(md5('fc' . $uid), 0, 6)), 'inviter_id' => 0, 'free_view_date' => date('Y-m-d'), 'free_view_used' => 0, 'createtime' => time(), 'updatetime' => time(), ]); $user = Db::name('user')->where('id', $uid)->find(); } else { // 老用户:仅在本次带上了新值且确实不同时更新(不覆盖运营在后台改过的资料) $update = []; if ($nickname !== '' && $nickname !== (string)$user['nickname']) { $update['nickname'] = $nickname; } if ($avatar !== '' && $avatar !== (string)$user['avatar']) { $update['avatar'] = $avatar; } if ($update) { $update['updatetime'] = time(); Db::name('user')->where('id', $user['id'])->update($update); $user = Db::name('user')->where('id', $user['id'])->find(); } } if ($user['status'] != 'normal') { $this->fail('账号已被禁用,请联系客服'); } $token = $this->issueToken($user['id']); $this->ok([ 'token' => $token, 'refreshToken' => md5($token . 'refresh'), 'userInfo' => $this->userInfo($user), ]); } /** * A2 手机号授权绑定 * 入参 { phone } → 出参 { phone } * 规则 BR-02:必须匹配 ^1\d{10}$ */ public function bindPhone() { $user = $this->auth(); $phone = trim((string)$this->input('phone', '')); if (!preg_match('/^1\d{10}$/', $phone)) { $this->fail('手机号格式不正确'); } Db::name('user')->where('id', $user['id'])->update([ 'mobile' => $phone, 'updatetime' => time(), ]); $this->ok(['phone' => $phone]); } /** * A5 微信手机号快捷获取 * 入参 { code }(`