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操作sqlserver关于时间日期读取的小小见解
Nov 29 PHP
ThinkPHP采用模块和操作分析
Apr 18 PHP
几个实用的PHP内置函数使用指南
Nov 27 PHP
thinkphp四种url访问方式详解
Nov 28 PHP
详解PHP实现异步调用的4种方法
Mar 14 PHP
PHP微信分享开发详解
Jan 14 PHP
thinkPHP分页功能实例详解
May 05 PHP
Laravel 5.5官方推荐的Nginx配置学习教程
Oct 06 PHP
利用Homestead快速运行一个Laravel项目的方法详解
Nov 14 PHP
tp5(thinkPHP5)框架连接数据库的方法示例
Dec 24 PHP
laravel使用Faker数据填充的实现方法
Apr 12 PHP
PHP解决高并发的优化方案实例
Dec 10 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
php设计模式 Command(命令模式)
2011/06/26 PHP
php和数据库结合的一个简单的web实例 代码分析 (php初学者)
2011/07/28 PHP
深入解析php之apc
2013/05/15 PHP
ThinkPHP之M方法实例详解
2014/06/20 PHP
THINKPHP2.0到3.0有哪些改进之处
2015/01/04 PHP
PHP封装的Twitter访问类实例
2015/07/18 PHP
[原创]php使用curl判断网页404(不存在)的方法
2016/06/23 PHP
PHP自定义多进制的方法
2016/11/03 PHP
深入解析Laravel5.5中的包自动发现Package Auto Discovery
2017/09/13 PHP
PHP长网址与短网址的实现方法
2017/10/13 PHP
Alliance vs Liquid BO3 第三场2.13
2021/03/10 DOTA
Javascript 面向对象之重载
2010/05/04 Javascript
JQuery 图片的展开和伸缩实例讲解
2013/04/18 Javascript
Jquery Ajax方法传值到action的方法
2014/05/11 Javascript
Javascript显示和隐藏ul列表的方法
2015/07/15 Javascript
推荐阅读的js快速判断IE浏览器(兼容IE10与IE11)
2015/12/13 Javascript
AngularJS Toaster使用详解
2017/02/24 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
Redux 和 Mobx的选择问题:让你不再困惑!
2017/09/18 Javascript
vue中遇到的坑之变化检测问题(数组相关)
2017/10/13 Javascript
微信小程序实现发送验证码按钮效果
2018/12/20 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
three.js 实现露珠滴落动画效果的示例代码
2021/03/01 Javascript
python脚本实现分析dns日志并对受访域名排行
2014/09/18 Python
python文件读写操作与linux shell变量命令交互执行的方法
2015/01/14 Python
python杀死一个线程的方法
2015/09/06 Python
Django 路由系统URLconf的使用
2018/10/11 Python
Python3.6简单的操作Mysql数据库的三个实例
2018/10/17 Python
Python日志syslog使用原理详解
2020/02/18 Python
澳大利亚最超值的自行车之家:Reid Cycles
2019/03/24 全球购物
一名女生的自荐信
2013/12/08 职场文书
建筑安全责任书范本
2014/07/24 职场文书
2015年国庆节慰问信
2015/03/23 职场文书
自书遗嘱范文
2015/08/07 职场文书
离职员工给领导和同事的感谢信
2015/11/03 职场文书
vue里使用create, mounted调用方法
2022/04/26 Vue.js