PHP后台实现微信小程序登录


Posted in PHP onAugust 03, 2018

微信小程序官方给了十分详细的登陆时序图,当然为了安全着想,应该加上签名加密。

PHP后台实现微信小程序登录

微信小程序端

1).调用wx.login获取 code 。
2).调用wx.getUserInfo获取签名所需的 rawData , signatrue , encryptData 。
3).发起请求将获取的数据发送的后台。

login: function(e) {
  var that = this;
  wx.login({
   success: function(res){
   var code = res.code; //获取code
   wx.getUserInfo({ //得到rawData, signatrue, encryptData
    success: function(data){
    var rawData = data.rawData;
    var signature = data.signature;
    var encryptedData = data.encryptedData; 
    var iv = data.iv;
    wx.request({
     url: '你自己的后台地址',
     data: {
     "code" : code,
     "rawData" : rawData,
     "signature" : signature,
     'iv' : iv,
     'encryptedData': encryptedData
     },
     method: 'GET', 
     success: function(info){
     console.log(info);
     }
    })
    }
   })
   },
  })
 }

服务端

需下载微信官方解密文件。 —— [ 用户数据的签名验证和加解密 ]

1.解压后会出现不同语言的文件包,这里用的是PHP,将文件夹放到vendor目录下。
2.根据登陆凭证 code 获取 session_key 和 openid。
3.数据签名校验。
4.数据解密。
5.生成第三方3rd_session并返回微信小程序端。

/*
  *登录(调用wx.login获取)
  * @param $code string
  * @param $rawData string
  * @param $signatrue string
  * @param $encryptedData string
  * @param $iv string
  * @return $code 成功码
  * @return $session3rd 第三方3rd_session
  * @return $data 用户数据
 */
 public function login()
 {
  //开发者使用登陆凭证 code 获取 session_key 和 openid
  $APPID = '';//自己配置
  $AppSecret = '';//自己配置
  $code = input('code');
  $url = "https://api.weixin.qq.com/sns/jscode2session?appid=" . $APPID . "&secret=" . $AppSecret . "&js_code=" . $code . "&grant_type=authorization_code";
  $arr = $this->vget($url); // 一个使用curl实现的get方法请求
  $arr = json_decode($arr, true);
  $openid = $arr['openid'];
  $session_key = $arr['session_key'];
  // 数据签名校验
  $signature = input('signature');
  $rawData = Request::instance()->post('rawData');
  $signature2 = sha1($rawData . $session_key);
  if ($signature != $signature2) {
   return json(['code' => 500, 'msg' => '数据签名验证失败!']);
  }
  Vendor("PHP.wxBizDataCrypt"); //加载解密文件,在官方有下载
  $encryptedData = input('encryptedData');
  $iv = input('iv');
  $pc = new \WXBizDataCrypt($APPID, $session_key);
  $errCode = $pc->decryptData($encryptedData, $iv, $data); //其中$data包含用户的所有数据
  $data = json_decode($data);
  if ($errCode == 0) {
   dump($data);
   die;//打印解密所得的用户信息
  } else {
   echo $errCode;//打印失败信息
  }
 }

 public function vget($url){
  $info=curl_init();
  curl_setopt($info,CURLOPT_RETURNTRANSFER,true);
  curl_setopt($info,CURLOPT_HEADER,0);
  curl_setopt($info,CURLOPT_NOBODY,0);
  curl_setopt($info,CURLOPT_SSL_VERIFYPEER, false);
  curl_setopt($info,CURLOPT_SSL_VERIFYHOST, false);
  curl_setopt($info,CURLOPT_URL,$url);
  $output= curl_exec($info);
  curl_close($info);
  return $output;
}

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

