PHP —— 用 ThinkPHP5.0 实现微信小程序登陆

《工欲善其事,必先利其器》
大家好,之前学习了 原生 PHP 和框架,今天我们运用框架 TP5.0 来实现一下微信小程序的用户登陆以及获取用户的信息接口。

一、创建 Wxuser 模型

一般 MVC 框架的数据操作,都是在 Model 层里面的,所以这里我们需要实现微信登陆的模型,代码如下,分为几个小功能点:

  1. 使用前端发来的 code 去换取 openid;
  2. 利用 openid 生成 token;
  3. 将 openid 和 token 以及用户信息入库。
<?php
namespace app\api\model; // 命名空间,根据自己的项目路径来生成
use think\Model; // 引入tp框架的Model类
use app\common\exception\BaseException; // 引入基础错误捕捉类
use think\Db; // 引入 tp 框架的Db类
use think\Cache; // 引入 tp 框架的缓存类class Wxuser extends Model {private $appId;private $appSecret;public $error;public $token;protected $resultSetType = "collection"; // 设置返回类型protected $autoWriteTimestamp = true; // 自动记录时间戳/*** Wxuser constructor* @param $appId* @param $appSecret*/public function __construct() {$appKey = Db::name("appkey")->find(); // 查找管理后台入库的小程序信息$this->appId = $appKey["appId"];$this->appSecret = $appKey["appSecret"];}/*** 获取用户信息* @param $token* @return null|static* @throws \think\exception\DbException*/public static function getUser($token) {$open_id = Cache::get($token)['openid'];$userInfo = DB::name("wxuser")->where("open_id",$open_id)->find();if ($userInfo) {$userInfo["create_time"] = date('Y-m-d',$userInfo["create_time"]);$userInfo["update_time"] = date('Y-m-d',$userInfo["update_time"]);}return $userInfo;}/*** 用户登陆*/public function login($post) {// 微信登陆 获取session_key$session = $this->wxlogin($post["code"]);// 自动注册用户$user_id = $this->register($session["openid"],$post["nickName"],$post["avatarUrl"],$post["gender"]);// 生成token$this->token = $this->token($session["openid"]);// 记录缓存 7天Cache::set($this->token, $session, 86400 * 7);return $user_id;}/*** 微信登陆* @param $code* @return array|mixed* @throws BaseException* @throws \think\exception\DbException*/private function wxlogin($code) {// 获取当前小程序信息if (empty($this->appId) || empty($this->appSecret)) {throw new BaseException(['msg' => '请到 [后台-小程序设置] 填写appid 和 appsecret']);}// 微信登录 (获取session_key)if (!$session = $this->sessionKey($code)) {throw new BaseException(['msg' => $this->error]);}return $session;}/*** 获取session_key* @param $code* @return array|mixed*/public function sessionKey($code) {/*** code 换取 session_key* ​这是一个 HTTPS 接口,开发者服务器使用登录凭证 code 获取 session_key 和 openid。* 其中 session_key 是对用户数据进行加密签名的密钥。为了自身应用安全,session_key 不应该在网络上传输。*/$url = 'https://api.weixin.qq.com/sns/jscode2session';$result = json_decode(curl($url, ['appid' => $this->appId,'secret' => $this->appSecret,'grant_type' => 'authorization_code','js_code' => $code]), true);if (isset($result['errcode'])) {$this->error = $result['errmsg'];return false;}return $result;}/*** 生成用户认证的token* @param $openid* @return string*/private function token($openid) {return md5($openid . 'token_salt');}/*** 获取token* @return mixed*/public function getToken() {return $this->token;}/*** 自动注册用户* @param $open_id* @param $userInfo* @return mixed* @throws BaseException* @throws \think\exception\DbException*/private function register($open_id, $nickName,$avatarUrl,$gender) {$userInfo['open_id'] = $open_id;$userInfo['nickName'] = preg_replace('/[\xf0-\xf7].{3}/', '', $nickName);$userInfo['avatarUrl'] = $avatarUrl;$userInfo['gender'] = $gender+1;$data=Db::name('wxuser')->where('open_id',$open_id)->find();if(!$data){$userInfo['create_time']=time();     $userInfo['update_time']=time();   $user_id = Db::name('wxuser')->insertGetId($userInfo);if (!$user_id) {return json_encode(['code'=>0,'msg' => '用户注册失败']);}return $user_id;}else{$userInfo['update_time']=time();Db::name('wxuser')->where('id',$data['id'])->update($userInfo);return $data['id'];}}
}
?>

