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


Posted in PHP onNovember 26, 2019

接上篇微信小程序后端搭建:分享: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>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

PHP 相关文章推荐
桌面中心(四)数据显示
Oct 09 PHP
构建简单的Webmail系统
Oct 09 PHP
PHP读写文件的方法(生成HTML)
Nov 27 PHP
6种php上传图片重命名的方法实例
Nov 04 PHP
php生成shtml类用法实例
Dec 09 PHP
PHP多进程编程总结(推荐)
Jul 18 PHP
Yii框架分页实现方法详解
May 20 PHP
解决form中action属性后面?传递参数 获取不到的问题
Jul 21 PHP
PHP基于自定义函数生成笛卡尔积的方法示例
Sep 30 PHP
基于PHP-FPM进程池探秘
Oct 17 PHP
PHP按一定比例压缩图片的方法
Oct 12 PHP
PHP如何获取Cookie并实现模拟登录
Jul 16 PHP
Laravel 微信小程序后端搭建步骤详解
Nov 26 #PHP
php 使用expat方式解析xml文件操作示例
Nov 26 #PHP
thinkphp框架类库扩展操作示例
Nov 26 #PHP
如何在Laravel5.8中正确地应用Repository设计模式
Nov 26 #PHP
PHP 进程池与轮询调度算法实现多任务的示例代码
Nov 26 #PHP
PHP PDO和消息队列的个人理解与应用实例分析
Nov 25 #PHP
Laravel Eloquent分表方法并使用模型关联的实现
Nov 25 #PHP
You might like
逐步提升php框架的性能
2008/01/10 PHP
细谈php中SQL注入攻击与XSS攻击
2012/06/10 PHP
php连接odbc数据源并保存与查询数据的方法
2014/12/24 PHP
js 获取和设置css3 属性值的实现方法
2013/05/06 Javascript
浅析js中2个等号与3个等号的区别
2013/08/06 Javascript
javascript图片相似度算法实现 js实现直方图和向量算法
2014/01/14 Javascript
jquery 绑定回车动作扑捉回车键触发的事件
2014/03/26 Javascript
使用原生js写的一个简单slider
2014/04/29 Javascript
ff chrome和ie下全局动态定位的异同及全局高度的取法
2014/06/30 Javascript
一个JavaScript操作元素定位元素的实例
2014/10/29 Javascript
Easyui form combobox省市区三级联动
2016/01/13 Javascript
javascript实现表单验证
2016/01/29 Javascript
Jquery针对tr td的一些实用操作方法(必看篇)
2016/10/05 Javascript
使用Javascript判断浏览器终端设备(PC、IOS(iphone)、Android)
2017/01/04 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
Javascript读写cookie的实例源码
2019/03/16 Javascript
ES6 Class中实现私有属性的一些方法总结
2019/07/08 Javascript
[03:28]2014DOTA2国际邀请赛 走近EG战队天才中单Arteezy
2014/07/12 DOTA
[35:26]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第三局
2016/02/26 DOTA
Python的dict字典结构操作方法学习笔记
2016/05/07 Python
深入理解Django自定义信号(signals)
2018/10/15 Python
Django 视图层(view)的使用
2018/11/09 Python
Python3按一定数据位数格式处理bin文件的方法
2019/01/24 Python
pytorch神经网络之卷积层与全连接层参数的设置方法
2019/08/18 Python
django中上传图片分页三级联动效果的实现代码
2019/08/30 Python
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
Myprotein亚太地区:欧洲第一在线运动营养品牌
2020/12/20 全球购物
大学生求职自我评价
2014/01/16 职场文书
交通安全标语
2014/06/06 职场文书
安全责任书范文
2014/08/25 职场文书
护士长2014年终工作总结
2014/11/11 职场文书
新婚姻法离婚协议书范文
2014/11/30 职场文书
幼儿园老师工作总结2015
2015/05/22 职场文书
学校运动会感想
2015/08/10 职场文书
四则混合运算教学反思
2016/02/23 职场文书
Java Spring读取和存储详细操作
2022/08/05 Java/Android