微信小程序开发(一) 微信登录流程详解


Posted in Javascript onJanuary 11, 2017

最近在研究微信小程序开发,非常有意思的一个东西。花了一点时间写了一个微信的登录流程,包括后端接口和小程序代码。

做过微信登录的都知道,我们需要一个标识来记录用户的身份的唯一性,在微信中unionId就是我们所需要的记录唯一ID,那么如何拿到unionId就成了关键,我将项目分为小程序和 后台PHP代码两部分来讲。

微信小程序开放平台

先从我们的小程序代码开始

微信小程序开发(一) 微信登录流程详解

简单的说一下我们小程序的js代码登录流程

login ->获取code ->getUserInfo获取iv和encryptedData ->传给自己的服务器处理 ->返回给小程序结果

var API_URL = "自己的服务器地址";
Page({
 onLoad: function () {
 console.log("iv");
 wx.login({//login流程
 success: function (res) {//登录成功
 if (res.code) {
 var code = res.code;
 wx.getUserInfo({//getUserInfo流程
 success: function (res2) {//获取userinfo成功
 console.log(res2);
 var encryptedData = encodeURIComponent(res2.encryptedData);//一定要把加密串转成URI编码
  var iv = res2.iv;
  //请求自己的服务器
  Login(code,encryptedData,iv);
 }
 })

 } else {
 console.log('获取用户登录态失败!' + res.errMsg)
 }
 }
});
} 
})

code:服务器用来获取sessionKey的必要参数。

IV:加密算法的初始向量,encryptedData:加密过的字符串。

把code iv encryptedData 传递给我们的服务器

function Login(code,encryptedData,iv){ console.log('code='+code+'&encryptedData='+encryptedData+'&iv='+iv);
 //创建一个dialog
  wx.showToast({
  title: '正在登录...',
  icon: 'loading',
  duration: 10000
  });
  //请求服务器
  wx.request({
  url: API_URL,
  data: {
  code:code,
  encryptedData:encryptedData,
  iv:iv
  },
  method: 'GET', // OPTIONS, GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT
  header: {
  'content-type': 'application/json'
  }, // 设置请求的 header
  success: function (res) {
  // success
  wx.hideToast();
  console.log('服务器返回'+res.data);

  },
  fail: function () {
  // fail
  // wx.hideToast();
  },
  complete: function () {
  // complete
  }
  })
 }

看文档的话,应该知道,我们所需要的unionId就在encryptedData中,所以服务器需要这些信息来把unionId解析出来。

服务器处理逻辑

我php用的是laravel框架

先下载微信的解密demo

下载地址

微信小程序开发(一) 微信登录流程详解 

这里我选择的是PHP代码,把除了demo外的三个class文件,放入我们自己的项目,以后后面调用。

这里讲解一下服务器的处理流程:

通过微信的https://api.weixin.qq.com/sns/jscode2session接口获取seesionKey,然后在通过sessionKey和iv来解密encryptedData数据获取UnionID。

具体文档

/**
 * 登录
 * 
 * @return Response
 */
 public function weixinlogin( $user_id=null )
 {
  global $App_Error_Conf,$Gift_Ids,$Server_Http_Path,$Is_Local,$Test_User,$Good_Vcode,$WeiXin_Xd_Conf;
  $validator_result = input_validator(array('code','iv','encryptedData'));
  if(!empty($validator_result)){
   return response($validator_result);
  }
  $js_code = $_REQUEST['code'];
  $encryptedData = $_REQUEST['encryptedData'];
  $iv = $_REQUEST['iv'];
  $appid = $WeiXin_Xd_Conf['appid'];
  $secret = $WeiXin_Xd_Conf['secret'];
  $grant_type = $WeiXin_Xd_Conf['grant_type'];
  //从微信获取session_key
  $user_info_url = $WeiXin_Xd_Conf['code2session_url'];
  $user_info_url = sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=%",$user_info_url,$appid,$secret,$js_code,$grant_type);
  $weixin_user_data = json_decode(get_url($user_info_url));
  $session_key = $weixin_user_data->session_key;
//解密数据
$data = '';
$wxBizDataCrypt = new WXBizDataCrypt($appid, $session_key);
$errCode=$wxBizDataCrypt>decryptData($appid,$session_key,$encryptedData, $iv, $data );

最后拿到的这个 data就是我们解密后的encryptedData里面会包含unionId。

这样简单登录就实现了!以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jQuery easyui datagrid动态查询数据实例讲解
Feb 26 Javascript
单元选择合并变色示例代码
May 26 Javascript
实例讲解js验证表单项是否为空的方法
Jan 09 Javascript
Sort()函数的多种用法
Mar 20 Javascript
jQuery学习笔记——jqGrid的使用记录(实现分页、搜索功能)
Nov 09 Javascript
浅谈AngularJS中ng-class的使用方法
Nov 11 Javascript
SelecT下拉框选中和取值的解决方法
Nov 22 Javascript
jquery的父、子、兄弟节点查找,节点的子节点循环方法
Dec 07 Javascript
JavaScript实现仿Clock ISO时钟
Jun 29 Javascript
使用electron实现百度网盘悬浮窗口功能的示例代码
Oct 24 Javascript
AJAX XMLHttpRequest对象创建使用详解
Aug 20 Javascript
解决vue与node模版引擎的渲染标记{{}}(双花括号)冲突问题
Sep 11 Javascript
Javascript中return的使用与闭包详解
Jan 11 #Javascript
jQuery对table表格进行增删改查
Dec 22 #Javascript
javascript基础知识讲解
Jan 11 #Javascript
bootstrap侧边栏圆点导航
Jan 11 #Javascript
微信小程序开发(二)图片上传+服务端接收详解
Jan 11 #Javascript
JavaScript BASE64算法实现(完美解决中文乱码)
Jan 10 #Javascript
使用vue实现点击按钮滑出面板的实现代码
Jan 10 #Javascript
You might like
ajax在joomla中的原生态应用代码
2012/07/19 PHP
浅析php中三个等号(===)和两个等号(==)的区别
2013/08/06 PHP
laravel 5 实现模板主题功能
2015/03/02 PHP
php实现网站文件批量压缩下载功能
2015/10/28 PHP
使用php实现从身份证中提取生日
2016/05/09 PHP
jquery使用jquery.zclip插件复制对象的实例教程
2013/12/04 Javascript
深入理解javascript作用域和闭包
2014/09/23 Javascript
浅谈js里面的InttoStr和StrtoInt
2016/06/14 Javascript
全面解析Bootstrap表单样式的使用
2016/09/09 Javascript
Javascript中arguments对象的详解与使用方法
2016/10/04 Javascript
微信小程序五星评分效果实现代码
2017/04/06 Javascript
JavaScript注册时密码强度校验代码
2017/06/30 Javascript
详解vue axios中文文档
2017/09/12 Javascript
通过js动态创建标签,并设置属性方法
2018/02/24 Javascript
angularJS自定义directive之带参方法传递详解
2018/10/09 Javascript
Vuerouter的beforeEach与afterEach钩子函数的区别
2018/12/26 Javascript
对Layer UI 模块化的用法详解
2019/09/26 Javascript
Vue点击切换Class变化,实现Active当前样式操作
2020/07/17 Javascript
vue移动端写的拖拽功能示例代码
2020/09/09 Javascript
python抓取最新博客内容并生成Rss
2015/05/17 Python
python制作最美应用的爬虫
2015/10/28 Python
Python cookbook(数据结构与算法)实现查找两个字典相同点的方法
2018/02/18 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
2019/02/21 Python
python制作填词游戏步骤详解
2019/05/05 Python
从numpy数组中取出满足条件的元素示例
2019/11/26 Python
python模拟预测一下新型冠状病毒肺炎的数据
2020/02/01 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
C#面试题问题集
2016/04/02 面试题
材料成型专业个人求职信范文
2013/09/25 职场文书
煤矿班组长岗位职责
2013/12/29 职场文书
中专毕业生个人职业生涯规划
2014/02/19 职场文书
2016年全国爱牙日宣传活动总结
2016/04/05 职场文书
2016年“节能宣传周”活动总结
2016/04/05 职场文书
导游词之西安大清真寺
2019/12/17 职场文书
MySQL分库分表与分区的入门指南
2021/04/22 MySQL
Python Parser的用法
2021/05/12 Python