java使用spring mvc开发微信公众号验证开发者步骤

createh52周前 (02-27)技术教程13

这几年微信公众平台开发比较热门,但是微信公众平台的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 params = new HashMap();

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 params,String token) {

StringBuilder result = new StringBuilder();

List keys = new ArrayList();

keys.add(token);

keys.add(params.get("timestamp"));

keys.add(params.get("nonce"));

Collections.sort(keys);

for (Iterator iterator = keys.iterator(); iterator.hasNext(); ) {

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

如果有问题欢迎留言咨询,欢迎转发与收藏,如果转载到其他地方,请与我联系。

相关文章

「穷酸」文科生和天坑专业人,正在争夺码农Offer

封面图逃离“天坑专业”,拿下那个码农Offer一次“极大的震撼”,让经济学二本毕业的李晓晨,萌生了必须转行做码农的想法。大四实习期间,她在广西一家私企做过一段时间HR,整理工资单时她发现——3年工作经...

Spring Boot 开发微信公众号_spring boot开发微信小程序

在讲微信公众号开发之前,先来大概了解一下微信公众号。微信公众号大体上可以分为服务号和订阅号,订阅号和服务号的区别如下:服务号可以申请微信支付功能。服务号只能由企业申请,订阅号可以由企业或个人申请。订阅...

java使用spring mvc开发微信公众号获取token

上一节我们说到验证开发者的服务器的步骤,由于官方提供的只是php部分的源码,对于不懂PHP的服务器部署可能不知道怎么处理,所以我就写了java的验证服务器的源码,今天我继续进行微信公众号的开发,获取t...

推荐 8 个优质技术公众号_技术类公众号取名

今天,先推荐 8 个自己认为比较优质的技术公众号,这些号大多由深耕技术多年的牛人运营,有真实的技术人生感悟,有一线可落地的文章,也有深度的技术解析,强烈推荐大家关注。1、程序员小灰作者小灰 ,通过一群...

青岛的程序员,能去哪里混口饭吃?

原创:码农参上(微信公众号ID:CODER_SANJYOU),欢迎分享,转载请保留出处。十一前,Hydra的一个好朋友离职去了北京那边的一家公司,说真的,我们打心底替他感到高兴,年轻人就应该出去闯荡一...