java企业微信之网页授权登录

一.本篇文章要点

1.1  .首先可以按照企业微信的官方文档 来 :http://work.weixin.qq.com/api/doc#10028 ,下面就是文档上的一些说明。

关于网页授权回调域名的说明

1、在微信公众号请求用户网页授权之前,开发者需要先到公众平台官网中的开发者中心页配置授权回调域名。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加http://等协议头;

关于网页授权的俩种scope的区别说明

1、以snsapi_base为scope发起的网页授权,是用来获取进入页面的用户的openid的,并且是静默授权并自动跳转到回调页的。用户感知的就是直接进入了回调页(往往是业务页面)

2、以snsapi_userinfo为scope发起的网页授权,是用来获取用户的基本信息的。但这种授权需要用户手动同意,并且由于用户同意过,所以无须关注,就可在授权后获取该用户的基本信息

关于网页授权access_token和普通access_token的区别

1、微信网页授权是通过OAuth2.0机制实现的,在用户授权给公众号后,公众号可以获取到一个网页授权特有的接口调用凭证(网页授权access_token),通过网页授权access_token可以进行授权后接口调用,如获取用户基本信息;2、其他微信接口,需要通过基础支持中的“获取access_token”接口来获取到的普通access_token调用。

1.2 移动端网页授权流程

(1)用户点击1.2中菜单按钮,跳转至授权页面

(2)用户授权成功,页面重定向到 redirect_uri?code=CODE&state=STATE 页面

(3)接收code,根据code获取成员信息(UserId,user_ticket)

(4)拿到UserId后可选择去根据UserId获取成员详细信息, 参见Java企业微信开发_02_通讯录同步 中的 Contacts_UserService类

(5) 拿到 user_ticket后可选择去使用user_ticket获取成员详情(其中包括用户头像)

二.代码的实现

1.接下来就可以在企业微信后台创建应用:(如下图),最重要的就是配置工作台主页的那个地址

 a.要替换的值:appid(在企业微信后台--->我的应用-->CorpID就是)

                      redirect_uri :为回调地址,(即为自己项目接口) 

                      其他参数都为要替换的,各位君参考官方文档。    

   b.地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=&redirect_uri=http%3a%2f%2f%2fMTAuthorization&response_type=code&scope=snsapi_privateinfo&agentid=1000048&state=hec#wechat_redirect

2.接下来就是我的接口, WeixinController

@RequestMapping(value = "/MTAuthorization")
    public String mTAuthorization(HttpServletRequest request,HttpSession session) {
        String code= request.getParameter("code");
        String state=request.getParameter("state");

        MTAuthorizationService mts=new MTAuthorizationService();
        String accessToken=WeiXinUtil.getAccessToken(QiWeiXinParamesUtil.corpId, QiWeiXinParamesUtil.agentSecret,"app").getToken();
        //获取成员信息
        JSONObject userInfo=mts.getUserInfo(accessToken, code);

        //获取成员详情
        UserTicket userTicket=new UserTicket();
        userTicket.setUser_ticket(userInfo.getString("user_ticket"));

        JSONObject userDetail=mts.getUserDetail(accessToken, userTicket);
        System.out.println("PageController-------"+userDetail);
        //根据userid来获取user的信息
        String name=userDetail.get("name").toString();
        System.out.println("name-------"+name);
        BosUserModel user = accService.findUserByName(name);
        session.setAttribute("user", user);
        return "redirect:pcmt";
    }

3.MTAuthorizationService中:


import com.bos.data.model.BosUserModel;
import com.bos.data.model.UserTicket;
import com.bos.util.WeiXinUtil;
import com.google.gson.Gson;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * 
 * 
 * 
 *
 */
public class MTAuthorizationService {
	private static Logger log = LoggerFactory.getLogger(MenuService.class);  

	public static final String GET_USERINFO_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE";  
	
