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


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
SyntaxHighlighter代码加色使用方法
Sep 07 Javascript
contains和compareDocumentPosition 方法来确定是否HTML节点间的关系
Sep 13 Javascript
javascript 判断字符串是否包含某字符串及indexOf使用示例
Oct 18 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
jQuery解析与处理服务器端返回xml格式数据的方法详解
Jul 04 Javascript
node.js报错:Cannot find module 'ejs'的解决办法
Dec 14 Javascript
JS实现的五级联动菜单效果完整实例
Feb 23 Javascript
深入浅出webpack教程系列_安装与基本打包用法和命令参数详解
Sep 10 Javascript
在React 组件中使用Echarts的示例代码
Nov 08 Javascript
swiper插件自定义切换箭头按钮
Dec 28 Javascript
用vue设计一个日历表
Dec 03 Vue.js
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
帅气的琦玉老师
2020/03/02 日漫
PHP is_dir() 判断给定文件名是否是一个目录
2010/05/10 PHP
php目录操作函数之获取目录与文件的类型
2010/12/29 PHP
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
YII动态模型(动态表名)支持分析
2016/03/29 PHP
服务器安全设置的几个注册表设置
2007/07/28 Javascript
js 鼠标点击事件及其它捕获
2009/06/04 Javascript
JQuery 入门实例1
2009/06/25 Javascript
jQuery 获取对象 基本选择与层级
2010/05/31 Javascript
jQuery基本过滤选择器使用介绍
2013/04/18 Javascript
js中小数转换整数的方法
2014/01/26 Javascript
table insertRow、deleteRow定义和用法总结
2014/05/14 Javascript
javascript实现鼠标拖动改变层大小的方法
2015/04/30 Javascript
vue跨域解决方法
2017/10/15 Javascript
在Vue组件上动态添加和删除属性方法
2018/02/23 Javascript
React Native使用fetch实现图片上传的示例代码
2018/03/07 Javascript
JavaScript代码实现txt文件的上传预览功能
2018/03/27 Javascript
解决LayUI表单获取不到data的问题
2018/08/20 Javascript
webpack4+Vue搭建自己的Vue-cli项目过程分享
2018/08/29 Javascript
Vue路由前后端设计总结
2019/08/06 Javascript
微信小程序 调用远程接口 给全局数组赋值代码实例
2019/08/13 Javascript
jquery添加div实现消息聊天框
2020/02/08 jQuery
[01:48]DOTA2 2015国际邀请赛中国区预选赛第二日战报
2015/05/27 DOTA
Pyramid Mako模板引入helper对象的步骤方法
2013/11/27 Python
Django集成百度富文本编辑器uEditor攻略
2014/07/04 Python
利用Python实现原创工具的Logo与Help
2018/12/03 Python
Python常见读写文件操作实例总结【文本、json、csv、pdf等】
2019/04/15 Python
python抓取多种类型的页面方法实例
2019/11/20 Python
Toppik顶丰增发纤维官网:解决头发稀疏
2017/12/30 全球购物
NYX Professional Makeup官方网站:专业彩妆和美容产品
2019/10/29 全球购物
公司综合部的成员自我评价分享
2013/11/05 职场文书
暑期学习心得体会
2014/09/02 职场文书
写给导师的自荐信
2015/03/06 职场文书
JavaScript使用canvas绘制坐标和线
2021/04/28 Javascript
用几道面试题来看JavaScript执行机制
2021/04/30 Javascript
Java虚拟机内存结构及编码实战分享
2022/04/07 Java/Android