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操作Access类(PHP+ODBC+Access)
Jan 02 PHP
php文档更新介绍
Jul 22 PHP
洪恩在线成语词典小偷程序php版
Apr 20 PHP
php 伪静态之IIS篇
Jun 02 PHP
PHP关于htmlspecialchars、strip_tags、addslashes的解释
Jul 04 PHP
PHP中使用匿名函数操作数据库的例子
Nov 17 PHP
PHP IDE phpstorm 常用快捷键
May 18 PHP
详解PHP对数组的定义以及数组的创建方法
Nov 27 PHP
phpstudy默认不支持64位php的解决方法
Feb 20 PHP
PHP简单实现防止SQL注入的方法
Mar 13 PHP
Laravel实现短信注册的示例代码
May 29 PHP
laravel 模型查询按照whereIn排序的示例
Oct 16 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
一个显示天气预报的程序
2006/10/09 PHP
mysql 全文搜索 技巧
2007/04/27 PHP
PHP读取网页文件内容的实现代码(fopen,curl等)
2011/06/23 PHP
php 批量替换html标签的实例代码
2013/11/26 PHP
php 判断服务器操作系统的类型
2014/02/17 PHP
PHP常用的小程序代码段
2015/11/14 PHP
PHP实现电商订单自动确认收货redis队列
2017/05/17 PHP
PHP解决高并发的优化方案实例
2020/12/10 PHP
很酷的javascript loading效果代码
2008/06/18 Javascript
Jquey拖拽控件Draggable使用方法(asp.net环境)
2010/09/28 Javascript
javascript setinterval 的正确语法如何书写
2014/06/17 Javascript
JavaScript中的继承方式详解
2015/02/11 Javascript
轻松玩转BootstrapTable(后端使用SpringMVC+Hibernate)
2017/09/06 Javascript
原生JS上传大文件显示进度条 php上传文件代码
2020/03/27 Javascript
three.js中文文档学习之通过模块导入
2017/11/20 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
使用D3.js构建实时图形的示例代码
2018/08/28 Javascript
微信小程序textarea层级过高的解决方法
2019/03/04 Javascript
vue中动态select的使用方法示例
2019/10/28 Javascript
Vue CLI4 Vue.config.js标准配置(最全注释)
2020/06/05 Javascript
详解Python3.1版本带来的核心变化
2015/04/07 Python
最基础的Python的socket编程入门教程
2015/04/23 Python
Python基于jieba库进行简单分词及词云功能实现方法
2018/06/16 Python
Numpy 改变数组维度的几种方法小结
2018/08/02 Python
详解Django的model查询操作与查询性能优化
2018/10/16 Python
Python面向对象基础入门之编码细节与注意事项
2018/12/11 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
利用HTML5 Canvas制作一个简单的打飞机游戏
2015/05/11 HTML / CSS
北京天润融通.net面试题笔试题
2012/02/20 面试题
村主任群众路线个人对照检查材料
2014/09/26 职场文书
2014年团支部年度工作总结
2014/12/24 职场文书
小学一年级班主任工作经验交流材料
2015/11/02 职场文书
Java 垃圾回收超详细讲解记忆集和卡表
2022/04/08 Java/Android
如何设置多台电脑共享打印机?多台电脑共享打印机的方法
2022/04/08 数码科技