/** * 存储新用户的个人信息 * * @param Weixin_User $user * @param array $weixin * @return Weixin_User */ public static function storeNewUserInfo(Weixin_User $user, array $weixin) { /* * openid, avatar, nickname * */ $user->user_openid = $weixin['id']; $user->user_nickname = $weixin['name']; $user->user_avatar = $weixin['avatar']; $status = $user->save(); if (true === $status) { return $user; } }
/** * Handle an incoming request. * * @param \Illuminate\Http\Request $request * @param \Closure $next * @return mixed */ public function handle($request, Closure $next) { $weixin = $request->session()->get('wechat.oauth_user'); // 不接受无信用的凭证 if (empty($weixin['id']) || strlen($weixin['id']) !== 28) { return abort(405); } // 生成一个随机的userKEY用于会话验证 // 将该session的过期时间设置为比access_token // 的refresh时长多10s,一旦access_token刷新, // userKEY的值会重新计算并存储 $token = $weixin['token']; $refresh = $token['refresh_token']; $expires = $token['expires_in']; // 假设用户数据已经存在于数据库中 $user = Weixin_User::getFullyUserInfoWithOpenID($token['openid']); if (empty($user)) { $user = Weixin_User::storeNewUserInfo(new Weixin_User(), $weixin->toArray()); } $user_id = $user->user_id; $key = 'jk_session:' . $user_id . ':userKEY'; // 存储当前会话消息 $request->session()->put('jukebox_user', $user_id); // 计算并存储userKEY if (!\PRedis::command('get', [$key])) { \PRedis::command('setex', [$key, intval($expires) + 10, str_limit($refresh, 5) . str_random(1)]); } return $next($request); }
/** * 用户希望点击当前歌曲 * * @param Requests\MusicRequest|Request $request * @return string */ public function wish(Requests\MusicRequest $request) { $data = ['flag' => $request->json('flag'), 'user' => $request->session()->pull('jukebox_user')]; // 根据用户的匿名状态获取对应的用户信息 $wish = Weixin_User::getShortlyUserInfoByUser($this->isAnonymity($data)); return $this->promiseUserWish($request, $wish); }
/** * 获取当前用户的个人信息 * * @param Request $request * @param string|integer $user_id * @return array */ private function obtainCurrentUserInfo($request, $user_id) { return valueOrFail(\App\Weixin_User::getFullyUserInfo($user_id)); }