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 相关文章推荐
粗略计算在线时间,bug:ip相同
Dec 09 PHP
将一维或多维的数组连接成一个字符串的php代码
Aug 08 PHP
做了CDN获取用户真实IP的函数代码(PHP与Asp设置方式)
Apr 13 PHP
php实现水仙花数示例分享
Apr 03 PHP
CodeIgniter CLI模式简介
Jun 17 PHP
PHP调用.NET的WebService 简单实例
Mar 27 PHP
Yii2框架中使用PHPExcel导出Excel文件的示例
Aug 09 PHP
PHP 进度条函数的简单实例
Sep 19 PHP
LaravelS通过Swoole加速Laravel/Lumen详解
Mar 02 PHP
bindParam和bindValue的区别以及在Yii2中的使用详解
Mar 12 PHP
原生php实现excel文件读写的方法分析
Apr 25 PHP
php用wangeditor3实现图片上传功能
Aug 22 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获取文件后缀名的三个函数
2012/10/15 PHP
Smarty模板配置实例简析
2019/07/20 PHP
javascript验证只能输入数字和一个小数点示例
2013/10/21 Javascript
JavaScript控制各种浏览器全屏模式的方法、属性和事件介绍
2014/04/03 Javascript
javascript作用域和闭包使用详解
2014/04/25 Javascript
一个获取第n个元素节点的js函数
2014/09/02 Javascript
jQuery+HTML5实现手机摇一摇换衣特效
2015/06/05 Javascript
javascript实现确定和取消提示框效果
2015/07/10 Javascript
使用jquery插件qrcode生成二维码
2015/10/22 Javascript
bootstrap网页框架的使用方法
2016/05/10 Javascript
JS中对Cookie的操作详解
2016/08/05 Javascript
JavaScript使用readAsDataUrl方法预览图片
2017/05/10 Javascript
p5.js入门教程和基本形状绘制
2018/03/15 Javascript
Vue使用json-server进行后端数据模拟功能
2018/04/17 Javascript
Vue 父子组件数据传递的四种方式( inheritAttrs + $attrs + $listeners)
2018/05/04 Javascript
vue图片上传本地预览组件使用详解
2019/02/20 Javascript
Vue将页面导出为图片或者PDF
2020/08/17 Javascript
Node对CommonJS的模块规范
2019/11/06 Javascript
Vue实现点击按钮复制文本内容的例子
2019/11/09 Javascript
使用python判断jpeg图片的完整性实例
2019/06/10 Python
python基于socket函数实现端口扫描
2020/05/28 Python
Python常用类型转换实现代码实例
2020/07/28 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
2020/12/31 Python
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
英国名牌服装购物网站:OD’s Designer
2019/09/02 全球购物
应届大学生自荐信
2013/12/05 职场文书
补充协议书范本
2014/04/23 职场文书
八荣八耻演讲稿
2014/09/15 职场文书
校长师德师风自我剖析材料
2014/09/29 职场文书
2014光棍节单身联谊活动策划书
2014/10/10 职场文书
支行行长竞聘报告
2014/11/06 职场文书
2015年农村党员干部主题教育活动总结
2015/03/25 职场文书
聚众斗殴罪辩护词
2015/05/21 职场文书
在Python中如何使用yield
2021/06/07 Python
SONY AN-LP1 短波有源天线放大器图
2022/04/05 无线电
python实现手机推送 代码也就10行左右
2022/04/12 Python