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


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 相关文章推荐
用于table内容排序
Jul 21 Javascript
HTML长文本截取含有HTML代码同样适用的两种方法
Jul 31 Javascript
JavaScript分页功能的实现方法
Apr 25 Javascript
浅析jquery数组删除指定元素的方法:grep()
May 19 Javascript
ReactNative页面跳转实例代码
Sep 27 Javascript
简易的JS计算器实现代码
Oct 18 Javascript
JavaScript 输出显示内容(document.write、alert、innerHTML、console.log)
Dec 14 Javascript
在vue项目中使用element-ui的Upload上传组件的示例
Feb 08 Javascript
基于vue中css预加载使用sass的配置方式详解
Mar 13 Javascript
vue3.0 CLI - 2.3 - 组件 home.vue 中学习指令和绑定
Sep 14 Javascript
微信小程序下拉菜单效果的实例代码
May 14 Javascript
vue+django实现一对一聊天功能的实例代码
Jul 17 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无限分类的类
2007/01/02 PHP
PHP 开源框架22个简单简介
2009/08/24 PHP
php笔记之:php函数range() round()和list()的使用说明
2013/04/26 PHP
与文件上传有关的php配置参数总结
2013/06/14 PHP
[原创]ThinkPHP中SHOW_RUN_TIME不能正常显示运行时间的解决方法
2015/10/10 PHP
php基于curl实现随机ip地址抓取内容的方法
2016/10/11 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
PHP mongodb操作类定义与用法示例【适合mongodb2.x和mongodb3.x】
2018/06/16 PHP
解决PHP使用CURL发送GET请求时传递参数的问题
2019/10/11 PHP
php设计模式之职责链模式实例分析【星际争霸游戏案例】
2020/03/27 PHP
js输出阴历、阳历、年份、月份、周示例代码
2014/01/29 Javascript
javascript跨域的4种方法和原理详解
2014/04/08 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
跟我学习javascript的arguments对象
2015/11/16 Javascript
jQuery Uploadify 上传插件出现Http Error 302 错误的解决办法
2015/12/12 Javascript
你有必要知道的25个JavaScript面试题
2015/12/29 Javascript
jQuery双向列表选择器DIV模拟版
2016/11/01 Javascript
使用jQuery卸载全部事件的思路详解
2017/04/03 jQuery
Vuejs在v-for中,利用index来对第一项添加class的方法
2018/03/03 Javascript
详解JavaScript实现动态的轮播图效果
2019/04/29 Javascript
vue 获取url参数、get参数返回数组的操作
2020/11/12 Javascript
[01:19]DOTA2城市挑战赛报名开始 开启你的城市传奇
2018/03/23 DOTA
8段用于数据清洗Python代码(小结)
2019/10/31 Python
python 串口读取+存储+输出处理实例
2019/12/26 Python
CSS3弹性盒模型开发笔记(三)
2016/04/26 HTML / CSS
HTML5页面中尝试调起APP功能
2017/09/12 HTML / CSS
日本快乐生活方式购物网站:Shop Japan
2018/07/17 全球购物
美国环保妈妈、儿童和婴儿用品购物网站:The Tot
2019/11/24 全球购物
Java里面如何创建一个内部类的实例
2015/01/19 面试题
3的组成教学反思
2014/04/30 职场文书
大型演出策划方案
2014/05/28 职场文书
党的群众路线对照检查材料思想汇报
2014/09/25 职场文书
房屋买卖协议书范本
2014/09/27 职场文书
2015年班级元旦晚会活动总结
2014/11/28 职场文书
傅雷家书读书笔记
2015/06/29 职场文书
Springboot/Springcloud项目集成redis进行存取的过程解析
2021/12/04 Redis