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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
实用函数3
Nov 08 PHP
腾讯QQ php程序员面试题目整理
Jun 08 PHP
比较详细PHP生成静态页面教程
Jan 10 PHP
解析php入库和出库
Jun 25 PHP
php结合正则获取字符串中数字
Jun 19 PHP
PHP实现简单汉字验证码
Jul 28 PHP
PHP实现的迷你漂流瓶
Jul 29 PHP
php+ajax 实现输入读取数据库显示匹配信息
Oct 08 PHP
ThinkPHP设置禁止百度等搜索引擎转码(简单实用)
Feb 15 PHP
joomla组件开发入门教程
May 04 PHP
PHP共享内存使用与信号控制实例分析
May 09 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图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
Ext.MessageBox工具类简介
2009/12/10 Javascript
js时间日期和毫秒的相互转换
2013/02/22 Javascript
jQuery 计算iframe 窗口大小的方法
2014/05/13 Javascript
使用jQuery判断IE浏览器版本的代码
2014/06/14 Javascript
常用DOM整理
2015/06/16 Javascript
给angular加上动画效遇到的问题总结
2016/02/17 Javascript
jquery div模态窗口的简单实例
2016/05/28 Javascript
jQuery读取XML文件的方法示例
2017/02/03 Javascript
Angularjs在360兼容模式下取数据缓存问题的解决办法
2017/06/22 Javascript
关于laydate.js加载laydate.css路径错误问题解决
2017/12/27 Javascript
js的对象与函数详解
2019/01/21 Javascript
微信小程序新手教程之启动页的重要性
2019/03/03 Javascript
Flutter部件内部状态管理小结之实现Vue的v-model功能
2019/06/11 Javascript
关于vue3默认把所有onSomething当作v-on事件绑定的思考
2020/05/15 Javascript
Python爬取网易云音乐上评论火爆的歌曲
2017/01/19 Python
Python之用户输入的实例
2018/06/22 Python
Python可视化mhd格式和raw格式的医学图像并保存的方法
2019/01/24 Python
Python3 用matplotlib绘制sigmoid函数的案例
2020/12/11 Python
宝信软件JAVA工程师面试经历
2012/08/19 面试题
药学专业大学生个人的自我评价
2013/11/04 职场文书
syb养殖创业计划书
2014/01/09 职场文书
车间机修工岗位职责
2014/02/28 职场文书
竞选文艺委员演讲稿
2014/04/28 职场文书
区域销售主管岗位职责
2014/06/15 职场文书
艺术学院毕业生自荐信
2014/07/05 职场文书
2014年人力资源工作总结
2014/11/19 职场文书
班级元旦晚会开幕词
2015/01/29 职场文书
2015年专项整治工作总结
2015/04/03 职场文书
小学安全工作总结2015
2015/05/18 职场文书
2015年社区精神文明工作总结
2015/05/26 职场文书
大一新生军训新闻稿
2015/07/17 职场文书
运动会致辞稿
2015/07/29 职场文书
Windows10安装Apache2.4的方法步骤
2022/06/25 Servers
nginx静态资源的服务器配置方法
2022/07/07 Servers
Apache Kafka 分区重分配的实现原理解析
2022/07/15 Servers