java企业微信之扫码登陆

一.本篇文章要点

首先可以参照文档:http://work.weixin.qq.com/api/doc#10719

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

           1. 买一个云服务器,然后再将域名与ip绑定,将所有端口放开。
           2. 如果公司给你提供的内网ip,  我用花生壳来进行映射的。
           3. 如何验证自己的域名和ip有没有绑定上?直接在本地用ip访问你的项目或者用域名          
               要代码的加我qq:  2714400163,后面的话我会上传到git去.

二.该模式的整体流程

  1. 企业发起授权登录请求,企业微信用户允许授权后,企业微信会重定向到企业网站,并且带上授权临时票据code参数;
  2. 然后企业应用通过 corpid 和 corpsecret 获取access_token ;
  3. 企业应用通过 access_token 和 code 获取用户身份,进入相应的系统。

三.代码的实现

1.登陆  
企业微信的后台管理页面--->点击企业应用-->创建应用

2.配置应用信息

            注意:1.网页授权及js_Sdk  中的可信域名要进行验证,

                         如果用的是自己配置的tomcat,那么验证的文件直接放在tomcat下的Root文件夹下

                         如果是Springboot项目,可以把验证的文件放到static文件夹下

                      2.工作应用主页为自己项目的接口名字,注意不是一个jsp页面

                      3.点击企业微信授权登陆中设置web网页的授权回调域与网页授权那个可信域名配置成一样的,然后我用云 服务                        器   我没加端口(默认80)花生壳的话我用的是81端口,对外是81,对内是80。

3.现在环境已经搭建好了,首先进入的是扫码登陆的页面  (要引用一个js文件,可以从官方文档上下载,放入自己的项目中)

    

    注意:1.appid----->后台管理页面中点击我的应用中的CorpID(即企业的id)

                2.agentid为我在企业微信后台创建的应用的AgentID

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才行

package com.bos.service;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.sf.json.JSONArray;
import net.sf.json.JSONObject;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.bos.pojo.bos.User;
import com.bos.test.UserTest;
import com.bos.util.WeiXinParamesUtil;
import com.bos.util.WeiXinUtil;
import com.google.gson.Gson;


public class Contacts_UserService {
    private static Logger log = LoggerFactory.getLogger(UserTest.class);

    private    String createUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/create?access_token=ACCESS_TOKEN";
    private    String getUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=USERID";
    private    String updateUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/update?access_token=ACCESS_TOKEN";
    private    String deleteUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/delete?access_token=ACCESS_TOKEN&userid=USERID";
    private    String batchdeleteUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/batchdelete?access_token=ACCESS_TOKEN";
    private    String getDepartmentUser_url="https://qyapi.weixin.qq.com/cgi-bin/user/simplelist?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD";
    private    String getDepartmentUserDetails_url="https://qyapi.weixin.qq.com/cgi-bin/user/list?access_token=ACCESS_TOKEN&department_id=DEPARTMENT_ID&fetch_child=FETCH_CHILD";
    private    String getUser_url2="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&agentid=AGENTID&code=CODE";

    //将静态变量传给另外一个java类
    public static String USERNAME;//名字

