Java微信开发之接入验证

最近在做微信开发,最开始尝试了很多次都不成功。昨天尝试成功了,还没有开始进一步开发,想把昨天尝试成功的过程记录一下。我是查了很久的资料也尝试过很多方法,现在我把我遇到的问题和解决方法记录一下。我是部署在自己电脑上的tomcat服务器上的,使用的是Myeclipse编写的代码。

大致思路是首先你的服务器要可以被外网访问。可以选择公网映射的方法(这个我不太懂),值得注意的是微信开发的接口必须是80端口,如果你使用的是电信网络的话端口映射80端口也是打不通的,其他的网络应该可以。我使用的是联通网络,可以被其他网络访问。接下来就是微信接口验证了。下面讲一下我尝试成功的过程。

1、我新建了一个dynamic web project,选择了web  module  version 选择了3.0,选择生成web.xml文件。构建的目录如图所示:

ValidationServlet类是接收微信服务器转发过来的请求,ValidationTools是验证工具类。

package com.***.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.***.uil.ValidationTools;
/**
* 接收来自微信服务器转发过来的请求
* 部署在我们自己的服务器上面
* @author ***
*@version 1.0
*/
public class ValidationServlet extends HttpServlet{
/**
* 验证请求
*/
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
// TODO Auto-generated method stub
String signature = req.getParameter("signature");
String timestamp = req.getParameter("timestamp");
String nonce = req.getParameter("nonce");
String echostr = req.getParameter("echostr");
System.out.println("微信加密签名"+signature);
System.out.println("时间戳"+timestamp);
System.out.println("随机数"+nonce);
System.out.println("随机字符串"+echostr);
//获得响应流
PrintWriter out = resp.getWriter();
if(ValidationTools.checkSignature(signature, timestamp, nonce))
{
//确认了此次GET请求来自微信服务器,并且原样返回echostr参数内容
out.print(echostr);
}
//关闭输出流
out.close();
out=null;
}
}

接下来是验证工具类代码:

package com***.uil;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

/**
* 验证工具类
* @author ***
* @version **
*
*/
public class ValidationTools {
private static final String TOKEN="***";//必须与微信后台的页面配置参数保持一致
/**
* 微信请求验证
* @param signature 微信签名请求
* @param timestamp 时间戳(日期的整形表示方式)
* @param nonce 随机数
* @return
*/
public static boolean checkSignature(String signature,String timestamp,String nonce)
{
//1.将token,timestamp,nonce三个字符装入数组
String[] arr=new String[]{TOKEN,timestamp,nonce};

//实现按字典顺序排序
Arrays.sort(arr);

//2.将排序后的数组拼接成一个字符串
StringBuilder builder=new StringBuilder();
for(int i=0;i<arr.length;i++)
{
builder.append(arr[i]);
}
System.out.println("拼接后的字符串:"+builder);
MessageDigest md=null;
String result=null;
try {
//3.对拼接后的字符串进行sha1加密
md=md.getInstance("SHA-1");
byte[] digest=md.digest(builder.toString().getBytes());
//将字节数组转成密文字符串
result = byteToString(digest);
System.out.println("加密后的字符串"+result);

} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}

//4.将加密后的字符串与微信服务器传过来的签名进行对比

return result !=null?(result.equals(signature.toUpperCase())):false;

}
/**
* 实现将字节数组转换成为十六进制字符串
* @param str
* @return
*/
private static String byteToString(byte[] str)
{
String strDigest="";
for(int i=0;i<str.length;i++)
{
strDigest +=byteToHexStr(str[i]);
}
return strDigest;
}
/**
* 实现将每一个字节转换成十六进制字符串
* @param mByte
* @return
*/
private static String byteToHexStr(byte mByte)
{
char[] Digit = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
char[] temp = new char[2];
temp[0] = Digit[(mByte>>>4)&0X0F];
temp[1] = Digit[mByte&0X0F];
String s=new String(temp);//构建一个字符串
return s;
}
}


这两个类写好以后就需要去web.xml里面更改信息了,我的web.xml文件代码:

<?xml version="1.0" encoding="UTF-8"?>
<web-app
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
id="WebApp_ID"
version="3.0">
<!-- 配置微信请求验证servlet -->
<servlet>
<servlet-name>ValidationServlet</servlet-name>
<servlet-class>com.***.servlet.ValidationServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ValidationServlet</servlet-name>
<url-pattern>/login.action</url-pattern>
</servlet-mapping>

</web-app>

接下来启动Tomcat,我使用的是tomcat7.0,可以现在本地测试一下:(记得将你的Tomcat端口改成80,http的端口默认80)接下来在浏览器里面输入localhost/你的项目名/web.xml文件里面的url地址。出现如下界面,证明代码没有问题。出现空指针异常是因为没有请求过来。

这时候如果你的网络可以被外界访问的话就可以接入微信验证了。在微信验证的时候输入http://Ip/projectName/login.action(localhost换成你的公网IP)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值