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


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 相关文章推荐
优化JavaScript脚本的性能的几个注意事项
Dec 22 Javascript
JS控制显示隐藏兼容问题(IE6、IE7、IE8)
Apr 01 Javascript
一个JQuery操作Table的代码分享
Mar 30 Javascript
jquery插件推荐浏览器嗅探userAgent
Nov 09 Javascript
js使用递归解析xml
Dec 12 Javascript
js实现div模拟模态对话框展现URL内容
May 27 Javascript
javascript常用的设计模式
Feb 09 Javascript
ionic3+Angular4实现接口请求及本地json文件读取示例
Oct 11 Javascript
使用webpack搭建react开发环境的方法
May 15 Javascript
vue-cli的工程模板与构建工具详解
Sep 27 Javascript
小程序实现列表点赞功能
Nov 02 Javascript
VueQuillEditor富文本上传图片(非base64)
Jun 03 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
Discuz 模板语句分析及知识技巧
2009/08/21 PHP
php读取富文本的时p标签会出现红线是怎么回事
2014/05/13 PHP
通过修改配置真正解决php文件上传大小限制问题(nginx+php)
2015/09/23 PHP
非常重要的php正则表达式详解
2016/01/04 PHP
PHP7.1实现的AES与RSA加密操作示例
2018/06/15 PHP
纯JAVASCRIPT图表动画插件Highcharts Examples
2011/04/16 Javascript
用nodejs访问ActiveX对象,以操作Access数据库为例。
2011/12/15 NodeJs
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
jQuery固定元素插件scrolltofixed使用指南
2015/04/21 Javascript
原生js实现的贪吃蛇网页版游戏完整实例
2015/05/18 Javascript
js基于cookie方式记住返回页面用法示例
2016/05/27 Javascript
vue分页组件table-pagebar使用实例解析
2020/11/15 Javascript
vue中如何创建多个ueditor实例教程
2017/11/14 Javascript
JavaScript日期工具类DateUtils定义与用法示例
2018/09/03 Javascript
深入理解 TypeScript Reflect Metadata
2019/12/12 Javascript
Jquery属性的获取/设置及样式添加/删除操作技巧分析
2019/12/23 jQuery
如何利用vue实现波谱拟合详解
2020/11/05 Javascript
Javascript实现单选框效果
2020/12/09 Javascript
Python读取图片EXIF信息类库介绍和使用实例
2014/07/10 Python
python计算方程式根的方法
2015/05/07 Python
Python编码类型转换方法详解
2016/07/01 Python
Python模块的加载讲解
2019/01/15 Python
python简单验证码识别的实现方法
2019/05/10 Python
印度尼西亚最大的电商平台:Tokopedia(印尼版淘宝)
2017/12/02 全球购物
英国领先的独立酒精饮料零售商:DrinkSupermarket
2021/01/13 全球购物
求高于平均分的学生学号及成绩
2016/09/01 面试题
软件测试面试题
2015/10/21 面试题
UNIX文件系统常用命令
2012/05/25 面试题
军训自我鉴定
2013/12/14 职场文书
化验室技术员岗位职责
2013/12/24 职场文书
广告学专业自荐信范文
2014/02/24 职场文书
基本公共卫生服务健康教育工作方案
2014/05/22 职场文书
国家奖学金获奖感言
2014/08/16 职场文书
项目建议书
2015/02/04 职场文书
全家福照片寄语怎么写?
2019/04/02 职场文书
ubuntu下常用apt命令介绍
2022/06/05 Servers