接上篇微信小程序后端搭建:分享:Laravel 微信小程序后端搭建
后端搭建好后第一件事就是用户登录认证,简单实现微信小程序登录认证
1.user 模型
use Laravel\Passport\HasApiTokens; 新增
use HasApiTokens, Notifiable; protected $fillable = [ 'id', 'name', 'email', 'email_verified_at', 'username', 'phone', 'avatar',//我用来把微信头像的/0清晰图片,存到又拍云上 'weapp_openid', 'nickname', 'weapp_avatar', 'country', 'province', 'city', 'language', 'location', 'gender', 'level',//用户等级 'is_admin',//is管理员 ];
2. 新增一条路由
//前端小程序拿到的地址:https://域名/api/v1/自己写的接口
Route::group(['prefix' => '/v1'], function () {
Route::post('/user/login', 'UserController@weappLogin');
});
3. 在 UserController 控制器里新建 function weappLogin (),别忘了 use 这些
use App\User; use Carbon\Carbon; use Illuminate\Http\Request; use Illuminate\Support\Facades\Storage;
写两个 function weappLogin (),avatarUpyun ()
public function weappLogin(Request $request)
{
$code = $request->code;
// 根据 code 获取微信 openid 和 session_key
$miniProgram = \EasyWeChat::miniProgram();
$data = $miniProgram->auth->session($code);
if (isset($data['errcode'])) {
return $this->response->errorUnauthorized('code已过期或不正确');
}
$weappOpenid = $data['openid'];
$weixinSessionKey = $data['session_key'];
$nickname = $request->nickname;
$avatar = str_replace('/132', '/0', $request->avatar);//拿到分辨率高点的头像
$country = $request->country?$request->country:'';
$province = $request->province?$request->province:'';
$city = $request->city?$request->city:'';
$gender = $request->gender == '1' ? '1' : '2';//没传过性别的就默认女的吧,体验好些
$language = $request->language?$request->language:'';
//找到 openid 对应的用户
$user = User::where('weapp_openid', $weappOpenid)->first();
//没有,就注册一个用户
if (!$user) {
$user = User::create([
'weapp_openid' => $weappOpenid,
'weapp_session_key' => $weixinSessionKey,
'password' => $weixinSessionKey,
'avatar' => $request->avatar?$this->avatarUpyun($avatar):'',
'weapp_avatar' => $avatar,
'nickname' => $nickname,
'country' => $country,
'province' => $province,
'city' => $city,
'gender' => $gender,
'language' => $language,
]);
}
//如果注册过的,就更新下下面的信息
$attributes['updated_at'] = now();
$attributes['weixin_session_key'] = $weixinSessionKey;
$attributes['weapp_avatar'] = $avatar;
if ($nickname) {
$attributes['nickname'] = $nickname;
}
if ($request->gender) {
$attributes['gender'] = $gender;
}
// 更新用户数据
$user->update($attributes);
// 直接创建token并设置有效期
$createToken = $user->createToken($user->weapp_openid);
$createToken->token->expires_at = Carbon::now()->addDays(30);
$createToken->token->save();
$token = $createToken->accessToken;
return response()->json([
'access_token' => $token,
'token_type' => "Bearer",
'expires_in' => Carbon::now()->addDays(30),
'data' => $user,
], 200);
}
//我保存到又拍云了,版权归腾讯所有。。。头条闹的
private function avatarUpyun($avatar)
{
$avatarfile = file_get_contents($avatar);
$filename = 'avatars/' . uniqid() . '.png';//微信的头像链接我也不知道怎么获取后缀,直接保存成png的了
Storage::disk('upyun')->write($filename, $avatarfile);
$wexinavatar = config('filesystems.disks.upyun.protocol') . '://' . config('filesystems.disks.upyun.domain') . '/' . $filename;
return $wexinavatar;//返回链接地址
}
内容版权声明:除非注明,否则皆为本站原创文章。
