1、如何判断用户已经登录

可以利用本地缓存判断用户是否已经登录。如:在 main.js 中封装了检查登录函数,并跳转到登录页面Vue.prototype.isLogin = function(){

try{

var suid = uni.getStorageSync('suid');

var srand = uni.getStorageSync('srand');

if (suid && srand) {return [suid, srand];}

//跳转到登录界面

uni.navigateTo({

url: '../login/login'

});

return false;

}catch(e){

return false;

}

}

在index页面判断是否登录,没有登录则跳转到登录页面点击按钮需要登录

needlogin : function(){

var loginRes = this.isLogin();

if(!loginRes){return false;}

console.log('do .....');

}

2、登录利用条件编译分端处理【app 和 小程序登录实现不一样】

登录

2.1 什么是unionID ?

“通过获取用户基本信息接口,开发者可通过OpenID来获取用户基本信息,而如果开发者拥有多个公众号,可使用以下办法通过UnionID机制来在多公众号之间进行用户帐号互通。只要是同一个微信开放平台帐号下的公众号,用户的UnionID是唯一的。

换句话说,同一用户,对同一个微信开放平台帐号下的不同应用,UnionID是相同的。”此前的OpenID机制,每个微信号对应每个公众号只有唯一的OpenID,所以不同微信公众号之间是不能共享用户的,现在有了UnionID就可以了。

2.2 app 端获取 UnionID 【打开界面直接进行登录】

export default {

methods:{

needlogin : function(){

var loginRes = this.isLogin();

if(!loginRes){return false;}

console.log('已经登录,进行后续操作,uid: '+loginRes[0]);

},

logoff : function(){

uni.showLoading({

title:""

});

try{

uni.removeStorageSync('suid');

uni.showToast({

title:"已退出",

icon:"none"

});

}catch(e){

//TODO handle the exception

}

uni.hideLoading();

}

}

}

2.3 微信端完成登录【需要按钮触发】

微信登录

var _self;

