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并发访问实例代码
Sep 06 PHP
使用迭代器 遍历文件信息的详解
Jun 08 PHP
js限制checkbox勾选的个数以及php获取多个checkbbox的方法深入解析
Jul 18 PHP
session在php5.3中的变化 session_is_registered() is deprecated in
Nov 12 PHP
php实例分享之通过递归实现删除目录下的所有文件详解
May 15 PHP
一个图片地址分解程序(用于PHP小偷程序)
Aug 23 PHP
PHP实现下载断点续传的方法
Nov 12 PHP
MySql数据库查询结果用表格输出PHP代码示例
Mar 20 PHP
PHP中strpos、strstr和stripos、stristr函数分析
Jun 11 PHP
基于Laravel实现的用户动态模块开发
Sep 21 PHP
PHP iconv()函数字符编码转换的问题讲解
Mar 22 PHP
Laravel 5+ .env环境配置文件详解
Apr 06 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算开始时间到过期时间的相隔的天数
2011/01/12 PHP
linux下为php添加curl扩展的方法
2011/07/29 PHP
php在服务器执行exec命令失败的解决方法
2012/03/03 PHP
PHP引用符&的用法详细解析
2013/08/22 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
jQuery与其它库冲突的解决方法
2010/06/25 Javascript
js对数字的格式化使用说明
2011/01/12 Javascript
jquery uploadify 在FF下无效的解决办法
2014/09/26 Javascript
JavaScript数据类型判定的总结笔记
2015/07/31 Javascript
JavaScript中实现无缝滚动、分享到侧边栏实例代码
2016/04/06 Javascript
Bootstrap学习笔记之css组件(3)
2016/06/07 Javascript
JS简单实现浮动窗口效果示例
2016/09/07 Javascript
概述javascript在Google IE中的调试技巧
2016/11/24 Javascript
8 行 Node.js 代码实现代理服务器
2016/12/05 Javascript
原生js实现回复评论功能
2017/01/18 Javascript
webuploader实现上传图片到服务器功能
2018/08/16 Javascript
React注册倒计时功能的实现
2018/09/06 Javascript
node.js环境搭建图文详解
2018/09/19 Javascript
JavaScript函数的特性与应用实践深入详解
2018/12/30 Javascript
使用pkg打包ThinkJS项目的方法步骤
2019/12/30 Javascript
微信小程序吸底区域适配iPhoneX的实现
2020/04/09 Javascript
vue大型项目之分模块运行/打包的实现
2020/09/21 Javascript
OpenLayers3加载常用控件使用方法详解
2020/09/25 Javascript
vue keep-alive的简单总结
2021/01/25 Vue.js
[01:55]《走出家门看比赛》——DOTA2 2015国际邀请赛同城线下观战
2015/07/18 DOTA
新手该如何学python怎么学好python?
2008/10/07 Python
python爬虫简单的添加代理进行访问的实现代码
2019/04/04 Python
Django之无名分组和有名分组的实现
2019/04/16 Python
python openpyxl使用方法详解
2019/07/18 Python
html5 Canvas画图教程(6)—canvas里画曲线之arcTo方法
2013/01/09 HTML / CSS
租房合同协议书
2014/04/09 职场文书
安全生产警示教育活动总结
2015/05/09 职场文书
办公用品管理制度
2015/08/04 职场文书
2016年10月份红领巾广播稿
2015/12/21 职场文书
python字符串拼接.join()和拆分.split()详解
2021/11/23 Python
Android开发手册自定义Switch开关按钮控件
2022/06/10 Java/Android