    //1.创建成员
    public void createUser(String accessToken,User user) {

        //1.获取json字符串:将user对象转换为json字符串
        Gson gson = new Gson();
        String jsonU1 =gson.toJson(user);      //使用gson.toJson(user)即可将user对象顺序转成json
        System.out.println("jsonU1:"+jsonU1);


        //2.获取请求的url
        createUser_url=createUser_url.replace("ACCESS_TOKEN", accessToken);

        //3.调用接口,发送请求,创建成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(createUser_url, "POST", jsonU1);
        System.out.println("jsonObject:"+jsonObject.toString());

        //4.错误消息处理
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                log.error("创建成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }

    //2.获取成员
    public void getUser(String userId,String accessToken) {
    	System.out.println(getUser_url);
        //1.获取请求的url
        getUser_url=getUser_url.replace("ACCESS_TOKEN", accessToken)
                .replace("USERID", userId);
        System.out.println(getUser_url);
        //2.调用接口,发送请求,获取成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(getUser_url, "GET", null);
        System.out.println("jsonObject:"+jsonObject.toString());
        //得到username将其保存到session中
        String name=jsonObject.get("name").toString();
        Contacts_UserService.USERNAME=name;
        //3.错误消息处理
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                log.error("获取成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }
    //2.获取成员
    public void getUser2(String code,String accessToken) {
    	String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + accessToken + "&agentid=" + WeiXinParamesUtil.agentId + "&code=" + code;
        //1.获取请求的url
        getUser_url2=getUser_url2.replace("ACCESS_TOKEN", accessToken)
                .replace("CODE", code).replace("AGENTID", WeiXinParamesUtil.agentId + "");
        //2.调用接口,发送请求,获取成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(getUser_url2, "GET", null);

        //3.错误消息处理
        if (null != jsonObject) {
            System.out.println("jsonObject:"+jsonObject.toString());
            //jsonObject:{"UserId":"d41d8cd98f00b204e9800998ecf8427e","DeviceId":"","errcode":0,"errmsg":"ok"}
            //接下来将userid 和accessToken获取用户信息
        	/*  String userId=jsonObject.get("UserId").toString();

        	  N=userId;*/

            getUser(jsonObject.get("UserId").toString(), accessToken);
            //此时这个时候应该把值给传到ResfILTER中
            if (0 != jsonObject.getInt("errcode")) {
                log.error("获取成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }
    //3.更新成员
    public void updateUser(String accessToken,User user) {

        //1.获取json字符串:将user对象转换为json字符串
        Gson gson = new Gson();
        String jsonU1 =gson.toJson(user);      //使用gson.toJson(user)即可将user对象顺序转成json
        System.out.println("jsonU1:"+jsonU1);


        //2.获取请求的url
        updateUser_url=updateUser_url.replace("ACCESS_TOKEN", accessToken);

        //3.调用接口,发送请求,创建成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(updateUser_url, "POST", jsonU1);
        System.out.println("jsonObject:"+jsonObject.toString());

        //4.错误消息处理
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                log.error("更新成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }

    //4.删除成员
    public void deleteUser(String accessToken,String userId) {

        //1.获取请求的url
        deleteUser_url=deleteUser_url.replace("ACCESS_TOKEN", accessToken)
                .replace("USERID", userId);

        //2.调用接口,发送请求,删除成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(deleteUser_url, "GET", null);
        System.out.println("jsonObject:"+jsonObject.toString());

        //3.错误消息处理
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                log.error("删除成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }

    //5.批量删除成员
    public void batchdeleteUser(String accessToken,List<String> userIdList){
        //1.获取json字符串:将user对象转换为json字符串
        Map<String, Object> content = new HashMap<String, Object>();
        content.put("useridlist", userIdList);

        Gson gson=new Gson();
        String useridlist=gson.toJson(content);
        System.out.println(useridlist);

        //2.获取请求的url
        batchdeleteUser_url=batchdeleteUser_url.replace("ACCESS_TOKEN", accessToken);

        //3.调用接口,发送请求,创建成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(batchdeleteUser_url, "POST", useridlist);
        System.out.println("jsonObject:"+jsonObject.toString());

        //4.错误消息处理
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                log.error("批量删除成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }


    //6.获取部门成员
    public void getDepartmentUser(String accessToken,String departmentId,String fetchChild) {

        //1.获取请求的url
        getDepartmentUser_url=getDepartmentUser_url.replace("ACCESS_TOKEN", accessToken)
                .replace("DEPARTMENT_ID", departmentId)
                .replace("FETCH_CHILD", fetchChild);

        //2.调用接口,发送请求,获取部门成员
        JSONObject jsonObject = WeiXinUtil.httpRequest(getDepartmentUser_url, "GET", null);
        System.out.println("jsonObject:"+jsonObject.toString());

        //3.错误消息处理
        if (null != jsonObject) {
            if (0 != jsonObject.getInt("errcode")) {
                log.error("获取部门成员失败 errcode:{} errmsg:{}", jsonObject.getInt("errcode"), jsonObject.getString("errmsg"));
            }
        }
    }


    //7.获取部门成员详情
    public List<User> getDepartmentUserDetails(List<String> depts, String accessToken, String fetchChild) {
        List<User> users = new ArrayList<User>();
        for (String deptId : depts) {
            // 1.获取请求的url
            getDepartmentUserDetails_url = getDepartmentUserDetails_url
                    .replace("ACCESS_TOKEN", accessToken)
                    .replace("DEPARTMENT_ID", deptId)
                    .replace("FETCH_CHILD", fetchChild);

            // 2.调用接口,发送请求,获取部门成员
            JSONObject jsonObject = WeiXinUtil.httpRequest(getDepartmentUserDetails_url, "GET", null);
            System.out.println("Contact_service----jsonObject:" + jsonObject.toString());

            // 3.错误消息处理
            if (null != jsonObject) {
                if (0 != jsonObject.getInt("errcode")) {
                    log.error("获取部门成员详情失败 errcode:{} errmsg:{}",
                            jsonObject.getInt("errcode"),
                            jsonObject.getString("errmsg"));
                }else{//查询成功的话
                    JSONArray array=jsonObject.getJSONArray("userlist");
                    if(null!=array){
                        for(int i=0;i<array.size();i++){
                            JSONObject de=JSONObject.fromObject(array.get(i));
                            String userid=de.get("userid").toString();
                            String department=de.get("department").toString();
                            String name=de.get("name").toString();
                            String position=de.get("position").toString();
                            String mobile=de.get("mobile").toString();
                            String gender=de.get("gender").toString();
                            String email=de.get("email").toString();
                            //先将名字等信息传过去
                            User user=new User();
                            user.setUserId(userid);
                            user.setDepartment(department);
                            user.setName(name);
                            user.setPosition(position);
                            user.setMobile(mobile);
                            user.setGender(gender);
                            user.setEmail(email);
                            //最后将user放到list中去
                            users.add(user);
                        }

                    }

                }
            }
        }
        return users;
    }
}
 

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;
 }  
        
 }  

大概的话这样子就可以完成企业微信扫码登陆到所做的项目中了。第一次做,做的不当之处还请谅解。

猜你喜欢

转载自blog.csdn.net/tangthh123/article/details/80389703