	public static final String GET_USERDETAIL_URL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserdetail?access_token=ACCESS_TOKEN";  

	/** 1.根据code获取成员信息
	 * @desc :GET请求、
	 * 成员信息包括
	 * UserId	成员UserID
	 * DeviceId	手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
	 * user_ticket	成员票据,最大为512字节。scope为snsapi_userinfo或snsapi_privateinfo,且用户在应用可见范围之内时返回此参数。
	 *              后续利用该参数可以获取用户信息或敏感信息。
	 * expires_in	user_token的有效时间(秒),随user_ticket一起返回
	 *  
	 * @param accessToken
	 * @param code void
	 */
	public JSONObject getUserInfo(String accessToken,String code) {
		//1.获取请求的url  
		String get_userInfo_url=GET_USERINFO_URL.replace("ACCESS_TOKEN", accessToken)
				.replace("CODE", code);

		//2.调用接口,发送请求,获取成员信息
		JSONObject jsonObject = WeiXinUtil.httpRequest(get_userInfo_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"));  
			}  
		}  
		
		return jsonObject;
		
	}
	/** 2.使用userTicket获取成员详情
	 * @desc :POST请求
	 *  
	 * @param accessToken
	 * @param userTicket
	 * @return JSONObject
	 */
	public JSONObject getUserDetail(String accessToken,UserTicket userTicket) {
		//1.获取请求地址  
		String get_userDetail_url=GET_USERDETAIL_URL.replace("ACCESS_TOKEN", accessToken);

		//2.准备好请求包体
		Gson gson = new Gson(); 
		String jsonUserTicket =gson.toJson(userTicket);      //使用gson.toJson(user)即可将user对象顺序转成json
		System.out.println("jsonUserTicket:"+jsonUserTicket);
		
		//2.调用接口,发送请求,获取成员信息
		JSONObject jsonObject = WeiXinUtil.httpRequest(get_userDetail_url, "POST", jsonUserTicket);  
		System.out.println("jsonObject:"+jsonObject.toString());
		String userid=jsonObject.get("userid").toString();
		System.out.println("userid-------"+userid);
		//根据userid获取整个user对象

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

4.UserTicket

/**
 * 
 */
package com.bos.data.model;

/**@desc  : 
 * 
 * 
 * 
 */
public class UserTicket {
    private String user_ticket;

	/**
	 * @return the user_ticket
	 */
	public String getUser_ticket() {
		return user_ticket;
	}

	/**
	 * @param user_ticket the user_ticket to set
	 */
	public void setUser_ticket(String user_ticket) {
		this.user_ticket = user_ticket;
	}
 
    
}

5.WeixinUtil

  /**
     * 135 * 3.获取access_token 136 * 137 * @param appid 凭证 138 * @param appsecret
     * 密钥 139 * @return 140
     */
    public static AccessTokenModel getAccessToken(String appid, String appsecret, String type) {
        AccessTokenModel accessToken = null;
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String saveDate = sdf.format(new Date());
        String requestUrl = access_token_url.replace("{corpId}", appid)
                .replace("{corpsecret}", appsecret);
        JSONObject jsonObject = httpRequest(requestUrl, "GET", null);
        // 如果请求成功
        if (null != jsonObject) {
            try {
                accessToken = new AccessTokenModel();
                accessToken.setToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
                accessToken.setType(type);
                accessToken.setSaveDate(saveDate);
            } catch (Exception e) {
                accessToken = null;
                // 获取token失败
                log.error("获取token失败 errcode:{} errmsg:{}",
                        jsonObject.getInt("errcode"),
                        jsonObject.getString("errmsg"));
            }
        }
        return accessToken;
    }

1.3.  这是企业微信电脑端的界面

 

第一次进项目直接谈这个框,后面点击项目无需手动确认登陆。

项目中用到了一些类我已列出来了,第一次做这个功能,也参考了网上的一些文章,做的不完善的地方还请多多包含。

猜你喜欢

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