一. 小程序不支持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);
}
})
},

微信小程序登录的更多相关文章

  1. 微信小程序登录方案

    微信小程序登录方案 登录程序 app.js 调用wx.login获取code 将code作为参数请求自己业务登录接口获取session_key 存储session_key 如果有回调执行回调 App( ...

  2. 微信小程序登录,获取code,获取openid,获取session_key

    微信小程序登录 wx.login(Object object) 调用接口获取登录凭证(code).通过凭证进而换取用户登录态信息,包括用户的唯一标识(openid)及本次登录的会话密钥(session ...

  3. 基于Shiro,JWT实现微信小程序登录完整例子

    小程序官方流程图如下,官方地址 : https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/login.html ...

  4. 微信小程序登录JAVA后台

    代码地址如下:http://www.demodashi.com/demo/12736.html 登录流程时序登录流程时序 具体的登录说明查看 小程序官方API 项目的结构图: springboot项目 ...

  5. 微信小程序登录对接Django后端实现JWT方式验证登录

    先上效果图 点击授权按钮后可以显示部分资料和头像,点击修改资料可以修改部分资料. 流程 1.使用微信小程序登录和获取用户信息Api接口 2.把Api获取的用户资料和code发送给django后端 3. ...

  6. 全栈项目|小书架|微信小程序-登录及token鉴权

    小程序登录 之前也写过微信小程序登录的相关文章: 微信小程序~新版授权用户登录例子 微信小程序-携带Token无感知登录的网络请求方案 微信小程序开通云开发并利用云函数获取Openid 也可以通过官方 ...

  7. Flask与微信小程序登录(后端)

    开发微信小程序时,接入小程序的授权登录可以快速实现用户注册登录的步骤,是快速建立用户体系的重要一步.这篇文章将介绍 python + flask + 微信小程序实现用户快速注册登录方案(本文主要进行后 ...

  8. Taro -- 微信小程序登录

    Taro微信小程序登录 1.调用Taro.login()获取登录凭证code: 2.调用Taro.request()将code传到服务器: 3.服务器端调用微信登录校验接口(appid+appsecr ...

  9. Spring Security 整合 微信小程序登录的思路探讨

    1. 前言 原本打算把Spring Security中OAuth 2.0的机制讲完后,用小程序登录来实战一下,发现小程序登录流程和Spring Security中OAuth 2.0登录的流程有点不一样 ...

  10. 微信小程序 登录流程规范解读

    一. 官方登录时序图 二. 简单理解 这里仅按照官方推荐的规范来 0. 前置条件 一共有三端: - 微信小程序客户端 - 第三方服务器端(自己搭建) - 微信服务器端 1. 客户端获得code,并将c ...

随机推荐

  1. EnglishWords----1

    upon在...上面 upright垂直的,直立的 upward向上的 outward外面的,向外的 downward向下的 vertical垂直的 parallel平行的 sow播种 cut切 ch ...

  2. 利用transform制作幻灯片

    html代码 <html><head></head><body><div class='hpic'> <ul style=" ...

  3. 使用cisco SDM管理路由器

    实验拓扑: 实验目的:掌握如何通过SDM对路由器进行管理 实验需求:设置R1使其能够通过SDM进行管理 实验步骤: 步骤一:配置基本IP地址 步骤二:在R1上进行设置,使其能够通过SDM连接 R1(c ...

  4. 设计模式之建造者模式(Builder)

    一个人活到70岁以上,都会经历这样的几个阶段:婴儿,少年,青年,中年,老年.并且每个人在各个阶段肯定是不一样的呀,我觉得可以说世界上不存在两个人在人生的这5个阶段的生活完全一样,但是活到70岁以上的人 ...

  5. hbase port

    From "Jonathan Hsieh (JIRA)" <j...@apache.org> Subject [jira] [Updated] (HBASE-10123 ...

  6. MDK的优化应用(转)

    源:http://blog.163.com/zhaojun_xf/blog/static/300505802011291384721/ 使用Keil/MDK这么多年了,一直都没有使用它的代码优化功能. ...

  7. 2016青岛网络赛 Barricade

    Barricade Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Proble ...

  8. ural1037 Memory Management

    Memory Management Time limit: 2.0 secondMemory limit: 64 MB Background Don't you know that at school ...

  9. POJ 1062 昂贵的聘礼详解最短路变形

    POJ上难得一见的中文题…… 思路:建立一个以0为源点的地图,那么Map[0][n]的值代表 第n号物品的价值,Map[i][j]代表用 j  替代 i 后,物品j的价值.我们认为酋长的承诺为节点 ‘ ...

  10. jaxb异常 Class has two properties of the same name username

    import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; im ...