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

作者:jinduo 时间:2024-06-05 15:40:52 

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

微信的头像 / 0

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

小头像默认 / 132

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

4. 后端上面就写好了,再看下小程序端怎么做的哈,打开小程序的 app.json,添加 "pages/auth/auth",


{
"pages": [
 "pages/index/index",
 "pages/auth/auth",//做一个登录页面
 "pages/logs/logs"
],
"window": {
 "backgroundTextStyle": "light",
 "navigationBarBackgroundColor": "#fff",
 "navigationBarTitleText": "WeChat",
 "navigationBarTextStyle": "black"
},
"sitemapLocation": "sitemap.json",
"permission": {
 "scope.userLocation": {
  "desc": "你的位置信息将用于小程序位置接口的效果展示"
 }
}
}

5. 打开 auth.js


const app = getApp();
Page({
/**
 * 页面的初始数据
 */
data: {
 UserData: [],
 isClick: false,
},
/**
 * 生命周期函数--监听页面加载
 */
onLoad: function(options) {

},
login: function(e) {
 let that=this
 that.setData({
  isClick: true
 })
 wx.getUserInfo({
  lang: "zh_CN",
  success: response => {
   wx.login({
    success: res => {
     let data = {
      code:res.code,
      nickname: response.userInfo.nickName,
      avatar: response.userInfo.avatarUrl,
      country: response.userInfo.country ? response.userInfo.country : '',
      province: response.userInfo.province ? response.userInfo.province : '',
      city: response.userInfo.city ? response.userInfo.city : '',
      gender: response.userInfo.gender ? response.userInfo.gender : '',
      language: response.userInfo.language ? response.userInfo.language : '',
     }
     console.log(data)
     app.globalData.userInfo = data;
     wx.request({
      url: '你的后端地址',//我用的valet,http://ak.name/api/v1/user/login
      method: 'POST',
      data: data,
      header: {
       'Content-Type': 'application/x-www-form-urlencoded'
      },
      success: function (res) {
       console.log(res)
       if (res.statusCode != '200') {
        return false;
       }
       wx.setStorageSync('access_token', res.data.access_token)
       wx.setStorageSync('UserData', res.data.data ? res.data.data : '')
       wx.redirectTo({
        url: '/pages/index/index',
       })
      },
      fail: function (e) {
       wx.showToast({
        title: '服务器错误',
        duration: 2000
       });
       that.setData({
        isClick: false
       })
      },
     });
    }
   })
  },
  fail: function (e) {
   that.setData({
    isClick: false
   })
  },
 })

}
})

6. 打开 auth.wxml


<view class='padding-xl'>
<button class='cu-btn margin-top bg-green shadow lg block' open-type="getUserInfo" bindgetuserinfo="login" disabled="{{isClick}}" type='success'>
 <text wx:if="{{isClick}}" class='cuIcon-loading2 iconfont-spin'></text> 微信登录</button>
</view>

来源:https://learnku.com/weapp/t/28680

标签:Laravel,小程序,用户登录
0
投稿

猜你喜欢

  • python unichr函数知识点总结

    2022-02-03 11:48:31
  • pandas数据筛选和csv操作的实现方法

    2022-04-23 15:36:21
  • PHP正则表达式替换<pre>标签外的内容

    2023-05-22 10:47:12
  • python信号量,条件变量和事件详解

    2021-10-06 18:14:23
  • Mysql 查询JSON结果的相关函数汇总

    2024-01-23 22:30:16
  • Python数据结构与算法之图的广度优先与深度优先搜索算法示例

    2022-05-05 07:34:53
  • 使用Python创建简单的HTTP服务器的方法步骤

    2023-07-17 01:33:27
  • python数字类型和占位符详情

    2022-10-03 06:36:32
  • SQLServer2008提示评估期已过解决方案

    2024-01-22 02:01:28
  • 多种语言下获取当前页完整URL及其参数

    2022-02-28 23:23:29
  • 如何使用 Vuex的入门教程

    2024-05-28 16:00:48
  • python中的代码运行时间获取方式

    2023-11-19 22:57:02
  • Go应该如何实现二级缓存

    2024-02-19 17:07:53
  • 解决Mac node版本升级失败的问题

    2024-05-13 09:34:52
  • python for循环内输出和外输出方式

    2022-09-25 10:19:06
  • Python实现将MongoDB中的数据导入到MySQL

    2024-01-21 04:41:01
  • Python开发自定义Web框架的示例详解

    2023-05-23 19:43:43
  • flask-socketio实现WebSocket的方法

    2022-09-25 17:26:24
  • PyQt5实现界面(页面)跳转的示例代码

    2023-06-21 18:48:43
  • Python大数据量文本文件高效解析方案代码实现全过程

    2023-01-18 04:57:01
  • asp之家 网络编程 m.aspxhome.com