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


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 xml为数据源的下拉框控件
Jul 07 Javascript
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
基于jquery实现的移入页面上空文本框时,让它变为焦点,移出清除焦点
Jul 26 Javascript
JS获取url链接字符串 location.href
Dec 23 Javascript
jQuery中:button选择器用法实例
Jan 04 Javascript
javascript实现避免页面按钮重复提交
Jan 08 Javascript
浅谈react-native热更新react-native-pushy集成遇到的问题
Sep 30 Javascript
微信小程序页面生命周期详解
Jan 31 Javascript
JS实现的DOM插入节点操作示例
Apr 04 Javascript
JS中如何轻松遍历对象属性的方式总结
Aug 06 Javascript
原生js无缝轮播插件使用详解
Mar 09 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
PHP 函数执行效率的小比较
2010/10/17 PHP
mysql 查询指定日期时间内sql语句实现原理与代码
2012/12/16 PHP
php实现保存submit内容之后禁止刷新
2014/03/19 PHP
PHP按行读取、处理较大CSV文件的代码实例
2014/04/09 PHP
PHP面向对象教程之自定义类
2014/06/10 PHP
PHP使用PHPexcel导入导出数据的方法
2015/11/14 PHP
PHP实现随机发扑克牌
2020/04/22 PHP
JavaScript DOM 学习第五章 表单简介
2010/02/19 Javascript
json2.js的初步学习与了解
2011/10/06 Javascript
jQuery 快速结束当前正在执行的动画
2013/11/20 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
微信小程序 五星评分(包括半颗星评分)实例代码
2016/12/14 Javascript
Bootstrap 3浏览器兼容性问题及解决方案
2017/04/11 Javascript
JS基于正则表达式实现的密码强度验证功能示例
2017/09/21 Javascript
基于jQuery Ajax实现下拉框无刷新联动
2017/12/06 jQuery
js解决软键盘遮挡输入框的问题分享
2017/12/19 Javascript
node.js遍历目录的方法示例
2018/08/01 Javascript
ios中视频的最后一桢问题解决
2019/05/14 Javascript
OpenLayers3实现测量功能
2020/09/25 Javascript
[51:05]DOTA2上海特级锦标赛主赛事日 - 5 败者组决赛Liquid VS EG第一局
2016/03/06 DOTA
python正则表达式re模块详细介绍
2014/05/29 Python
python3将视频流保存为本地视频文件
2018/06/20 Python
详解python selenium 爬取网易云音乐歌单名
2019/03/28 Python
python内置函数sorted()用法深入分析
2019/10/08 Python
JavaScript+Canvas实现自定义画板的示例代码
2019/05/13 HTML / CSS
美国时装品牌:Nautica(诺帝卡)
2016/08/28 全球购物
JRE、JDK、JVM之间的关系怎样
2012/05/16 面试题
模具设计与制造专业应届生求职信
2013/10/18 职场文书
护理毕业生自我鉴定
2014/02/11 职场文书
暑期教师培训方案
2014/06/07 职场文书
2015年酒店工作总结
2015/04/28 职场文书
项目验收申请报告
2015/05/15 职场文书
民事辩护词范文
2015/05/21 职场文书
婚庆公司开业主持词
2015/06/30 职场文书
MySQL入门命令之函数-单行函数-流程控制函数
2021/04/05 MySQL
MySQL数据库之内置函数和自定义函数 function
2022/06/16 MySQL