企业微信之扫码登陆

一.本篇文章要点

源码已上线:

首先可以参照文档:

下面是我对这个扫码登录的一些见解:

1. 买一个云服务器,将域名与ip绑定,将所有端口放开 比如80端口。 2. 公司提供内网ip, 用花生壳映射一个域名。(比如花生壳映射) 3. 如何验证自己的域名和ip有没有绑定上?ip访问你的项目 域名访问你的项目 代码中涉及到的类都差不多已经贴出来了,可以参考着自己写。

二.扫码登录的整体流程

  1. 然后企业应用通过 corpid 和 corpsecret 获取access_token ;
  2. 企业应用通过 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.效果如下:

经验分享 程序员 微信小程序 职场和发展