export default {

data() {

return {

}

},

methods:{

getUser : function(res){

console.log('--res---');

console.log(res);

//res 对象 detail {}

//{

// encryptedData,

//iv,

//rawData {"nickName":"深海","gender":1,...avatarUrl":"https://7tdPvkPaJlkaLFFbLAffGVApluZdanLkDVplNlAhq1EJA/132"}

//signature

//userInfo {"nickName":"深海","gender":1,...avatarUrl":"https://7tdPvkPaJlkaLFFbLAffGVApluZdanLkDVplNlAhq1EJA/132"}

//解密信息

//1 wx.login 获取code

uni.login({

success: reslogin => {

console.log(reslogin);

//{errMsg: "login:ok", code: "033xr0f12t7gQY0pNFc12Xo5f12xr0fu"}

//用 code 换 seesion_key https://developers.weixin.qq.com/miniprogram/dev/api/open-api/login/code2Session.html

var url = "https://api.weixin.qq.com/sns/jscode2session?appid="+_self.xcxappid+

"&secret="+_self.xcxsct+"&js_code="+reslogin.code+"&grant_type=authorization_code";

uni.request({

url: url,

method: 'GET',

data: {},

success: res2 => {

console.log(res2);

//{session_key: "tlPVuIsw+oUXrWa6RhujLA==", expires_in: 7200,

//openid: "oXfUD0Qfb4zpJKi7clJf8o2yZyLo", unionid: "oWajqwa5VbV_yreYBOy_pF7IQvqo"}

//此步骤的 unionid 在关注公众号或使用过小程序才会出现,所以要继续解密步骤

var session_key = res2.data.session_key;

console.log(session_key);

var url2 = 'http://grace.hcoder.net/wx-aes/demo.php';

uni.request({

url: url2,

method: 'GET',

data: {

sessionKey : session_key,

encryptedData : res.detail.encryptedData,

iv : res.detail.iv

},

success: res3 => {

console.log('res3---------------');

console.log(res3);

//与服务器交完成互注册或登录

var apiurl = this.apiurl + 'c=members&m=createUser&type=3';

uni.request({

url: apiurl,

method: 'POST',

data: {

unionid : res3.data.unionId,

name : res3.data.nickName,

face : res3.data.avatarUrl,

gender : res3.data.gender

},

header : {'content-type':'application/x-www-form-urlencoded'},

success: res => {

console.log(JSON.stringify(res));

try{

uni.setStorageSync('suid',res.data.data.u_id);

uni.setStorageSync('srand',res.data.data.u_randnum);

}catch(e){

//TODO handle the exception

}

uni.navigateBack({

delta:1

});

uni.hideLoading();

},

fail: () => {}

});

},

fail: () => {},

complete: () => {}

});

},

fail: () => {}

});

}

})

}

},

onLoad:function(){

_self = this;

// #ifdef APP-PLUS

uni.showLoading({

title:""

});

uni.login({

provider: 'weixin',

success: res => {

uni.getUserInfo({

success: (loginInfo) => {

console.log(JSON.stringify(loginInfo))

if(!loginInfo.userInfo.unionId){

uni.showToast({

title:"登录失败",

icon:"none"

});

return false;

}

//与服务器交完成互注册或登录

var apiurl = this.apiurl + 'c=members&m=createUser&type=3';

uni.request({

url: apiurl,

method: 'POST',

data: {

unionid : loginInfo.userInfo.unionId,

name : loginInfo.userInfo.nickName,

face : loginInfo.userInfo.avatarUrl,

gender : loginInfo.userInfo.gender

},

header : {'content-type':'application/x-www-form-urlencoded'},

success: res => {

console.log(JSON.stringify(res));

try{

uni.setStorageSync('suid',res.data.data.u_id);

uni.setStorageSync('srand',res.data.data.u_randnum);

}catch(e){

//TODO handle the exception

}

uni.navigateBack({

delta:1

});

uni.hideLoading();

},

fail: () => {}

});

},

fail: (e) => {

console.log(JSON.stringify(e))

}

})

},

fail: (e) => {}

});

// #endif

}

}

步骤总结1、点击按钮返回加密信息

2、使用 login 方法获取 code

3、利用 code 换 session_key

4、解密获取用户信息,包含 unionid、openid、nickname等

5、与服务端交互完成注册及登录

