微信开放平台PC端扫码登录功能个人总结
最近公司给我安排一个微信登录的功能,需求是这样的:
1.登录授权
点击二维码图标后,登录界面切换为如下样式(二维码),微信扫描二维码并授权,即可成功登录;
若当前账号未绑定微信账号,扫描后提示“您的账号未绑定微信号,请先登录绑定”;
点击“返回”按钮,界面切换为账号密码登录;
若微信号绑定多个账号在,则展示所绑定全部账号的用户名和企业名,选择账号后点击登录按钮成功登录;
2.扫描绑定
账号登录后检测当前账号open_id为空,则展示当前弹窗(001管理员账号除外);
用户微信扫描二维码后,将当前微信号绑定至对应账号;
若微信号之前绑定其他账号,则对应open_id下增加一个账号;
3.个人资料
新增一个'微信号'字段:显示账号是否绑定
好,现在整理逻辑,理清思路,画图:

声明一下,PC端的微信扫码登录是微信开放平台,移动端关注是跳转第三方应用的,用的是公众平台,两个的接口地址拿的openId不一样,开放平台下面如果创建多个应用或者绑定多个公众号,各公众号之间用unionId打通。
openId和unionId区别:http://www.25xt.com/html5css3/11968.html
公司或者企业在开发前 登录微信开放平台,注册认证,创建一个应用(应用就是你的项目,产品,不知道就直接让产品帮你注册认证,一般需要一个礼拜时间审批+300人民币,完了拿到AppId和AppSecret)


自己的本地环境要映射到外网,那样微信才能访问到自己接口来。推荐使用ngrok,不会的网上有教程,我的是直接让人帮我配的。
准备工作做好,开始开发:
第一步:根据文档生成二维码(开放平台 --> 资源中心 --> 网站应用 --> 微信登录功能 --> 网站应用微信登录开发指南)
我这里不需要生成整个页面,而是在一个div里生成,所以用js生成:
1.在页面中先引入如下JS文件(支持https):
<script src="http://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js"></script>
2.在需要使用微信登录的地方实例以下JS对象:
var obj = new WxLogin({
id:"login_container", //div的id
appid: "",
scope: "",
redirect_uri: "", //回调地址
state: "", //参数,可带可不带
style: "", //样式 提供"black"、"white"可选,默认为黑色文字描述
href: "" //自定义样式链接,第三方可根据实际需求覆盖默认样式。
});
这里生成的二维码供用户扫描,扫描成功,移动端出现授权页面,需用户确认。
回调地址里面的域名要在开放平台去配:

二维码就生成好了,可以看看效果,还没调样式:


再来看授权步骤:
第一步,获取code。
调用接口:https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect;
接口中参数如下:

自己代码:
@Override
public Map<String, String> weixinLoginUrl() {
String url = "https://open.weixin.qq.com/connect/qrconnect?appid=" + openPlatformAppId + "&redirect_uri="
+ URL.encode("'"+ openPlatformRedirect_uri +"'/getWxLoginCode") + "&response_type=code" + "&scope=snsapi_login"
+ "&state=STATE#wechat_redirect";
Map<String, String> map = new HashMap<String, String>();
map.put("url", url);
map.put("getRedirect_uri", openPlatformRedirect_uri); //openPlatformRedirect_uri为配置文件里的域名(开放平台配好的)
9 return map;
}
解释代码:
openPlatformAppId为自己的AppId,
openPlatformRedirect_uri为自己配的域名,(请忽略我的方法命名和参数命名...别学我!)
这里提一下,登录的scope=snsapi_login,公众平台里scope有userInfo(用户有感知)和baseInfo(用户无感知,静默授权)
返回给controller,controller重新请求一遍地址,这时候进入的是微信回调地址了,里面就会有code参数,根据code参数就可以拿access_token了,controller代码:
@RequestMapping(value = "/wxLoginCheck", method = RequestMethod.GET)
@ResponseBody
public String wxLoginCheck() {
Map<String, String> weixinLoginUrl = alarmWxMessageService.weixinLoginUrl();
String url = weixinLoginUrl.get("url");
return "<script>location.href='" + url + "'</script>";
}
这时候return的回调地址变成了第一步回调地址参数的那个地址("/getWxLoginCode"),域名没写了
第二步,通过code获取access_token
调用接口:https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code;
接口中参数如下:

