微信小程序登录
一. 小程序不支持cookie会话
1. 通过传递与检验3rd_session来保持会话
2. 3rd_session可以执行‘`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`该命令生成
3. 使用Redis或者数据库存储session
4. 生成的3rd_session发送给客户端,写入storage
5. 客户端的每次请求必须带上3rd_session
二、加密数据解码
1. $iv,$code是被加密过的数据,由于请求过程中因为编码原因+号变成了空格,所以我们需要用下面的方法转换回来
function define_str_replace($data){
return str_replace(' ','+',$data);
}
三、例子:
php
// 微信登录
public function weixin_login(){
$session_db=D('Session');
$session_id=I('get.sessionid','');
$session=$session_db->getSession($session_id);
if( !empty( $session ) ){
$this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_id]);
}else{
$iv=define_str_replace(I('get.iv')); //把空格转成+
$encryptedData=urldecode(I('get.encryptedData')); //解码
$code=define_str_replace(I('get.code')); //把空格转成+
$msg=D('Weixin')->getUserInfo($code,$encryptedData,$iv); //获取微信用户信息(openid)
if($msg['errCode']==0){
$open_id=$msg['data']->openId;
$users_db=D('Users');
$info=$users_db->getUserInfo($open_id);
if(!$info||empty($info)){
$users_db->addUser(['open_id'=>$open_id,'last_time'=>['exp','now()']]); //用户信息入库
$info=$users_db->getUserInfo($open_id); //获取用户信息
$session_id=`head -n 80 /dev/urandom | tr -dc A-Za-z0-9 | head -c 168`; //生成3rd_session
$session_db->addSession(['uid'=>$info['id'],'id'=>$session_id]); //保存session
}
if($session_id){
$this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_id]); //把3rd_session返回给客户端
}else{
$this->ajaxReturn(['error_code'=>0,'sessionid'=>$session_db->getSid($info['id'])]);
} }else{
$this->ajaxReturn(['error_code'=>'用户信息获取失败!']);
} }
}
获取微信信息模型(包括信息解密,官方例子点击下载)
require_once ABS_APP_PATH.'/Addon/Aes/wxBizDataCrypt.php';
class WeixinModel{
// 获取微信的用户信息(openid)
public function getUserInfo($code,$encryptedData,$iv){
$appid=C('appid');
$secret=C('secret');
$grant_type='authorization_code';
$url='https://api.weixin.qq.com/sns/jscode2session';
$url= sprintf("%s?appid=%s&secret=%s&js_code=%s&grant_type=%",$url,$appid,$secret,$code,$grant_type);
$user_data=json_decode(file_get_contents($url));
$session_key= define_str_replace($user_data->session_key);
$data="";
$wxBizDataCrypt=new \WXBizDataCrypt($appid,$session_key);
$errCode=$wxBizDataCrypt->decryptData($encryptedData,$iv,$data);
return ['errCode'=>$errCode,'data'=>json_decode($data),'session_key'=>$session_key];
}
}
javascript
getUserInfo: function(cb) {
var that = this
if (this.globalData.userInfo) {
typeof cb == "function" && cb(this.globalData.userInfo)
} else {
//调用登录接口
wx.login({
success: function(r) {
wx.getUserInfo({
success: function(res) {
that.login({
code: r.code,
iv: res.iv,
encryptedData: encodeURIComponent(res.encryptedData),
})
that.globalData.userInfo = res.userInfo
typeof cb == "function" && cb(that.globalData.userInfo)
}
})
}
})
}
},
login: function(param) {
wx.request({
url: this.requestUrl('Index/weixin_login'),
data: param,
header: {
'content-type': "application/json",
},
success: function(res) {
var data = JSON.parse(res.data.trim());
wx.setStorageSync('sessionid', data.sessionid);
}
})
},
微信小程序登录的更多相关文章
- 微信小程序登录方案
微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App( ...
- 微信小程序登录,获取code,获取openid,获取session_key
微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...
- 基于Shiro,JWT实现微信小程序登录完整例子
小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...
- 微信小程序登录JAVA后台
代码地址如下:http://www.demodashi.com/demo/12736.html 登录流程时序登录流程时序 具体的登录说明查看 小程序官方API 项目的结构图: springboot项目 ...
- 微信小程序登录对接Django后端实现JWT方式验证登录
先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 流程 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3. ...
- 全栈项目|小书架|微信小程序-登录及token鉴权
小程序登录 之前也写过微信小程序登录的相关文章: 微信小程序~新版授权用户登录例子 微信小程序-携带Token无感知登录的网络请求方案 微信小程序开通云开发并利用云函数获取Openid 也可以通过官方 ...
- Flask与微信小程序登录(后端)
开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...
- Taro -- 微信小程序登录
Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...
- Spring Security 整合 微信小程序登录的思路探讨
1. 前言 原本打算把Spring Security中OAuth 2.0的机制讲完后,用小程序登录来实战一下,发现小程序登录流程和Spring Security中OAuth 2.0登录的流程有点不一样 ...
- 微信小程序 登录流程规范解读
一. 官方登录时序图 二. 简单理解 这里仅按照官方推荐的规范来 0. 前置条件 一共有三端: - 微信小程序客户端 - 第三方服务器端(自己搭建) - 微信服务器端 1. 客户端获得code,并将c ...
随机推荐
- 基础-session,cookie,jsp,EL,JSTL
会话可以简单理解为:用户打开一个浏览器,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话. kookie是在服务器端创建的,返回给浏览器,在浏览器的目录中保存了,下一次 ...
- IDAPython: importing “site” failed
问题:IDA启动时,弹出IDAPython: importing “site” failed对话框. 解决办法:环境变量添加PYTHONHOME,值为python安装路径,比如:C:\Python27
- ant脚本
jenkins在调用ant脚本时会遇到ant中的目标没有成功,但是最后的build状态却是success,如下图所示:代码中缺少一个},编译发生错误,最后的build成功. 解决方案:在关键的targ ...
- JS 新浪API获取IP归属地
http://int.dpool.sina.com.cn/iplookup/iplookup.php?format=js 返回值数据格式:var remote_ip_info = {“ret”:1,” ...
- 读《Ext.JS.4.First.Look》随笔
Ext JS 4是最大的改革已经取得了Ext框架.这些变化包括一个新类系统,引入一个新的平台,许多API变化和改进,和新组件,如新图表和新画组件.Ext JS 4是更快,更稳定,易于使用.(注意:Ex ...
- java 工作内存
所谓线程的“工作内存”到底是个什么东西?有的人认为是线程的栈,其实这种理解是不正确的.看看JLS(java语言规范)对线程工作 内存的描述,线程的working memory只是cpu的寄存器和高速缓 ...
- Day05_JAVAEE系列:Junit
Junit 单元测试开发工具:myeclipse10 内部集成的junit的库 1)什么是junit? junit是一个专业的编写测试代码的工具 2)建立junit测试类的步骤: 2. ...
- Android MediaScanner 详尽分析
[Innost]: http://blog.csdn.net/Innost/article/details/6083467 ====================================== ...
- mac地址静态捆绑,防止arp欺骗
arp -s 192.168.1.101 00-21-CC-D3-D5-FF 缺点,每次关机就还原,所以一般创建批处理文件,开机启动. ping 192.168.1.100 -l 65500 多台肉鸡 ...
- LCD12864 液晶显示-汉字及自定义显示(并口)
LCD12864带字库,型号:CM12864-12.其相关数据手册可以在百度中搜索“ST7920 系列中文图形液晶模块使用说明书”,里面有详细的介绍.这里就不在多描述. 其原理简图:(我们只需关心接口 ...