企业微信之扫码登陆
一.本篇文章要点
源码已上线:
首先可以参照文档:
下面是我对这个扫码登录的一些见解:
1. 买一个云服务器,将域名与ip绑定,将所有端口放开 比如80端口。 2. 公司提供内网ip, 用花生壳映射一个域名。(比如花生壳映射) 3. 如何验证自己的域名和ip有没有绑定上?ip访问你的项目 域名访问你的项目 代码中涉及到的类都差不多已经贴出来了,可以参考着自己写。
二.扫码登录的整体流程
- 然后企业应用通过 corpid 和 corpsecret 获取access_token ;
- 企业应用通过 access_token 和 code 获取用户身份,进入相应的系统。
三.代码的实现
2.配置应用信息 其中AgentId 和Secret 是比较重要的参数
注意: 1.网页授权及js_Sdk 中的可信域名要进行验证,如果项目用的是tomcat,那么验证的文件直接放在tomcat 下- webapp下的Root文件夹,如果是Springboot项目,可以把验证的文件放到static文件夹下,只要能够按照上面的提示 能访问到这个文件都可以。
3.现在环境已经搭建好了,首先进入的是扫码登陆的页面 (要引用一个js文件,可以从官方文档上下载,放入自己的项目中)
注意:1.appid----->后台管理页面中点击我的应用中的CorpID(即企业的id)
4.接下来就是我的接口 AccessTokenController,拿到扫码登陆过来的code ,根据code获取用户信息,然后这个Access_Token是会过期,要将其缓存并更新,其中的Contacts_service是用来做获取成员信息的
5. WeixinUtil中对Access_Token进行处理的方法
public static String getAccessToken(AccessTokenService accService, String type, String corpId, String secret) {
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
List<AccessToken> access = accService.findAccessToken(type);
// 如果没有AccessToken的话
AccessToken accessToken = null;
if (access.size() <= 0) {
// 首先要查询到accessToken(第一次查询的话,将accessToken保存到数据库中)
accessToken = WeiXinUtil.getAccessToken(corpId, secret, type);
System.out.println("accessToken:" + accessToken.getToken());
int row = accService.insertAccessToken(accessToken);
if (row > 0) {
System.out.println("增加成功");
}
return accessToken.getToken();
} else {
accessToken = access.get(0);
String saveTime = accessToken.getSaveDate();
long time = sdf.parse(saveTime).getTime();
long now = new Date().getTime();
long interval = (now - time) / 1000;
if (interval > 7000) {// 超过7000秒,重新获取accessToken
accessToken = WeiXinUtil.getAccessToken(
WeiXinParamesUtil.corpId,
WeiXinParamesUtil.agentSecret, type);
// 更新数据库
String newDate = sdf.format(new Date());
accessToken.setSaveDate(newDate);
accessToken.setToken(accessToken.getToken());
accessToken.setExpiresIn(Integer.parseInt(String
.valueOf(interval)));
accessToken.setType(type);
int row1 = accService.updateByExpirIn(accessToken);
if (row1 > 0) {
System.out.println("----111---"
+ accessToken.getToken());
System.out.println("更新成功");
}
}
return accessToken.getToken();
}
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
6.Contacts_service类
注: 1.要准备一些json包
2.定义变量,不要定义常量 3.扫码登录官方文档有点坑,要带上agentid才行
7.WeixinParamUtil
注意:企业id为我的应用中的CorpID, 启用凭证创建应用的时候就有的
8我的实体类用来保存Access_Token的
public class AccessToken {
private int aid;
// 获取到的凭证
private String token;
// 凭证有效时间,单位:秒
private int expiresIn;
private String saveDate;//保存时候的时间
private String type;
public AccessToken() {
super();
}
public AccessToken(String token, int expiresIn, String saveDate, String type) {
super();
this.token = token;
this.expiresIn = expiresIn;
this.saveDate = saveDate;
this.type = type;
}
public String getToken() {
return token;
}
public void setToken(String token) {
this.token = token;
}
public int getExpiresIn() {
return expiresIn;
}
public void setExpiresIn(int expiresIn) {
this.expiresIn = expiresIn;
}
public String getSaveDate() {
return saveDate;
}
public void setSaveDate(String saveDate) {
this.saveDate = saveDate;
}
public int getAid() {
return aid;
}
public void setAid(int aid) {
this.aid = aid;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
}
9.效果如下:
