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与C#分别格式化文件大小的代码
May 14 PHP
PHP去掉从word直接粘贴过来的没有用格式的函数
Oct 29 PHP
php+highchats生成动态统计图
May 21 PHP
PHP+Mysql树型结构(无限分类)数据库设计的2种方式实例
Jul 15 PHP
Laravel框架数据库CURD操作、连贯操作总结
Sep 03 PHP
10款PHP开源商城系统汇总介绍
Jul 23 PHP
php中session定期自动清理的方法
Nov 12 PHP
php实现往pdf中加数字签名操作示例【附源码下载】
Aug 07 PHP
PHP实现用session来实现记录用户登陆信息
Oct 15 PHP
PHP+Oracle本地开发环境搭建方法详解
Apr 01 PHP
php使用fputcsv实现大数据的导出操作详解
Feb 27 PHP
php设计模式之模板模式实例分析【星际争霸游戏案例】
Mar 24 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引用符&的用法详细解析
2013/08/22 PHP
php通过修改header强制图片下载的方法
2015/03/24 PHP
PDO::lastInsertId讲解
2019/01/29 PHP
从ThinkPHP3.2.3过渡到ThinkPHP5.0学习笔记图文详解
2019/04/03 PHP
Add a Table to a Word Document
2007/06/15 Javascript
JavaScript实现的in_array函数
2014/08/27 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
jquery实现动态画圆
2014/12/04 Javascript
利用js编写响应式侧边栏
2016/09/17 Javascript
Bootstrap面板学习使用
2017/02/09 Javascript
Express URL跳转(重定向)的实现方法
2017/04/07 Javascript
vue与原生app的对接交互的方法(混合开发)
2018/11/28 Javascript
vue的列表交错过渡实现代码示例
2019/05/05 Javascript
Vue实现仿iPhone悬浮球的示例代码
2020/03/13 Javascript
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
Python异常处理总结
2014/08/15 Python
跟老齐学Python之有容乃大的list(2)
2014/09/15 Python
python网络编程之数据传输UDP实例分析
2015/05/20 Python
python pandas dataframe 行列选择,切片操作方法
2018/04/10 Python
局域网内python socket实现windows与linux间的消息传送
2019/04/19 Python
Mac在python3环境下安装virtualwrapper遇到的问题及解决方法
2019/07/09 Python
Python基础类继承重写实现原理解析
2020/04/03 Python
String和StringBuffer的区别
2015/08/13 面试题
JSF面试题:如何管量web层中的Bean,用什么标签。如何通过jsp页面与Bean绑定在一起进行处理?
2012/10/05 面试题
旅游管理毕业生自荐信
2013/11/05 职场文书
军人违纪检讨书
2014/02/04 职场文书
竞选班长自荐书范文
2014/03/09 职场文书
售后求职信范文
2014/03/15 职场文书
宣传普通话标语
2014/06/27 职场文书
关于青春的演讲稿500字
2014/08/22 职场文书
医生党的群众路线教育实践活动个人对照检查材料
2014/09/23 职场文书
精神病医院见习报告
2014/11/03 职场文书
读书笔记怎么写
2015/07/01 职场文书
Java SSM配置文件案例详解
2021/08/30 Java/Android
MySQL库表太大怎么办? 数据库分库分表项目实践
2022/04/11 MySQL
详解Python中的for循环
2022/04/30 Python