自己代码:
controller:
@RequestMapping(value = "/getWxLoginCode", method = RequestMethod.GET)
public String getWxLoginCode(String code) {
WeixinOauth2Token wxot=alarmWxMessageService.wxLogingetCode(code);
String openId = wxot.getOpenId();
String accessToken = wxot.getAccessToken();
}
解释代码:
code直接能拿到了,WeixinOauth2Token 为实体类,封装openId和access_token之类字段
serviceImpl:
@Override
public WeixinOauth2Token wxLogingetCode(String code) {
WeixinOauth2Token wat = null;
String getTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + openPlatformAppId
+ "&secret=" + openPlatformAppSecret
+ "&code=" + code
+ "&grant_type=authorization_code";
// 获取网页授权凭证
JSONObject jsonObject = JSONObject.fromObject(HttpUtil.Get(getTokenUrl));
if (jsonObject != null) {
try {
wat = new WeixinOauth2Token();
wat.setAccessToken(jsonObject.getString("access_token"));
wat.setOpenId(jsonObject.getString("openid")); } catch (Exception e) {
wat = null;
int errorCode = jsonObject.getInt("errorCode");
String errorMsg = jsonObject.getString("errorMsg");
log.error("获取网页授权失败errorCode=" + errorCode + ",errorMsg=" + errorMsg);
}
}
return wat;
}
解释代码:
openPlatformAppId为自己的AppId,
openPlatformAppSecret为自己的密码,
code为之前获取到的code,
json那一段是重新发送一个get请求,方法在HttpUtil里封装的,下面贴出。
/**
* 向指定URL发送GET方法的请求
*
* @param url 发送请求的URL
* @param param 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String Get(String url) {
int connectionTimeOut=HTTP_CONNECTION_TIMEOUT, readTimeOut =HTTP_READ_TIMEOUT;
String result = "";
BufferedReader in = null;
String urlNameString = url;
try {
logger.info("请求url+参数:" + urlNameString);
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setConnectTimeout(connectionTimeOut);
connection.setReadTimeout(readTimeOut);
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
logger.error("发送GET请求出现异常!url: " + urlNameString + ", " + e);
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
logger.error("close exception", e2);
}
}
return result;
}
到这里,已经授权完了,能拿到用户的openId,用这个去完成公司相关业务。文档上面的刷新access_token没有做,自己可以去了解下
后来做完了,推送消息那边要拿我这个openId,才发现,登录是开放平台的,推送消息是公众平台的,平台都不一样,openId肯定不一样,所以又重新开发一遍登录,什么东西都是自己实现。。。。。。
注意:unionId,统一管理多个公众号或者多个应用而产生的一个机制,像这次开发的,开放平台和公众平台不能用这个
个人总结一下,开发一个东西之前,思路一定要理清,不然会绕来绕去把自己绕晕,技术都不是问题,重要的是思路;
代码部分,命名符合规范,让人看的懂是什么意思,注释也要全,让人明白写的什么;
登录模块要好好研究一下,调用登录方法去登录,实现的原理和登录时安全问题要考虑到;
技术上新用ModelMap这个对象,后台存储:map.put("名字","值"),前台直接拿:var corpUsers = '${requestScope.名字}';
List Map json 互相转换、传值、接收值;
重发请求的GET、POST方法;
spring重定向、jsp重定向等。
微信ui地址:https://weui.io/
开发小白,如果有错误的地方尽请大佬们指出,谢谢
微信开放平台PC端扫码登录功能个人总结的更多相关文章
- C#实现像微信PC版一样的扫码登录功能
现在好些网站都支持扫码登录,感觉上安全了很多,但是本地程序扫码登录的不多,就用C#实现了一下,需要作如下准备 在官网上申请一个企业微信,有条件的话做个企业认证吧,我们的是认证过的,所以账号和本地其他系 ...
- php微信支付(仅pc端扫码支付模式二)详细步骤.----仅适合第一次做微信开发的程序员
本人最近做了微信支付开发,是第一次接触.其中走了很多弯路,遇到的问题也很多.为了让和我一样的新人不再遇到类似的问题,我把我的开发步骤和问题写出来,以供参考. 开发时间是2016/8/10,所以微信支付 ...
- Java微信公众平台开发之扫码支付模式一
官方文档点击查看准备工作:已通过微信认证的公众号,必须通过ICP备案域名(否则会报支付失败)借鉴了很多大神的文章,在此先谢过了大体过程:先扫码(还没有确定实际要支付的金额),这个码是商品的二维码,再生 ...
- Java微信公众平台开发之扫码支付模式二
官方文档点击查看 准备工作:已通过微信认证的公众号,域名可以不通过ICP备案借鉴了很多大神的文章,在此先谢过了大体过程:根据固定金额和商品的ID先生成订单,再生成二维码,客户扫一扫付款模式二支付的流程 ...
- PHP对接微信扫码登录
1.PC端扫码登录 如果你将微信小程序和公众账号绑定同一个微信开放平台,那么他们各自的接口返回有一个参数unionid是相同的(没有绑定微信公众账号就没有):那么你就可以使用这个unionid来做业务 ...
- 初涉扫码登录:edusoho实现客户端扫码登录(简版)
一.项目简介及需求 edusoho是一套商业版的在线教育平台,项目本身基于symfony2框架开发,现在有一款自己的APP,要求在不多修改edusoho自身代码的基础上,实现客户端对PC端扫码登录.不 ...
- Swoole 的微信扫码登录
微信应用的便捷,扫码登录方式越来越被现在的应用所使用.它因为不用去记住密码,只要有微信号即可方便快捷登录.微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实 ...
- 基于 Swoole 的微信扫码登录
随着微信的普及,扫码登录方式越来越被现在的应用所使用.它因为不用去记住密码,只要有微信号即可方便快捷登录.微信的开放平台原生就有支持扫码登录的功能,不过大部分人还是在用公众平台,所以扫码登录只能自行实 ...
- Tapdata Cloud 2.1.2 来啦:大波细节已就绪!字段类型可批量修改、支持微信扫码登录、新增支持 Vika 为目标
Tapdata Cloud cloud.tapdata.net 让数据实时可用 Tapdata Cloud 是国内首家异构数据库实时同步云平台,目前支持 Oracle.MySQL.PG.SQL Ser ...
随机推荐
- 题解报告:poj 2752 Seek the Name, Seek the Fame(kmp前缀表prefix_table的运用)
Description The little cat is so famous, that many couples tramp over hill and dale to Byteland, and ...
- Fighting
class Demo { public static void main(String[] args) { int a=3,b=8; int c=(a>b)?a++:b++; System.ou ...
- 为什么JAVA虚拟机分为线程共享和非线程共享?
大多数 JVM 将内存区域划分为 Method Area(Non-Heap)(方法区) ,Heap(堆) , Program Counter Register(程序计数器) , VM Stack(虚拟 ...
- google breakpad 使用初步总结
项目地址:https://code.google.com/p/google-breakpad/ 访问不了请挂VPN 这是一个由google主导的开源项目,官方介绍为:An open-source ...
- AJPFX分析int 和integer的区别
int是java提供的8种原始数据类型之一.Java为每个原始类型提供了封装类,Integer是java为int提供的封装类.int的默认值为0,而Integer的默认值为null,即Integer可 ...
- rest_framework基于generics.CreateAPIView创建用户
最近在写新版的devops3.0,被generics.CreateAPIView创建用户密码序列化的问题折磨的欲仙欲死.反复看源码测试,得出下面的流程,这也是做generics.CreateAPIVi ...
- 如何理解JavaScript的单线程
JS的本质是单线程的.这点区别于JAVA的两个线程并发 但是,平时的JS,确实是同时运行很多任务,这又是怎么回事???? First,js的代码分为两种.同步代码和异步代码. console.log( ...
- idea 2018 解决 双击shift 弹出 search everywhere 搜索框的方法
https://youtrack.jetbrains.com/issue/IDEA-161094
- druid数据库连接池整合到SpringMvc
1.maven项目加入相关的依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>dru ...
- emil 的使用
摘抄自别人 RFC882文档规定了如何编写一封简单的邮件(纯文本邮件),一封简单的邮件包含邮件头和邮件体两个部分,邮件头和邮件体之间使用空行分隔. 邮件头包含的内容有: from字段 --用于指明发 ...