微信公众平台企业号回调模式的URL验证——Java

IT-HeQian 2014-10-24 11:44:55
最近在做微信企业号的相关应用,因为以前没有接触过微信方面的东西,因此在开启回调模式的时候感觉无从下手,找不到门路,在网上找了教程,最后也是没有结果。
逼不得已,只能硬着头皮就着官方的文档一步步的往下做,最终终于实现是回调模式的第一步:URL验证。现将代码共享出来,供各位新手借鉴,同时的后续开发,可以共同交流、学习。

1. 要开启企业号的回调模式,首先要进行URL验证,也就是说,你必须要有一个服务器,来保证在公网环境下能够访问你的这个URL,然后才能接着往下走。(如果没有服务器的话,建议使用BAE比较好)。
2. 创建一个web项目,(注意必须是Dynamic Web Project项目),然后创建一个servlet类,来处理企业号发送的请求,命名任意,代码如下:


package org.yhxz.weixin.servlet;


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 com.qq.weixin.mp.aes.AesException;
import com.qq.weixin.mp.aes.WXBizMsgCrypt;

/**
* 核心请求处理类
*
* @author heqian
*
*/
public class CoreServlet extends HttpServlet {
private static final long serialVersionUID = 4440739483644821986L;
String sToken = "5XaQ8cG6x2pULd";//这个Token是随机生成,但是必须跟企业号上的相同
String sCorpID = "wx4edd47d3a6r4r991";//这里是你企业号的CorpID
String sEncodingAESKey = "jWmYm7qjusnxu65ZRjGtBxmz3KA1tkAj3ykkR6q2B2C";//这个EncodingAESKey是随机生成,但是必须跟企业号上的相同
/**
* 确认请求来自微信服务器
* @throws IOException
*/
public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{

// 微信加密签名
String sVerifyMsgSig = request.getParameter("msg_signature");
// 时间戳
String sVerifyTimeStamp = request.getParameter("timestamp");
// 随机数
String sVerifyNonce = request.getParameter("nonce");
// 随机字符串
String sVerifyEchoStr = request.getParameter("echostr");
String sEchoStr; //需要返回的明文
PrintWriter out = response.getWriter();
WXBizMsgCrypt wxcpt;
try {
wxcpt = new WXBizMsgCrypt(sToken, sEncodingAESKey, sCorpID);
sEchoStr = wxcpt.VerifyURL(sVerifyMsgSig, sVerifyTimeStamp,sVerifyNonce, sVerifyEchoStr);
// 验证URL成功,将sEchoStr返回
out.print(sEchoStr);
} catch (AesException e1) {
e1.printStackTrace();
}
}

/**
* 处理微信服务器发来的消息
*/
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// TODO 消息的接收、处理、响应
}

}


3. 接下来就要导入官方的业务类了,然后将其导入到你的项目中。这个可以在官方文档上下载到(注意,虽然官方下载的实例代码中也有验证的代码,但是不建议使用哪个Sample.java,如果不信的可以试试看,反正我用这个是没通)
下载地址是:
http://qydev.weixin.qq.com/java.zip,
请开发者使用jdk1.6或以上的版本。针对org.apache.commons.codec.binary.Base64,需要导入jar包commons-codec-1.9(或comm ons-codec-1.8等其他版本),我们有提供,官方下载地址:
http://commons.apache.org/proper/commons-codec/download_codec.cgi

4. 如果出现异常java.security.InvalidKeyException:illegal Key Size的解决方案:

在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:

http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html

下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt。如果安装了JRE,将两个jar文件放到%JRE_HOME% \lib\security目录下覆盖原来的文件,如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件。

5. 下来就是对web.xml文件的配置,代码如下:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
<servlet>
<servlet-name>coreServlet</servlet-name>
<servlet-class>
org.yhxz.course.servlet.CoreServlet
</servlet-class>
</servlet>

