java使用spring mvc开发微信公众号验证开发者步骤
这几年微信公众平台开发比较热门,但是微信公众平台的SDK和java的sample比较少,很多都是靠自己摸索,首先进行微信公众号的开发,你必须得有个公众号或者测试号,有了这些条件后,你可以在后台里面进行配置,验证服务器的操作。如果对我的文章有兴趣,欢迎订阅我的头条号,一点热,yeehot.com
1、登陆微信服务器后台,输入你的服务器地址,还有生成你的token和EncodingAESKey
这里就说明一下,其中URL是开发者用来接收微信服务器数据的接口URL。Token我们可以自己输入的,这个和我们的oauth 的token是一样的。EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。如下图
2、创建一个srpingmvc的项目
这里我就不作详细的介绍了。我之前的文章已经做了一个图文的直播了。如果需要看回之前的文章,请自行查找
IntelliJ IDEA搭建springmvc项目图文介绍
3、查看微信开发者的文档
根据微信公众账号的文档,里面要验证开发者这个步骤,首先你需要验证URL有效性,开发者在微信后台提交上面的参数后,微信会发一个get的请求到你的服务器URL,当然这个URL必须是可以外网访问到的,里面包含了四个参数。
signature,用来比对我们自己本地生成的sign和这个signature是否相等的。相等就返回参数echostr。
timestamp:时间戳
nonce:随机数
echostr:一个随机字符串
开发者通过检验signature对请求进行校验,若确认此次GET请求来自微信服务器,原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。
详情可以阅读
https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1419318183&token=&lang=zh_CN
4、创建一个controller
了解上面的规则后,我们可以开发这个微信验证的controller,我们会收到四个参数,
我们需要timestamp参数和nonce参数和从服务器后台配置的token 按照字母的升序进行拼接,然后使用SHA-1对字符散列,然后判断获得加密后的字符串可与signature对比,如果成功返回nonce
@ResponseBody
@RequestMapping(value = "/wx/developer", method = RequestMethod.GET)
public String index(HttpServletRequest request) {
Map
Map requestParams = request.getParameterMap();
for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
String name = (String) iter.next();
String[] values = (String[]) requestParams.get(name);
String valueStr = "";
for (int i = 0; i < values.length; i++) {
valueStr = (i == values.length - 1) ? valueStr + values[i]
: valueStr + values[i] + ",";
}
params.put(name, valueStr);
}
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
String token="后台的token,自行设置";
String sign=digest(params,token);
if (sign.equals(signature))
{
return echostr;
}
else {
return "";
}
}
5、将参数进行排序,
我们这里只需要对token,timestamp,nonce进行排序,所以直接取出获得的参数和服务器的token进行排序就可以了。
public static String digest(Map
StringBuilder result = new StringBuilder();
List
keys.add(token);
keys.add(params.get("timestamp"));
keys.add(params.get("nonce"));
Collections.sort(keys);
for (Iterator
String key = iterator.next();
result.append(key);
}
System.out.println("sign="+result.toString());
String reuslt="";
try
{
MessageDigest crypt = MessageDigest.getInstance("SHA-1");
crypt.reset();
crypt.update(result.toString().getBytes("UTF-8"));
reuslt = byteToHex(crypt.digest());
}
catch (NoSuchAlgorithmException e)
{
e.printStackTrace();
}
catch (UnsupportedEncodingException e)
{
e.printStackTrace();
}
System.out.println("result="+reuslt);
return reuslt;
}
5、使用SHA-1需要转换层十六进制的字符输出
private static String byteToHex(final byte[] hash) {
Formatter formatter = new Formatter();
for (byte b : hash)
{
formatter.format("%02x", b);
}
String result = formatter.toString();
formatter.close();
return result;
}
6、打包程序发布到服务器,然后在后台验证一下
当验证成功后可以看到我们的配置信息
当然我们也可以本地模拟一下数据来测试一下
http://localhost:8080/wx/developer?signature=d3c933fd3ba7b7c8b3e0b2fd906b00001fbc25de×tamp=1469529446&nonce=494132107&echostr=7427120323186098047
今天就讲到这里,欢迎继续关注我,我的头条号,一点热,www.yeehot.com
如果有问题欢迎留言咨询,欢迎转发与收藏,如果转载到其他地方,请与我联系。