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 调试环境(IIS+PHP+MYSQL)
Jan 10 PHP
PHP面向对象学习笔记之二 生成对象的设计模式
Oct 06 PHP
深入解析PHP的引用计数机制
Jun 14 PHP
php中的路径问题与set_include_path使用介绍
Feb 11 PHP
Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 2611816 bytes)
Nov 08 PHP
ajax+php控制所有后台函数调用
Jul 15 PHP
使用xampp搭建运行php虚拟主机的详细步骤
Oct 21 PHP
WordPress特定文章对搜索引擎隐藏或只允许搜索引擎查看
Dec 31 PHP
浅谈PHP中的
Apr 23 PHP
ThinkPHP5实现作业管理系统中处理学生未交作业与已交作业信息的方法
Nov 12 PHP
在Laravel 中实现是否关注的示例
Oct 22 PHP
PHP策略模式写法
Apr 01 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 xml文件操作代码(一)
2009/03/20 PHP
PHP基于imap获取邮件实例
2014/11/11 PHP
PHP url的pathinfo模式加载不同控制器的简单实现
2016/08/12 PHP
php实现文件上传及头像预览功能
2017/01/15 PHP
使用phpQuery获取数组的实例
2017/03/13 PHP
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
被遗忘的javascript的slice() 方法
2015/04/20 Javascript
javascript实现3D切换焦点图
2015/10/16 Javascript
jQuery控制frames及frame页面JS的方法
2016/03/08 Javascript
利用Decorator如何控制Koa路由详解
2018/06/26 Javascript
node中的session的具体使用
2018/09/14 Javascript
超详细的5个Shell脚本实例分享(值得收藏)
2019/08/15 Javascript
vue中获取滚动table的可视页面宽度调整表头与列对齐(每列宽度不都相同)
2019/08/17 Javascript
three.js如何实现3D动态文字效果
2021/03/03 Javascript
python访问系统环境变量的方法
2015/04/29 Python
Python基于pygame实现的弹力球效果(附源码)
2015/11/11 Python
Python增量循环删除MySQL表数据的方法
2016/09/23 Python
python快排算法详解
2019/03/04 Python
python实现微信小程序用户登录、模板推送
2019/08/28 Python
pygame实现俄罗斯方块游戏(AI篇2)
2019/10/29 Python
Python+OpenCV+图片旋转并用原底色填充新四角的例子
2019/12/12 Python
OpenCV中VideoCapture类的使用详解
2020/02/14 Python
如何安装并在pycharm使用selenium的方法
2020/04/30 Python
opencv 图像腐蚀和图像膨胀的实现
2020/07/07 Python
CSS3实现文本垂直排列的方法
2018/07/10 HTML / CSS
一份全面的PHP面试问题考卷
2012/07/15 面试题
软件测试笔试题
2012/10/25 面试题
销售工作岗位职责
2013/12/24 职场文书
化学教师自荐信范文
2013/12/28 职场文书
航海技术专业毕业生推荐信
2014/07/09 职场文书
2014乡镇干部纪律作风整顿思想汇报
2014/09/13 职场文书
2015年元旦文艺晚会总结(学院)
2014/11/28 职场文书
大学生自荐材料范文
2014/12/30 职场文书
检讨书大全
2015/01/27 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
Python  lambda匿名函数和三元运算符
2022/04/19 Python