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多个版本的分析解释
Jul 21 PHP
第二章 PHP入门基础之php代码写法
Dec 30 PHP
PHP读取xml方法介绍
Jan 12 PHP
PHP中对缓冲区的控制实现代码
Sep 29 PHP
thinkphp的静态缓存用法分析
Nov 29 PHP
php中session与cookie的比较
Jan 27 PHP
php程序内部post数据的方法
Mar 31 PHP
使用Appcan客户端自动更新PHP版本号(全)
Jul 31 PHP
PHP结合jQuery插件ajaxFileUpload实现异步上传文件实例
Aug 17 PHP
php如何执行非缓冲查询API
Jul 22 PHP
php的常量和变量实例详解
Jun 27 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 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
discuz的php防止sql注入函数
2011/01/17 PHP
php防止sql注入的方法详解
2017/02/20 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
JavaScript EasyPager 分页函数
2011/05/25 Javascript
jquery插件制作 手风琴Panel效果实现
2012/08/17 Javascript
JavaScript中数组对象的那些自带方法介绍
2013/03/12 Javascript
jquery删除ID为sNews的tr元素的内容
2014/04/10 Javascript
javascript实现密码强度显示
2015/03/18 Javascript
JS模式之简单的订阅者和发布者模式完整实例
2015/06/30 Javascript
jquery实现适用于门户站的导航下拉菜单效果代码
2015/08/24 Javascript
jQuery实现带渐显效果的人物多级关系图代码
2015/10/16 Javascript
基于Jquery和CSS3制作数字时钟附源码下载(CSS3篇)
2015/11/24 Javascript
AngularJS模块学习之Anchor Scroll
2016/01/19 Javascript
js实现可控制左右方向的无缝滚动效果
2016/05/29 Javascript
jQuery中JSONP的两种实现方式详解
2016/09/26 Javascript
简单实现jQuery级联菜单
2017/01/09 Javascript
微信小程序视图template模板引用的实例详解
2017/09/20 Javascript
vue router下的html5 history在iis服务器上的设置方法
2017/10/18 Javascript
jQuery实现基本淡入淡出效果的方法详解
2018/09/05 jQuery
Python中使用tarfile压缩、解压tar归档文件示例
2015/04/05 Python
Windows下PyMongo下载及安装教程
2015/04/27 Python
python使用clear方法清除字典内全部数据实例
2015/07/11 Python
python与C互相调用的方法详解
2017/07/14 Python
Python基于回溯法子集树模板解决m着色问题示例
2017/09/07 Python
pygame游戏之旅 添加icon和bgm音效的方法
2018/11/21 Python
Python如何使用BeautifulSoup爬取网页信息
2019/11/26 Python
Python使用pyyaml模块处理yaml数据
2020/04/14 Python
python3 循环读取excel文件并写入json操作
2020/07/14 Python
结合 CSS3 transition transform 实现简单的跑马灯效果的示例
2018/02/07 HTML / CSS
英国奢侈品网站:MatchesFashion
2016/12/16 全球购物
分厂厂长岗位职责
2013/12/29 职场文书
初中生物教学反思
2014/01/10 职场文书
幼儿园教师考核制度
2014/02/01 职场文书
环境建议书
2015/02/04 职场文书
家长反馈意见及建议
2015/06/03 职场文书
自制短波长线天线频率预选器 - 成功消除B2K之流的镜像
2021/04/22 无线电