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
PHP 面向对象实现代码
Nov 11 PHP
php max_execution_time执行时间问题
Jul 17 PHP
解析php中用PHPMailer来发送邮件的示例(126.com的例子)
Jun 24 PHP
解析isset与is_null的区别
Aug 09 PHP
PHP自动生成后台导航网址的最佳方法
Aug 27 PHP
php中使用base HTTP验证的方法
Apr 20 PHP
php打包网站并在线压缩为zip
Feb 13 PHP
PHP生成可点击刷新的验证码简单示例
May 13 PHP
ThinkPHP5.0框架验证码功能实现方法【基于第三方扩展包】
Mar 11 PHP
php常用经典函数集锦【数组、字符串、栈、队列、排序等】
Aug 23 PHP
laravel5 Eloquent 实现事务方式
Oct 21 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通过cookies获取远程网页的指定代码
2013/06/25 PHP
php之curl设置超时实例
2014/11/03 PHP
json跟xml的对比分析
2008/06/10 Javascript
正则表达式搭配js轻松处理json文本方便而老古
2013/02/17 Javascript
JS 屏蔽按键效果与改变按键效果的示例代码
2013/12/24 Javascript
JavaScript学习笔记之取数组中最大值和最小值
2016/03/23 Javascript
两行代码轻松搞定JavaScript日期验证
2016/08/03 Javascript
Async Validator 异步验证使用说明
2017/07/03 Javascript
jQuery动态添加元素无法触发绑定事件的解决方法分析
2018/01/02 jQuery
深入浅析javascript函数中with
2018/10/28 Javascript
微信小程序收货地址API兼容低版本解决方法
2019/05/18 Javascript
nodejs中各种加密算法的实现详解
2019/07/11 NodeJs
vue实现PC端分辨率适配操作
2020/08/03 Javascript
如何使用jQuery操作Cookies方法解析
2020/09/08 jQuery
浅谈js数组splice删除某个元素爬坑
2020/10/14 Javascript
vue项目中使用rem,在入口文件添加内容操作
2020/11/11 Javascript
python类定义的讲解
2013/11/01 Python
Python中集合类型(set)学习小结
2015/01/28 Python
为Python的web框架编写前端模版的教程
2015/04/30 Python
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
python利用不到一百行代码实现一个小siri
2017/03/02 Python
Python编程argparse入门浅析
2018/02/07 Python
Windows系统Python直接调用C++ DLL的方法
2019/08/01 Python
使用Windows批处理和WMI设置Python的环境变量方法
2019/08/14 Python
Python 实现训练集、测试集随机划分
2020/01/08 Python
Python3+RIDE+RobotFramework自动化测试框架搭建过程详解
2020/09/23 Python
印度领先的在线时尚商店:Koovs
2016/08/28 全球购物
Gap工厂店:Gap Factory
2017/11/02 全球购物
土木工程专业自荐信
2013/10/04 职场文书
师范生求职信
2014/06/14 职场文书
国庆宣传标语
2014/06/30 职场文书
农民工预备党员思想汇报
2014/09/14 职场文书
个人融资协议书范本两则
2014/10/15 职场文书
文明单位创建材料
2014/12/24 职场文书
全陪导游词开场白
2015/05/29 职场文书
JS前端使用canvas实现扩展物体类和事件派发
2022/08/05 Javascript