文档章节

微信企业号OAuth2.0授权-Java

闪电
 闪电
发布于 2015/05/18 22:27
字数 1419
阅读 172
收藏 0

我也是醉了,中午做个饭这么难吃!连自己都看不下去了!怀着沉重的心情把微信企业号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;
	}

}

redirect_uri 重定向 OAuth2Servlet类:


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

}

web.xml 配置信息

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" 
	xmlns="http://java.sun.com/xml/ns/j2ee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 
	http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
  
    <!-- url-pattern中配置的/coreServlet用于指定该Servlet的访问路径 -->  
   <servlet>  
        <servlet-name>coreServlet</servlet-name>  
        <servlet-class>  
            jsp.weixin.servlet.util.CoreServlet  
        </servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>coreServlet</servlet-name>  
        <url-pattern>/coreServlet.do</url-pattern>  
    </servlet-mapping> 
    <!-- OAuth2 -->
       <servlet>  
        <servlet-name>oauth2Servlet</servlet-name>  
        <servlet-class>  
            jsp.weixin.oauth2.util.OAuth2Servlet  
        </servlet-class>  
    </servlet>  
    <servlet-mapping>  
        <servlet-name>oauth2Servlet</servlet-name>  
        <url-pattern>/oauth2Servlet</url-pattern>  
    </servlet-mapping>
</web-app>

index.jsp:

<html>
  <head>
    <base href="<%=basePath%>">
    
    <title>This is WeiXinEnterprises @author Engineer-Jsp</title>
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
  </head>
  
  <body>
  <center>
    This is WeiXinEnterprises @author Engineer-Jsp. <br>
    <%
    String UserID = request.getAttribute("UserID").toString(); 
    out.print("UserID:"+UserID);
     %>
  </center>
  </body>
</html>

说说重定向的用法,redirect_uri 地址的配置为: http://您自己填写的企业号应用可信域/项目名子/定向的Servlet,比如笔者的如下:

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


WeiXinEnterprises 应用用于学习和交流企业号接口开发,其中如果有什么不对的请指正,或者你自己有更好的看法,可在CSDN


进行留言和讨论,大家互相学习和进步,更多关于微信开发的源码及接口,可加 QQ:471644097,进入空间日志进行查看


感谢您的下载使用,谢谢!祝您学习进步!Engineer-Jsp自撰~~ ●﹏●


执行效果截图:



OAuth 2.0 授权图:







本文转载自:http://blog.csdn.net/jspping/article/details/40044055

闪电
粉丝 74
博文 392
码字总数 6789
作品 0
海淀
技术主管
私信 提问
加载中

评论(1)

k
kittyzero
你还我的code为空,可我有set和get方法
微信公众号支付 js api java版本

说起来.微信支付真是一堆坑. 居然官网都没有java版本的完整代码. 就算是php版本的.还都有错误.且前后各种版本.各种文档一大堆....不停的误导开发人员. 花了一天半时间.总算实现了微信公众号支...

DeleteAll
2015/04/27
0
14
微信开发 Java SDK - Weixin Java Tools

微信开发 Java 开发工具包(SDK),支持包括微信支付、微信开放平台、小程序、企业号/企业微信、公众号(包括服务号和订阅号)等的后端开发。 本开发工具包基于chanjarster的同名SDK,增加了...

班纳睿
2016/12/22
0
95
laravel5实现微信第三方登录功能

背景 最近手头一个项目需要实现用户在网站的第三方登录(微信和微博),后端框架laravel5.4。 实现过程以微信网页版第三方登录,其他于此类似,在此不做重复。 准备工作 网站应用微信登录是基于...

开元中国2015
2018/12/07
0
0
weixin-java-tools 1.1.0 发布,重大更新版本

weixin-java-tools 1.1.0 发布(重大更新) issue #23 添加日志输出 issue #66 微信消息去重 issue #69 添加Session支持 issue #71 用xstream替换了jaxb issue #72 企业号成员的avatar和sta...

jarchan
2015/01/23
3.8K
3
weixin-java-tools 1.0.3 发布(新增企业号支持)

发布说明 refactor: 将原先公众号功能拆分到了weixin-java-mp中 add: issue #19 添加企业号支持(weixin-java-cp) add: 更新WxConsts,添加了更多菜单按钮类型 项目简介 weixin-java-tools是...

jarchan
2014/10/22
4.6K
10

没有更多内容

加载失败,请刷新页面

加载更多

Python猫荐书系列之七:Python入门书籍有哪些?

本文原创并首发于公众号【Python猫】,未经授权,请勿转载。 原文地址:https://mp.weixin.qq.com/s/ArN-6mLPzPT8Zoq0Na_tsg 最近,猫哥的 Python 技术学习群里进来了几位比较特殊的同学:一...

豌豆花下猫
20分钟前
0
0
一、容器(Containers)

在容器模型中,容器大致类似于VM。他们的主要不同之处在于,每个容器不需要自己完整的操作系统。事实上,所有单个主机上的容器共享整个操作系统。这就释放了大量的系统资源,如CPU、RAM和存储...

倪伟伟
29分钟前
1
0
Guava RateLimiter限流源码解析和实例应用

在开发高并发系统时有三把利器用来保护系统:缓存、降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高...

算法之名
33分钟前
5
0
国产达梦数据库与MySQL的区别

背景 由于项目上的需要,把项目实现国产化,把底层的MySQL数据库替换为国产的达梦数据库,花了一周的时间研究了国产的数据库-达梦数据库,它和MySQL有一定的区别,SQL的写法也有一些区别。 ...

TSMYK
42分钟前
0
0
老也有错?35岁程序员是一道坎,横亘在每个技术职场人的心中

随着互联网的高速发展变革,大龄恐惧症越来越多地在技术圈被人讨论。很多程序员在工作5-10年以后,都会开始思考5年、10年甚至更久以后的自己,会是怎样一种生活工作状态,以及是否会被时代抛...

我最喜欢三大框架
48分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部