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


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 相关文章推荐
JS截取url中问号后面参数的值信息
Apr 29 Javascript
js自定义鼠标右键的实现原理及源码
Jun 23 Javascript
jQuery显示和隐藏 常用的状态判断方法
Jan 29 Javascript
javascript和jquery实现用户登录验证
May 04 Javascript
jQuery插件编写步骤详解
Jun 03 Javascript
前端微信支付js代码
Jul 25 Javascript
JavaScrpt中如何使用 cookie 设置查看与删除功能
Jul 09 Javascript
angular中如何绑定iframe中src的方法
Feb 01 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
May 12 Javascript
如何使用CSS3+JQuery实现悬浮墙式菜单
Jun 18 jQuery
微信小程序自定义多列选择器使用详解
Jun 21 Javascript
vue-router懒加载的3种方式汇总
Feb 28 Vue.js
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
PHPMyAdmin 快速配置方法
2009/05/11 PHP
并发下常见的加锁及锁的PHP具体实现代码
2010/10/12 PHP
PHP的PDO预定义常量讲解
2019/01/24 PHP
jQuery 数据缓存data(name, value)详解及实现
2010/01/04 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
密码框显示提示文字jquery示例
2013/08/29 Javascript
JS定时器实例详细分析
2013/10/11 Javascript
JavaScript字符串对象toUpperCase方法入门实例(用于把字母转换为大写)
2014/10/17 Javascript
javascript中call apply 的应用场景
2015/04/16 Javascript
浅析JavaScript动画
2015/06/10 Javascript
JavaScript前端开发之实现二进制读写操作
2015/11/04 Javascript
JavaScript判断微信浏览器实例代码
2016/06/13 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
Ionic+AngularJS实现登录和注册带验证功能
2017/02/09 Javascript
js 转义字符及URI编码详解
2017/02/28 Javascript
Bootstrap 表单验证formValidation 实现表单动态验证功能
2017/05/17 Javascript
js实现网页的两个input标签内的数值加减(示例代码)
2017/08/15 Javascript
JS常用的几种数组遍历方式以及性能分析对比实例详解
2018/04/11 Javascript
Vue项目history模式下微信分享爬坑总结
2019/03/29 Javascript
Vue关于组件化开发知识点详解
2020/05/13 Javascript
Vue element-ui父组件控制子组件的表单校验操作
2020/07/17 Javascript
ES6的循环与可迭代对象示例详解
2021/01/31 Javascript
[01:58]2018DOTA2亚洲邀请赛趣味视频——交流
2018/04/03 DOTA
在Django中创建动态视图的教程
2015/07/15 Python
Python简单实现socket信息发送与监听功能示例
2018/01/03 Python
python3爬虫获取html内容及各属性值的方法
2018/12/17 Python
python异步存储数据详解
2019/03/19 Python
OpenCV HSV颜色识别及HSV基本颜色分量范围
2019/03/22 Python
在linux下实现 python 监控usb设备信号
2019/07/03 Python
Python利用Scrapy框架爬取豆瓣电影示例
2020/01/17 Python
详解anaconda安装步骤
2020/11/23 Python
Yahoo的PHP面试题
2014/05/26 面试题
后勤自我鉴定
2013/10/13 职场文书
进口业务员岗位职责
2014/04/06 职场文书
2015年度内部审计工作总结
2015/05/20 职场文书
在K8s上部署Redis集群的方法步骤
2021/04/27 Redis