PHP 相关文章推荐
PHP 5昨天隆重推出--PHP 5/Zend Engine 2.0新特性
Oct 09 PHP
PHP sprintf() 函数的应用(定义和用法)
Jun 29 PHP
有关PHP性能优化的介绍
Jun 20 PHP
php输出1000以内质数(素数)示例
Feb 16 PHP
ThinkPHP上使用多说评论插件的方法
Oct 31 PHP
在Mac上编译安装PHP7的开发环境
Jul 28 PHP
Zend Framework教程之资源(Resources)用法实例详解
Mar 14 PHP
php对接java现实加签验签的实例
Nov 25 PHP
ThinkPHP3.2框架自定义配置和加载用法示例
Jun 14 PHP
PHP预定义超全局数组变量小结
Aug 20 PHP
PHP的PDO事务与自动提交
Jan 24 PHP
详解PHP用mb_string处理windows中文字符
May 26 PHP
thinkPHP5框架闭包函数与子查询传参用法示例
Aug 02 #PHP
PHP实现的AES加密、解密封装类与用法示例
Aug 02 #PHP
lnmp安装多版本PHP共存的方法详解
Aug 02 #PHP
Laravel5框架添加自定义辅助函数的方法
Aug 01 #PHP
PHP实现数组根据某个单元字段排序操作示例
Aug 01 #PHP
PHP实现的分解质因数操作示例
Aug 01 #PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 #PHP
You might like
thinkphp缓存技术详解
2014/12/09 PHP
php使用NumberFormatter格式化货币的方法
2015/03/21 PHP
[原创]php实现子字符串位置相互对调互换的方法
2016/06/02 PHP
cnblogs 代码高亮显示后的代码复制问题解决实现代码
2011/12/14 Javascript
jquery 获取自定义属性(attr和prop)的实现代码
2012/06/27 Javascript
JavaScript事件处理器中的event参数使用介绍
2013/05/24 Javascript
JQuery中使用ajax传输超大数据的解决方法
2014/07/14 Javascript
Javascript 构造函数详解
2014/10/22 Javascript
拖动时防止选中
2017/02/03 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
使用openSpeDiv方法实现Ecshop登录弹窗框效果
2017/03/13 Javascript
详解Angular2 关于*ngFor 嵌套循环
2017/05/22 Javascript
Vuex利用state保存新闻数据实例
2017/06/28 Javascript
nginx部署访问vue-cli搭建的项目的方法
2018/02/12 Javascript
webpack中的热刷新与热加载的区别
2018/04/09 Javascript
vue中的$emit 与$on父子组件与兄弟组件的之间通信方式
2018/05/13 Javascript
es6 symbol的实现方法示例
2019/04/02 Javascript
在Vue环境下利用worker运行interval计时器的步骤
2019/08/01 Javascript
jQuery提示框插件SweetAlert用法分析
2019/08/05 jQuery
在vs code 中如何创建一个自己的 Vue 模板代码
2020/11/10 Javascript
[04:20]DOTA2-DPC中国联赛 正赛 VG vs LBZS 选手采访 1月19日
2021/03/11 DOTA
对web.py设置favicon.ico的方法详解
2018/12/04 Python
python 使用matplotlib 实现从文件中读取x,y坐标的可视化方法
2019/07/04 Python
家得宝加拿大家装网上商店:The Home Depot加拿大
2016/08/27 全球购物
Omio意大利:全欧洲低价大巴、火车和航班搜索和比价
2017/12/02 全球购物
锐步美国官方网站:Reebok美国
2018/01/10 全球购物
澳大利亚在线购买葡萄酒:The Wine Collective
2020/02/20 全球购物
包装类的功能、种类、常用方法
2012/01/27 面试题
Python里面如何拷贝一个对象
2014/02/17 面试题
会计实习生工作总结的自我评价
2013/10/07 职场文书
大学毕业生求职自荐信
2014/02/20 职场文书
作文评语怎么写
2014/12/25 职场文书
美术教师个人总结
2015/02/06 职场文书
2016年小学“公民道德宣传日”活动总结
2016/04/01 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python