微信公众平台的接口配置

一、在com.cc.wechat.util包下编写 SignUtil.java 代码对提交的url和token进行验证:

package com.cc.wechat.util;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class SignUtil {
	
	//定义一个token与接口配置中的token对应
	private static String token = "myWechatTest";
	
	public static boolean checkSignature(String signature, String timestamp, String nonce) {
		
		/**
		 * 因为数组有字典序排序功能
		 * 将token、timestamp、nonce三个参数进行字典序排序
		 */
		String[] str = new String[] {token, timestamp, nonce};
		Arrays.sort(str);
		
		//将str中的数存到StringBuffer中
		StringBuffer sb = new StringBuffer();
		for(int i = 0; i < str.length; i ++) {
			sb.append(str[i]);
		}
		
		//使用SHA-1进行验证
		MessageDigest messageDigest = null;
		String tmpStr = null;
		
		try {
			messageDigest = MessageDigest.getInstance("SHA-1");
			// 将token, timestamp, nonce拼接成一个字符串进行sha1加密
			byte[] strDigest = messageDigest.digest(sb.toString().getBytes());
			tmpStr = byteToStr(strDigest);
			
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		
		// 将加密后的字符串signature对比
		//可使用三元运算:return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
		sb = null;
		if(tmpStr != null) {
			//将signature转换为大写
			return tmpStr.equals(signature.toUpperCase());
		}else {
			return false;
		}
	}
	
	/**
	 * 将字节数组转换为十六进制字符串
	 * @param byteArray
	 * @return
	 */
	private static String byteToStr(byte[] byteArray) {
		String strDigest = "";
		for (int i = 0; i < byteArray.length; i++) {
			strDigest += byteToHexStr(byteArray[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[] tempArr = new char[2];
		tempArr[0] = Digit[(mByte >>> 4) & 0X0F];
		tempArr[1] = Digit[mByte & 0X0F];

		String s = new String(tempArr);
		return s;
	}
}

二、在com.cc.wechat.servlet包下编写 CoreServlet.java 代码执行接口配置验证:

package com.cc.wechat.servlet;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.cc.wechat.util.SignUtil;

/**
 * 与微信服务器打交道
 * @author McCF
 */
public class CoreServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	/**
	 * 对接口配置提交的数据进行校验
	 * 获取从页面传来的字符串
	 * 	signature
	 * 	timestamp
	 * 	nonce
	 *  echostr
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		//加密签名
		String signature = request.getParameter("signature");
		//时间戳
		String timestamp = request.getParameter("timestamp");
		//随机数
		String nonce = request.getParameter("nonce");
		//随机字符串
		String echostr = request.getParameter("echostr");
		
		//回显返回的数据(echostr)
		PrintWriter out = response.getWriter();
		
		//通过检验signature,返回对应的echostr,成功则原样返回echostr,否则配置失败
		if(SignUtil.checkSignature(signature, timestamp, nonce)) {
			out.print(echostr);
		}
		out.close();
		out = null;
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}
}

三、在微信公众平台测试号管理处修改接口配置:

wKioL1XZ4E-TchdgAADn612WIzU981.jpg

你可能感兴趣的:(java,开发,网站,平台,微信公众)