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


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中get和post的简单实例
Feb 04 Javascript
jQuery中even选择器的定义和用法
Dec 23 Javascript
JavaScript实现将数组数据添加到Select下拉框的方法
Aug 21 Javascript
js实现仿MSN带关闭功能的右下角弹窗代码
Sep 04 Javascript
js 实现数值的千分位及保存小数方法(推荐)
Aug 01 Javascript
Javascript点击按钮随机改变数字与其颜色
Sep 01 Javascript
xmlplus组件设计系列之按钮(2)
Apr 26 Javascript
AngularJS+Bootstrap3多级导航菜单的实现代码
Aug 16 Javascript
BootStrap TreeView使用实例详解
Nov 01 Javascript
解决vue热替换失效的根本原因
Sep 19 Javascript
Vue中JS动画与Velocity.js的结合使用
Feb 13 Javascript
Js Snowflake(雪花算法)生成随机ID的实现方法
Aug 26 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
解决文件名解压后乱码的问题 将文件名进行转码的代码
2012/01/10 PHP
PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
2012/06/07 PHP
set_include_path和get_include_path使用及注意事项
2013/02/02 PHP
PHP 数组基本操作方法详解
2016/06/17 PHP
PHP魔术方法以及关于独立实例与相连实例的全面讲解
2016/10/18 PHP
W3C Group的JavaScript1.8 新特性介绍
2009/05/19 Javascript
angular中使用路由和$location切换视图
2015/01/23 Javascript
jquery实现页面关键词高亮显示的方法
2015/03/12 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
Node.js模块封装及使用方法
2016/03/06 Javascript
Bootstrap3 datetimepicker控件使用实例
2016/12/13 Javascript
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
简单谈谈require模块化jquery和angular的问题
2017/06/23 jQuery
详解webpack自动生成html页面
2017/06/29 Javascript
聊聊Vue.js的template编译的问题
2017/10/09 Javascript
Node 升级到最新稳定版的方法分享
2018/05/17 Javascript
如何解决vue2.0下IE浏览器白屏问题
2018/09/13 Javascript
java直接调用python脚本的例子
2014/02/16 Python
通过代码实例展示Python中列表生成式的用法
2015/03/31 Python
Python cookbook(数据结构与算法)让字典保持有序的方法
2018/02/18 Python
Python生成器generator用法示例
2018/08/10 Python
python创建文件备份的脚本
2018/09/11 Python
对python 命令的-u参数详解
2018/12/03 Python
Python实现的登录验证系统完整案例【基于搭建的MVC框架】
2019/04/12 Python
python实现PID算法及测试的例子
2019/08/08 Python
如何获取Python简单for循环索引
2019/11/21 Python
pycharm 复制代码出现空格的解决方式
2021/01/15 Python
企业安全生产承诺书
2014/05/22 职场文书
党委班子对照检查材料
2014/08/19 职场文书
教师师德师风自我剖析材料
2014/09/29 职场文书
2015关爱留守儿童工作总结
2014/12/12 职场文书
联谊会开场白
2015/06/01 职场文书
病假证明模板
2015/06/19 职场文书
Vue OpenLayer 为地图绘制风场效果
2022/04/24 Vue.js
Spring Boot项目如何优雅实现Excel导入与导出功能
2022/06/10 Java/Android