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调用数据库的存贮过程
Oct 09 PHP
PHP中的CMS的涵义
Mar 11 PHP
PHP程序员最常犯的11个MySQL错误小结
Nov 20 PHP
php Smarty 字符比较代码
Feb 27 PHP
PHP中将网页导出为Word文档的代码
May 25 PHP
解析php函数method_exists()与is_callable()的区别
Jun 21 PHP
windows服务器中检测PHP SSL是否开启以及开启SSL的方法
Apr 25 PHP
PHP汉字转换拼音的函数代码
Dec 30 PHP
PHP检测用户是否关闭浏览器的方法
Feb 14 PHP
PHPMailer使用QQ邮箱实现邮件发送功能
Aug 18 PHP
php设计模式之享元模式分析【星际争霸游戏案例】
Mar 23 PHP
php数值计算num类简单操作示例
May 15 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
服务器变量 $_SERVER 的深入解析
2013/07/02 PHP
php实现监听事件
2013/11/06 PHP
php使用多个进程同时控制文件读写示例
2014/02/28 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(十六)
2014/06/30 PHP
php使用标签替换的方式生成静态页面
2015/05/21 PHP
PHP中empty和isset对于参数结构的判断及empty()和isset()的区别
2015/11/15 PHP
PHP微信开发之查询城市天气
2016/06/23 PHP
PHP 获取 ping 时间的实现方法
2017/09/29 PHP
PHP读取并输出XML文件数据的简单实现方法
2017/12/22 PHP
laravel-admin的图片删除实例
2019/09/30 PHP
关于juqery radio写法的兼容性问题(新老版本jquery)
2010/06/14 Javascript
json原理分析及实例介绍
2012/11/29 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
js 获取input点选按钮的值的方法
2014/04/14 Javascript
浅谈jquery.fn.extend与jquery.extend区别
2015/07/13 Javascript
Spring mvc 接收json对象
2015/12/10 Javascript
JavaScript实现相册弹窗功能(zepto.js)
2016/06/21 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
JavaScript 数组去重并统计重复元素出现的次数实例
2017/12/14 Javascript
在Bootstrap开发框架中使用dataTable直接录入表格行数据的方法
2018/10/25 Javascript
vue滚动插件better-scroll使用详解
2019/10/18 Javascript
vue 实现强制类型转换 数字类型转为字符串
2019/11/07 Javascript
python字符串替换的2种方法
2014/11/30 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
windows 10 设定计划任务自动执行 python 脚本的方法
2019/09/11 Python
tensorflow获取预训练模型某层参数并赋值到当前网络指定层方式
2020/01/24 Python
Django model重写save方法及update踩坑详解
2020/07/27 Python
用canvas实现图片滤镜效果附演示
2013/11/05 HTML / CSS
GLAMGLOW香港官网:明星出镜前的秘密武器
2017/03/16 全球购物
Chain Reaction Cycles芬兰:世界上最大的在线自行车商店
2017/12/06 全球购物
经典而简洁的婚礼主持词
2014/03/13 职场文书
励志演讲稿600字
2014/08/21 职场文书
三严三实民主生活会发言稿
2014/10/13 职场文书
2015年中秋节活动总结
2015/03/23 职场文书
Python开发工具Pycharm的安装以及使用步骤总结
2021/06/24 Python