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


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 操作css样式、位置、尺寸方法汇总
Nov 28 Javascript
jQuery实现滚动切换的tab选项卡效果代码
Aug 26 Javascript
JavaScript+html5 canvas绘制的圆弧荡秋千效果完整实例
Jan 26 Javascript
JS中dom0级事件和dom2级事件的区别介绍
May 05 Javascript
jQuery中通过ajax调用webservice传递数组参数的问题实例详解
May 20 Javascript
AngularJS创建自定义指令的方法详解
Nov 03 Javascript
Bootstrap基本样式学习笔记之表格(2)
Dec 07 Javascript
jQuery纵向导航菜单效果实现方法
Dec 19 Javascript
node.js通过axios实现网络请求的方法
Mar 05 Javascript
vue项目使用axios发送请求让ajax请求头部携带cookie的方法
Sep 26 Javascript
微信小程序通过一个json实现分享朋友圈图片
Sep 03 Javascript
layui use 定义js外部引用函数的方法
Sep 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开发过程中常用函数收藏
2009/12/14 PHP
探讨PHP函数ip2long转换IP时数值太大产生负数的解决方法
2013/06/06 PHP
解析:使用php mongodb扩展时 需要注意的事项
2013/06/18 PHP
php使用Image Magick将PDF文件转换为JPG文件的方法
2015/04/01 PHP
详谈PHP编码转换问题
2015/07/28 PHP
PHP-FPM实现性能优化
2016/03/31 PHP
关于Curl在Swoole协程中的解决方案详析
2019/09/12 PHP
查看图片(前进后退)功能实现js代码
2013/04/24 Javascript
jquery 通过name快速取值示例
2014/01/24 Javascript
JS实现的生成随机数的4个函数分享
2015/02/11 Javascript
详谈LABJS按需动态加载js文件
2015/05/07 Javascript
javascript框架设计之浏览器的嗅探和特征侦测
2015/06/23 Javascript
jQuery.each使用详解
2015/07/07 Javascript
js中利用cookie实现记住密码功能
2020/08/20 Javascript
用director.js实现前端路由使用实例
2017/01/27 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
利用jQuery异步上传文件的插件用法详解
2017/07/19 jQuery
angular4中关于表单的校验示例
2017/10/16 Javascript
JavaScript html5 canvas实现图片上画超链接
2017/10/20 Javascript
使用live-server快速搭建本地服务器+自动刷新的方法
2018/03/09 Javascript
基于jQuery实现无缝轮播与左右点击效果
2018/05/13 jQuery
React注册倒计时功能的实现
2018/09/06 Javascript
React 实现拖拽功能的示例代码
2019/01/06 Javascript
微信公众平台 发送模板消息(Java接口开发)
2019/04/17 Javascript
vue权限问题的完美解决方案
2019/05/08 Javascript
python实现随机密码字典生成器示例
2014/04/09 Python
用Python实现协同过滤的教程
2015/04/08 Python
python函数超时自动退出的实操方法
2020/12/28 Python
雅诗兰黛美国官网:Estee Lauder美国
2016/07/21 全球购物
英国电动工具购买网站:Anglia Tool Centre
2017/04/25 全球购物
美国婚戒购物网站:Anjays Designs
2017/06/28 全球购物
德国BA保镖药房韩文网:kr.ba.de
2017/09/04 全球购物
个人自荐书
2013/12/20 职场文书
乳制品整治工作方案
2014/05/29 职场文书
学校党风廉政建设调研报告
2015/01/01 职场文书
2016年校园植树节广播稿
2015/12/17 职场文书