二、创建 login 控制器

实现登陆 Controller 主要就是接收前端发送来的数据,然后把数据进行提纯处理。只留下有需要的部分,再将数据传递给 Model。

<?php
namespace app\api\controller;
use app\common\exception\BaseException;
use think\Controller;
use app\api\model\Wxuser;
use think\Db;
use think\Request; // 引入 tp 请求体类class User extends Controller {/*** 用户自动登录* @return array* @throws \app\common\exception\BaseException* @throws \think\Exception* @throws \think\exception\DbException*/public function login() {$model = new Wxuser;$user_id = $model->login($this->request->post());$token = $model->getToken();  return json_encode(['code'=>200,'user_id' => $user_id,'token'=>$token]);}/*** 获取用户信息* @return array* @throws \app\common\exception\BaseException* @throws \think\Exception* @throws \think\exception\DbException*/public function loginInfo() {if (!$token = $this->request->param("token")) {throw new BaseException(['code' => 0, 'msg' => '缺少必要的参数:token']);}if (!$user = Wxuser::getUser($token)) {throw new BaseException(['code' => 0, 'msg' => '没有找到用户信息']);}return json_encode(['code'=>200,'data'=>$user]);}
}
?>

三、前端小程序登陆部分

前端就比较简单了,分为三个小功能点:

  1. 调用 wx.login API 获取用户的 code;
  2. 调用 wx.getUserProfile API 获取用户的个人信息;
  3. 调用上面实现的 login 接口,把个人信息和 code 传递给后端。
