我也是醉了,中午做个饭这么难吃!连自己都看不下去了!怀着沉重的心情把微信企业号OAuth2.0授权看了看,感觉与公众号差别没什么,相信开发过公众号的朋友都知道,首先我们看看官方API文档
企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0来获取员工的身份信息。
注意,此URL的域名,必须完全匹配企业应用设置项中的'可信域名',否则获取用户信息时会返回50001错误码
这里的可信域呢,跟公众号的的授权回调很相似,简单地说就是在这个域名下,所有的页面都可授权,不需要添加http://,只需要域名,比如http://www.baidu.com,只需要填写www.baidu.com,SAE、BAE也是一样,笔者采用的是80端口外网IP域,只需要填写IP就OK了,另外好像企业号还支持443端口,我们这说到的域就是更个服务器下所有项目的页面都可以授权的,解决域问题之后,还需要大家注意的是,就是授权的
redirect_uri 参数 授权后重定向的回调链接地址,请使用urlencode对链接进行处理,否则会提示 redirect_uri 错误
回调地址和换取个人UserID GOauth2Core类
package jsp.weixin.oauth2.util;
/**
* Oauth2类
* @author Engineer.Jsp
* @date 2014.10.13
*/
import net.sf.json.JSONObject;
import jsp.weixin.ParamesAPI.util.ParamesAPI;
import jsp.weixin.ParamesAPI.util.WeixinUtil;
public class GOauth2Core {
public static String GET_CODE = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=a123#wechat_redirect";
/**
* 企业获取code地址处理
* @param appid 企业的CorpID
* @param redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
* @param response_type 返回类型,此时固定为:code
* @param scope 应用授权作用域,此时固定为:snsapi_base
* @param state 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值
* @param #wechat_redirect 微信终端使用此参数判断是否需要带上身份信息
* 员工点击后,页面将跳转至 redirect_uri/?code=CODE&state=STATE,企业可根据code参数获得员工的userid
* */
public static String GetCode(){
String get_code_url = "";
get_code_url = GET_CODE.replace("CORPID", ParamesAPI.corpId).replace("REDIRECT_URI", WeixinUtil.URLEncoder(ParamesAPI.REDIRECT_URI));
return get_code_url;
}
public static String CODE_TO_USERINFO = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE&agentid=AGENTID";
/**
* 根据code获取成员信息
* @param access_token 调用接口凭证
* @param code 通过员工授权获取到的code,每次员工授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期
* @param agentid 跳转链接时所在的企业应用ID
* 管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同
* */
public static String GetUserID (String access_token,String code ,String agentid){
String UserId = "";
CODE_TO_USERINFO = CODE_TO_USERINFO.replace("ACCESS_TOKEN", access_token).replace("CODE", code).replace("AGENTID", agentid);
JSONObject jsonobject = WeixinUtil.HttpRequest(CODE_TO_USERINFO, "GET", null);
if(null!=jsonobject){
UserId = jsonobject.getString("UserId");
if(!"".equals(UserId)){
System.out.println("获取信息成功,o(∩_∩)o ————UserID:"+UserId);
}else{
int errorrcode = jsonobject.getInt("errcode");
String errmsg = jsonobject.getString("errmsg");
System.out.println("错误码:"+errorrcode+"————"+"错误信息:"+errmsg);
}
}else{
System.out.println("获取授权失败了,●﹏●,自己找原因。。。");
}
return UserId;
}
}
package jsp.weixin.oauth2.util;
/**
* Oauth2 Servlet类
* @author Engineer.Jsp
* @date 2014.10.13
*/
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import jsp.weixin.ParamesAPI.util.ParamesAPI;
import jsp.weixin.ParamesAPI.util.WeixinUtil;
public class OAuth2Servlet extends HttpServlet{
private static final long serialVersionUID = 1L;
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
PrintWriter out = response.getWriter();
String code = request.getParameter("code");
if (!"authdeny".equals(code)) {
String access_token = WeixinUtil.getAccessToken(ParamesAPI.corpId, ParamesAPI.secret).getToken();
// agentid 跳转链接时所在的企业应用ID 管理员须拥有agent的使用权限;agentid必须和跳转链接时所在的企业应用ID相同
String UserID = GOauth2Core.GetUserID(access_token, code, "您的agentid");
request.setAttribute("UserID", UserID);
}
else{
out.print("授权获取失败,至于为什么,自己找原因。。。");
}
// 跳转到index.jsp
request.getRequestDispatcher("index.jsp").forward(request, response);
}
}
index.jsp
coreServlet
jsp.weixin.servlet.util.CoreServlet
coreServlet
/coreServlet.do
oauth2Servlet
jsp.weixin.oauth2.util.OAuth2Servlet
oauth2Servlet
/oauth2Servlet
This is WeiXinEnterprises @author Engineer-Jsp
This is WeiXinEnterprises @author Engineer-Jsp.
<%
String UserID = request.getAttribute("UserID").toString();
out.print("UserID:"+UserID);
%>
http://笔者的域名IP/WeiXinEnterprises/oauth2Servlet
用法:比如将处理好的GetGode( )方法放在view菜单setUrl( )里,因为GetGode( ) return 字符串get_url_code,此字符串已经经过URL编码了,
无须再次编码,超链接也可以
之后呢,微信会将请求提交到我们在企业好应用下配置的可信域,成功携带一个code参数到 redirect_uri 这个我们写的重定向地址,比如笔者的
是 http://笔者的域名IP/WeiXinEnterprises/oauth2Servlet ,然后判断code值,code有取到值的话就调用 GOauth2Core.GetUserID( )方法,
返回一个UserID,将它传给了index.jsp
感谢您的下载使用,谢谢!祝您学习进步!Engineer-Jsp自撰~~ ●﹏●
执行效果截图:
OAuth 2.0 授权图: