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


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 相关文章推荐
Confirmer JQuery确认对话框组件
Jun 09 Javascript
javascript loadScript异步加载脚本示例讲解
Nov 14 Javascript
JavaScript动态改变表格单元格内容的方法
Mar 30 Javascript
JavaScript使表单中的内容显示在屏幕上的方法
Jun 29 Javascript
JS实现网页顶部向下滑出的全国城市切换导航效果
Aug 22 Javascript
JS实现带鼠标效果的头像及文章列表代码
Sep 27 Javascript
JS实现网页标题随机显示名人名言的方法
Nov 03 Javascript
js实现弹窗居中的简单实例
Oct 09 Javascript
写gulp遇到的ES6问题详解
Dec 03 Javascript
Angular7创建项目、组件、服务以及服务的使用
Feb 19 Javascript
Vue实现验证码功能
Dec 03 Javascript
Vue-Ant Design Vue-普通及自定义校验实例
Oct 24 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
PHP Switch 语句之学习笔记
2013/09/21 PHP
php多文件上传实现代码
2014/02/20 PHP
PHP正则提取不包含指定网址的图片地址的例子
2014/04/21 PHP
PHP图片处理之使用imagecopy函数添加图片水印实例
2014/11/19 PHP
Smarty foreach控制循环次数的一些方法
2015/07/01 PHP
PHP基于PDO实现的SQLite操作类【包含增删改查及事务等操作】
2017/06/21 PHP
20个最新的jQuery插件
2012/01/13 Javascript
js加减乘除丢失精度问题解决方法
2014/05/16 Javascript
jQuery中ajax的load()方法用法实例
2014/12/26 Javascript
jQuery匹配文档链接并添加class的方法
2015/06/26 Javascript
SWFObject基本用法实例分析
2015/07/20 Javascript
jquery选择器简述
2015/08/31 Javascript
jquery实现仿新浪微博带动画效果弹出层代码(可关闭、可拖动)
2015/10/12 Javascript
jQuery的文档处理程序详解
2016/05/10 Javascript
chrome浏览器如何断点调试异步加载的JS
2016/09/05 Javascript
详解在Vue中通过自定义指令获取dom元素
2017/03/04 Javascript
vue获取DOM元素并设置属性的两种实现方法
2017/09/30 Javascript
JS动态添加的div点击跳转到另一页面实现代码
2017/09/30 Javascript
ES6关于Promise的用法详解
2018/05/07 Javascript
实例分析Array.from(arr)与[...arr]到底有何不同
2019/04/09 Javascript
使用Vue实现一个树组件的示例
2020/11/06 Javascript
手动实现vue2.0的双向数据绑定原理详解
2021/02/06 Vue.js
Python实现数通设备端口使用情况监控实例
2015/07/15 Python
Python中将字典转换为XML以及相关的命名空间解析
2015/10/15 Python
python中正则表达式的使用方法
2018/02/25 Python
Python之csv文件从MySQL数据库导入导出的方法
2018/06/21 Python
原来我一直安装 Python 库的姿势都不对呀
2019/11/11 Python
Python语法垃圾回收机制原理解析
2020/03/25 Python
Python filter()及reduce()函数使用方法解析
2020/09/05 Python
最新pycharm安装教程
2020/11/18 Python
Stuarts London美国/加拿大:世界领先的独立男装零售商之一
2019/03/18 全球购物
请假条范文大全
2014/04/10 职场文书
安全责任书模板
2014/07/22 职场文书
教师个人总结范文
2015/02/11 职场文书
总经理司机岗位职责
2015/04/10 职场文书
2016年习主席讲话学习心得体会
2016/01/20 职场文书