const loginApi = 'api/user/login'; // 对应 tp 的控制器路径
onLoad: function () {wx.login({success: res => {this.data.code = res.code;}})
},// 这里就没有做 微信获取用户API的 适配了,有需要的自己上网查一下,搜索 canIUse
getUserProfile: function() {wx.getUserProfile({desc: '用户完善个人资料',success: res => {http.request(loginApi,{nickName: res.userInfo.nickName,//用户昵称avatarUrl: res.userInfo.avatarUrl,//用户LOGOcode: this.data.code,//code值gender: res.userInfo.gender//性别},res=>{wx.setStorageSync('token', res.token)wx.setStorageSync('user_id', res.user_id)wx.navigateBack({delta: 1})})},fail: function() {//用户按了拒绝按钮wx.showModal({title: '警告',content: '您已拒绝授权,将无法正常读取数据,请授权之后再进入!!!',showCancel: false,confirmText: '确认',success: function (res) {if (res.confirm) {wx.navigateBack({delta: 1})}}})}})
}



四、前端小程序获取用户数据

const userApi = '/api/user/info'; // 对应 tp 控制器路径
var token;onLoad: function(options) {token = wx.getStorageSync('token');//获取用户数据this.getUserData();
},getUserData() {http.getData(userApi, {token: token}, res => {if (res.code == 200) {that.setData({userLogo: res.data.avatarUrl,userName: res.data.nickName,time: res.data.update_time})}})
}

PHP —— 用 ThinkPHP5.0 实现微信小程序登陆相关推荐

  1. php与ipa接口登录验证失败,thinkPHP5.0开发微信小程序登录接口signature验证失败

    我用TP5开发微信小程序登录接口的时候,在校验签名signature那遇到了个坑,一直校验失败,找了很久才发现 原因是:tp的input方法会自动转移html字符,比如'"'转成了 & ...

  2. yuml 保存为图片_Towxml 3.0 让微信小程序支持 LaTex 数学公式及 yuml 流程图

    Towxml 3.0 让微信小程序支持 LaTex 数学公式及 yuml 流程图 Towxml 是一个让小程序可以解析 Markdown,html 的解析库. 能够使小程序完美解析 Markdown ...

  3. 微信小程序-登陆注册滑块验证

    微信小程序-登陆注册滑块验证 一.创建自定义组件MoveVerify 二.在index页面使用 一.创建自定义组件MoveVerify MoveVerify.js Component({/*** 组件 ...

  4. 微信小程序登陆凭证校验出现{errcode:40029,errmsg:invalid code, hints: [ req_id: weh8ka0297hc58 ]}

    问题描述: 微信小程序登陆校验时需要使用临时登录凭证code ,appID和appsecret获取 session_key 和 openid 等.但是后台向微信服务器请求时一直报{"errc ...

  5. 微信小程序——登陆凭证校验报错{errcode:40029,errmsg:invalid code, hints: [ req_id: weh8ka0297hc58 ]}

    微信小程序登陆校验时需要使用临时登录凭证code ,appID和appsecret来向微信服务接口来获取 session_key 和 openid .但是后台向微信服务器请求时得到的一直是{" ...

  6. thinkphp5+workerman搭建微信小程序socket后台,建立自己的聊天室

    为什么80%的码农都做不了架构师?>>>    1.下载安装tp5 这一步就不详细说了,比较简单,直接看TP文档吧 2.通过composer,为tp5集成workermantp 官方 ...

  7. 基于Thinkphp5+EasyWeChat+fastadmin微信小程序授权登录获取手机号微信公众号网页---联合授权登录

    战前准备 1.使用 composer 安装 EasyWeChat $ composer require overtrue/wechat:~4.0 -vvv 或者在composer.json文件renq ...

  8. Towxml 3.0让微信小程序支持LaTex数学公式及yuml流程图

    Towxml 是一个让小程序可以解析Markdown.HTML的解析库.能够使小程序完美解析Markdown内容. 根据用户的反馈和小程序提供的API对Towxml进行了完成的重写.陆续间断地经历了近 ...

  9. 微信小程序登陆,后端接口实现 - springboot

    登录流程 1.通过调用wx.login获取登录凭证(code) uni-app通过调用uni.login 2.前端将code提交给服务器,springboot访问 auth.code2Session, ...

最新文章

  1. GitHub上中国顶尖大学的课程资源共享计划
  2. C#使用ExecuteReader返回DataReader既有查询结果集又有输出参数或返回值的使用注意事项...
  3. 怎样格式化电脑_160G移动硬盘做PE启动盘 要怎样做
  4. 理解jmeter聚合报告
  5. spark读取hbase数据
  6. django-url的分发, 2)起别名, 3)根目录,4)rediect跳转函数:
  7. NOIP2018退役记
  8. OpenCV:No value has been specified for property 'manifestOutputDirectory'
  9. 使用Visual Studio Code调试运行在SAP云平台上处于运行状态的nodejs应用
  10. mysql中的编码问题_mysql存储乱码之编码问题
  11. Hystrix面试 - 基于 timeout 机制为服务接口调用超时提供安全保护
  12. python无效语法怎么解决_在Python的Django框架中调用方法和处理无效变量
  13. 开源界也要注意,Apache 基金会与 GitHub 都受美国法律约束
  14. TUXEDO运行监控命令概述
  15. Windows CE 5.0待机界面定制之一 - Taskbar的位置
  16. 1. Window环境下 - 开发环境的配置: (安装Android Studio 2.1)
  17. 封装一个cookie
  18. 三维实景建模如何进行?有哪些作用
  19. 电子邮箱地址如何注册?个人电子邮箱地址大全
  20. STM32F103C8T6详细引脚表

热门文章

  1. a标签download属性
  2. 甲方---乙方(第一篇)
  3. 3000组装游戏电脑2021 2021年3000元游戏电脑最强组装
  4. 网络透视技术资料及学习笔记
  5. 登录界面之Axure原型制作
  6. Leetcode 939:最小面积矩形(最详细的解法!!!)
  7. linux如何使history命令可以显示更多信息
  8. deepstream检测帧率很高,但是视频有延迟和拖延情况(问题解决)
  9. linux内核污染tainted
  10. 只有一条路不能拒绝——那就是成长的路