企业微信之网页授权登录

一.本篇文章要点

1.1  .首先看一下企业微信的官方文档  :http://work.weixin.qq.com/api/doc#10028 ,官方文档讲的比较简洁,下面就是我基于这个开发的一个功能!

网页授权登录的流程原理图
 

1、首先在请求用户网页授权之前,开发者需要先到企业微信管理后台创建一个应用,其次配置授权回调域名。

请注意,这里填写的是域名,因此请勿加http://等协议头;

接下来讲下几个概念,首先是关于网页授权的俩种scope的区别说明:

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

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

其次是accessToken的区别:关于网页授权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 :为回调地址,(即为用户授权登录后跳转的接口) 

                      其他参数都为要替换的,各位小伙伴们参考官方文档。    

   工作台应用主页中的地址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的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);
        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.  这是企业微信电脑端的界面

 

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

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

 

 

 

  • 8
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
UniApp是一个跨平台的开发框架,可以同时开发iOS和Android平台的应用程序。而企业微信网页授权是指企业在使用微信办公平台时,通过网页授权的方式获取用户在企业微信中的基本信息。 在UniApp中实现企业微信网页授权,首先需要在企业微信开放平台创建一个应用,并获取到相应的corpId和agentId。然后,在UniApp的代码中,可以使用uni.request方法向企业微信网页授权接口发送请求,需要传递的参数包括corpId、agentId、redirect_uri和state等。其中,redirect_uri表示授权后重定向的回调链接,state可以用于传递额外的参数。 当用户访问需要授权的页面时,可以在页面中使用uni.request方法发起授权请求。企业微信网页授权接口会返回一个重定向链接,UniApp可以通过uni.navigateTo方法将用户重定向到该链接,用户在企业微信授权后会跳回到该链接所指向的页面,并携带授权结果等参数。 在UniApp中接收授权结果的方法比较灵活,可以在重定向的页面中通过uni.getLaunchOptionsSync方法获取到授权结果等参数。也可以通过uni.onAppShow方法监听小程序的启动和切前台事件,在事件回调中处理授权结果。 总之,通过UniApp实现企业微信网页授权需要调用企业微信网页授权接口,并在UniApp中处理授权结果等参数。这样可以方便地在UniApp中开发企业微信相关的功能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值