微信测试公众号平台开发(一)——测试公众号的申请及接口信息配置
第一步、开通测试公众号
https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
通过上面的链接,然后登陆微信账号之后按照指引可以得到一个测试公众号;开通成功后的页面如下,会显示微信号以及appId和appSecret;这些用于之后的接口配置信息配置
第二步、接口信息配置
这一个步骤主要是让微信验证你的项目接口有效性,关于服务器资源,可以用内网穿透natapp,
https://natapp.cn/ 这个是官网,按照指示,登录注册后获取到免费渠道后,下载他的natapp.exe文件,开启,将自己的127.0.0.1变成域名地址,要注意的是,因为微信你URL的时候是80端口的,所以你要讲你tomcat的端口设置成80的;
在微信调用URL后,会传送signature,timestamp, nonce三个参数,解析然后获取到然后与token拼接加密,与signature进行比较,下面贴出我的验证代码,
====================进行token加密=====================
/**
* 微信token校验
* @param weChatSign
* @return
*/
public static boolean checkSignNature(WeChatSign weChatSign)
{
//对token,timestamp,nonce按字典排序
String[] paramArr = new String[] {SignUtil.token, weChatSign.gettimestamp(), weChatSign.getNonce()};
Arrays.sort(paramArr);
String content = "";
for (String target : paramArr)
{
//排序后的结果拼成字符串
content += target;
}
String cipherText = null;
try
{
MessageDigest md = MessageDigest.getInstance("SHA-1");
//拼接后的字符串SHA-1加密
byte[] digest = md.digest(content.toString().getBytes());
cipherText = byteToStr(digest);
}
catch (NoSuchAlgorithmException ex)
{
ex.printStackTrace();
}
//将SHA-1加密后的字符串与signature进行对比
return cipherText != null ? cipherText.equals(weChatSign.getsignature().toUpperCase()) : 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;
}
=============验证并返回信息给微信接口提示验证成功===============
/**
* 微信请求校验
* @param weChatSign
*/
@RequestMapping(value={"/wx"}, method= {RequestMethod.GET})
public void checkToken(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException
{
//初始化
WeChatSign weChatSign = new WeChatSign();
weChatSign.setNonce(request.getParameter("nonce"));
weChatSign.setsignature(request.getParameter("signature"));
weChatSign.settimestamp(request.getParameter("timestamp"));
PrintWriter out = response.getWriter();
//随机字符串
String echostr = request.getParameter("echostr");
//若校验成功则返回echostr
if (SignUtil.checkSignNature(weChatSign))
{
System.out.println( "===========请求校验成功========");
out.print(echostr);
}
else
{
System.out.println("===========请求校验失败========");
}
out.close();
out = null;
}