微信各地服务器如何同步,彻底搞清楚并实现多端同步登录相关推荐

  1. 微信的服务器 上海,昨下午部分用户无法收发文字信息和登录 微信回应:上海机房服务器发生故障 现已恢复...

    昨天下午,腾讯旗下的通讯工具微信出现不稳定情况,并在此后出现了大约两小时的故障. 昨天下午五点左右,部分用户不约而同在微博和朋友圈吐槽微信无法收发消息.有用户退出或卸载重装微信后,甚至出现了无法再次登 ...

  2. repo同步代码_一次协作多端同步,打通看云、github互相同步(serverless实践)

    本文原创首发于 https://coding3min.com/1194.html 之前在看云上专门搞了个电子书来归档和协作一些文章,支持 webhook(钩子),但是一直没用上,今天端午放假,早上就突 ...

  3. 两部苹果手机同步照片_苹果手机上的备忘录怎么同步

    备忘录通常被人们用来记录备忘事件,用于提醒什么时间该做什么事情.我就是一个特别喜欢使用备忘录记录待办事项的人,自打苹果手机开始占领国内市场后,在读大学期间就特别想买一台,但是苦于金钱不足迟迟未购买. ...

  4. netty服务器返回信息关闭,netty4 服务端同步客户端返回的结果

    netty是一个异步通讯框架,在有的时候咱们想使用服务端向客户端发送消息,服务端同步等待客户端返回结果真进行下一步的业务逻辑操做.那要怎么作才能同步获取客户端返回的数据呢?这里我用到了JDK中的闭锁等 ...

  5. 微信支付宝服务器分布,支付宝微信扫码支付中间件「第二届立创商城电子制作节30强作品」...

    原标题:支付宝微信扫码支付中间件「第二届立创商城电子制作节30强作品」 本作品为第二届立创商城电子制作节30强入围作品,作者立创社区ID:云逸Baby:转载请注明出处,未经允许不得用作商业用途.作品原 ...

  6. 微信支付服务器验证的java_Java中的微信支付(3):API V3对微信服务器响应进行签名验证...

    1. 前言 牢记一句话:公钥加密,私钥解密:私钥加签,公钥验签. 微信支付V3版本前两篇分别讲了如何对请求做签名和如何获取并刷新微信平台公钥,本篇将继续展开如何对微信支付响应结果的验签. 2. 为什么 ...

  7. 【记】微信支付服务器证书更换通知的验证流程

    [记]微信支付服务器证书更换通知的验证流程 原文:[记]微信支付服务器证书更换通知的验证流程 [重要]微信支付服务器证书更换通知,请开发人员验证以免影响交易 尊敬的微信支付商户&服务商: 因微 ...

  8. 如何找到微信的服务器地址

    最近有个TDMA项目,需求是TDMA客户通过我们的卫星进行各个分支站点的内部网络通讯,考虑到上互联网会占用卫星的带宽,寻求只开通必要的 QQ,微信聊天工具,外网邮箱,外网OA服务器等,其余网址屏蔽. ...

  9. 微信企业支付 服务器根证书,微信支付服务器证书根ca证书有什么用

    随着现如今网络的不断发展,我们的生活跟网络密不可分,现在到处充斥着手机消费,只要你手机上有微信.支付宝不管到哪里都可以买你想买的东西,钱包已经在家里闲置多时.手机支付给我们的生活带来便利的同时也会伴随 ...

最新文章

  1. Request.ServerVariables获取环境变量
  2. 文件批量重命名的技术,你值得拥有
  3. spring cloud 自定义配置源及配置刷新
  4. Visual Studio 2019连接自动的Sql Server开发版数据库(C#语言)
  5. is transfer = C ( only read dynamically) not supported in one order scenario
  6. 设计模式:面向对象的设计原则下(ISP、DIP、KISS、YAGNI、DRY、LOD)
  7. 机器学习笔记:Overview
  8. Uber要做「自动驾驶共享电动单车/滑板」,共享单车要怎么自动驾驶?
  9. asp.net 2.0中加密web.config
  10. mdf文件如何导入mysql_MDF文件如何导入到MYSQL中
  11. mac升级node版本(用n升级nodejs)
  12. 【Lee-Teambition】团队任务协作工具Teambition
  13. oracle从mysql抓数据_关于oracle数据库读取数据的三种方式
  14. MySQL查询优化系列文章
  15. C++模拟OpenGL库——图片处理及纹理系统(四):UV纹理坐标
  16. Apache rewrite URL静态化配置与参数详解
  17. 什么是作用域、作用域链
  18. 洛谷 P3389 【模板】高斯消元法 × 洛谷 P2455 [SDOI2006]线性方程组
  19. 艾伟_转载:一个.NET委托的故事:彼得,老板和宇宙
  20. 小组取什么名字好_好消息!这座天桥今年年底完工!取什么名字,等你出主意...

热门文章

  1. 2017.3.23 特别行动队 思考记录
  2. 【英语学习】【加州教材】【G5】【科学】Science目录及术语表
  3. 【英语学习】【WOTD】prodigous 释义/词源/示例
  4. [转载]拉格朗日乘子法如何理解?
  5. 什么是计算机计算机网络的主要功能是什么,计算机网络的三大主要功能是什么?-与非网...
  6. 联影uEXPLORER全身扫描仪获FDA批准,2019年初将在美国上市...
  7. Windows Mobile 开发系列文章收藏 - Windows Mobile 6.x
  8. 基于R树索引的点面关系判断以及效率优化统计
  9. 图解VMWare10创建虚拟机
  10. Kafka Broker常用配置详解