<!-- url-pattern中配置的/coreServlet用于指定该Servlet的访问路径 -->
<servlet-mapping>
<servlet-name>coreServlet</servlet-name>
<url-pattern>/coreServlet</url-pattern>
</servlet-mapping>

<welcome-file-list>
<welcome-file>index.html</welcome-file>
</welcome-file-list>
</web-app>


6. 然后将你的项目发布到服务器上,在浏览器中输入URL,如果在你的Tomcat的控制台上出现NullPointException异常,就说明没有问题(出现的原因是:请求的数据为空,这个你懂得)。
7. 接下来就在企业号后台上的操作了,开启回调模式,输入你的URL,随机生成token和EncodingAESKey,点击提交就可以验证通过,注意一定要代码中的和企业号上的token和EncodingAESKey是要一致的。

8. 通过结果图示:


9. 接下来的还在继续研究,QQ 463066721

...全文
56812 34 打赏 收藏 转发到动态 举报
写回复
用AI写文章
34 条回复
切换为时间正序
请发表友善的回复…
发表回复
qq_42705423 2018-09-05
  • 打赏
  • 举报
回复
非常好的文章,很有借鉴意义!
「已注销」 2017-03-24
  • 打赏
  • 举报
回复
用的花生壳加nginx反向代理映射到本地机上的tomcat也实现了
liushicaiIT 2017-03-20
  • 打赏
  • 举报
回复
浏览器上一点问题都没有,测试的和楼主说的是一样的,但是url那里一直显示HTTP返回404
rimonlee 2017-02-14
  • 打赏
  • 举报
回复
请求URL失败,HTTP返回码500这个是什么原因呢?
  • 打赏
  • 举报
回复
这个可以正确验证,如果报错,请连续点击,有时候是服务器卡。
qq_35059774 2016-06-30
  • 打赏
  • 举报
回复
为什么我提交的时候总是提示:echostr校验失败,请您检查是否正确解密并输出明文echostr ?
qq_35059774 2016-06-30
  • 打赏
  • 举报
回复
为什么我提交的时候总是提示:echostr校验失败,请您检查是否正确解密并输出明文echostr ?
Old-Summer 2016-03-04
  • 打赏
  • 举报
回复
引用 15 楼 lyh061619 的回复:
我现在按上面做着,生成的签名跟微信传来的不匹配的,报签名验证失败!
我终于发现了,原来我把里面的token当成了access token。。。。真是智障
Old-Summer 2016-03-04
  • 打赏
  • 举报
回复
引用 15 楼 lyh061619 的回复:
我现在按上面做着,生成的签名跟微信传来的不匹配的,报签名验证失败!
我也用官方的算的,算出来的signature跟传过来的不一致,求解?
zfore 2016-03-01
  • 打赏
  • 举报
回复
我想问下,如果有jdk的同时又有jre,那应该把那两个文件放在哪里呢,还是都覆盖呢,求楼主解答
qq_33926459 2016-02-04
  • 打赏
  • 举报
回复
mark learn
baiyouyunxu 2016-01-28
  • 打赏
  • 举报
回复
非常感谢,验证成功,省了研究好多时间
cmsai 2015-11-13
  • 打赏
  • 举报
回复
感谢!成功校验,在新浪sae上部署。。
w757522260 2015-10-12
  • 打赏
  • 举报
回复
大家评论的都不错
ghl0903 2015-08-25
  • 打赏
  • 举报
回复
返回数据这个功能实现了吗
lc900501 2015-08-04
  • 打赏
  • 举报
回复
感谢楼主,验证成功了!
  • 打赏
  • 举报
回复
我今天试了一下午,但还是没能成功接入,说签名验证失败。
  • 打赏
  • 举报
回复
解决了我的问题
木槿星晴 2015-06-05
  • 打赏
  • 举报
回复
难得的好文!!!
lyh061619 2015-05-08
  • 打赏
  • 举报
回复
我现在按上面做着,生成的签名跟微信传来的不匹配的,报签名验证失败!
加载更多回复(14)

3,143

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