当前位置 主页 > 服务器问题 > Linux/apache问题 >

    Laravel 微信小程序后端实现用户登录的示例代码

    栏目:Linux/apache问题 时间:2019-11-27 10:18

    接上篇微信小程序后端搭建:分享: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;//返回链接地址
      }