公众平台测试帐号开发全流程第3篇-接入
2016-03-14 22:19
525 查看
微信中的填写服务器配置完成后就进入验证服务器地址的有效性,也就是微信接入验证。公众平台测试账号中只需配置下图中的两项即可。
![](https://oscdn.geek-share.com/Uploads/Images/Content/201610/8cf452fa4462977e8b56863891fa0787)
当你点击提交信息时微信就验证你所填写的服务器地址的有效性,验证成功是会出现配置成功字样,失败则出现配置失败。如下如所示
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/7b17ad1f94f2ee3d7a13ffabce1a9daf)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/5b5abb1b0d2c9e67af6236256b59f809)
接下来我们来看看微信公众平台开发者文档
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/1187cc53a7458c0c77289a66ba2bed6f)
从上图可以看出使用GET请求来访问我们提供给微信公众平台的URL,并且携带了四个参数。这是我们可以写一个如下方法
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/60be817598e2401060cf3728d76655e5)
接着我们需要获取微信给我们发送的四个参数,对于springmvc来说有多种方式来接受这些参数,这边列出一些
第一种
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/ac84d79f0bf419e62be81cceb520aa9f)
第二种
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/ca4648ad6cb3f7e74d44e94195498dcc)
第三种
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/827779a3241d1d91f6221c8435a0fc01)
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/9df69b9d3bc22b50d34c7f73a9c1e6fe)
本人是采用第三种方式,在coreByGet方法中加入一个包含微信提供给我们四个参数的bean,这样微信GET请求时的参数全部会注入到这个bean中,而Base这个bean中包含接口配置信息的Token。
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/77f927bb5fa70a56dd902356e18f70b3)
接收参数的问题已经解决,那么我们来看看接下来需要做什么
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/f1503c8cd496e4855273d281a57cc750)
接下来看看加密/校验流程
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/2e71fd5f73b18227627af28c0979cb11)
具体流程可以参照下图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202008/10/4785268fec21e45f594f5add75715dc4)
首先是字典序排序,java中比较简单sort方法一下就好了,代码参照如下
然后拼接成一个字符串
接着sha1加密
最后与微信通过GET发送过来的signature进行比较,一样这原样返回echostr字符串,否则可以什么都不做
全部代码如下
CoreAccess
FirstValidation
Base
当你点击提交信息时微信就验证你所填写的服务器地址的有效性,验证成功是会出现配置成功字样,失败则出现配置失败。如下如所示
接下来我们来看看微信公众平台开发者文档
从上图可以看出使用GET请求来访问我们提供给微信公众平台的URL,并且携带了四个参数。这是我们可以写一个如下方法
接着我们需要获取微信给我们发送的四个参数,对于springmvc来说有多种方式来接受这些参数,这边列出一些
第一种
第二种
第三种
本人是采用第三种方式,在coreByGet方法中加入一个包含微信提供给我们四个参数的bean,这样微信GET请求时的参数全部会注入到这个bean中,而Base这个bean中包含接口配置信息的Token。
接收参数的问题已经解决,那么我们来看看接下来需要做什么
接下来看看加密/校验流程
具体流程可以参照下图
首先是字典序排序,java中比较简单sort方法一下就好了,代码参照如下
String[] strs = new String[] { validation.getToken(), validation.getNonce(), validation.getTimestamp() }; Arrays.sort(strs);
然后拼接成一个字符串
StringBuilder appendStr = new StringBuilder(); for (int i = 0; i < strs.length; i++) { appendStr.append(strs[i]); }
接着sha1加密
StringBuffer signature = new StringBuffer(); MessageDigest digest = MessageDigest.getInstance("SHA-1"); byte[] bytes = digest.digest(appendStr.toString().getBytes()); // 字节数组转换为十六进制数 for (int i = 0; i < bytes.length; i++) { String shaHex = Integer.toHexString(bytes[i] & 0xFF); if (shaHex.length() < 2) { signature.append(0); } signature.append(shaHex); }
最后与微信通过GET发送过来的signature进行比较,一样这原样返回echostr字符串,否则可以什么都不做
全部代码如下
CoreAccess
@Controller
public class CoreAccess {
private static Logger logger = LoggerFactory.getLogger(CoreAccess.class);
@ResponseBody
@RequestMapping(value = "/core", method = RequestMethod.GET)
public String coreByGet(FirstValidation validation, Model model, HttpServletRequest request) {
logger.info("微信开始验证服务器地址的有效性..........................");
// 3. 开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (checkSignatureIsTrue(validation)) {
logger.info("加密后的字符串与Signature一致,接入成功......................");
return validation.getEchostr();
} else {
logger.info("加密后的字符串与Signature不一致,接入失败......................");
logger.info("访问者IP:" + HttpUtils.getIpAddr(request));
return "";
}
}
@RequestMapping(value = "/core", method = RequestMethod.POST)
public String coreByPost(Model model) {
return "";
}
/**
* Mar 14, 2016 6:27:19 PM
*
* @param validation
* @return 加密后的字符串
* @Description: 加密/校验流程如下:
*/
private static boolean checkSignatureIsTrue(FirstValidation validation) {
boolean flag = false;
try {
// 1. 将token、timestamp、nonce三个参数进行字典序排序
String[] strs = new String[] { validation.getToken(), validation.getNonce(), validation.getTimestamp() }; Arrays.sort(strs);
// 2. 将三个参数字符串拼接成一个字符串进行sha1加密
StringBuilder appendStr = new StringBuilder(); for (int i = 0; i < strs.length; i++) { appendStr.append(strs[i]); }
StringBuffer signature = new StringBuffer(); MessageDigest digest = MessageDigest.getInstance("SHA-1"); byte[] bytes = digest.digest(appendStr.toString().getBytes()); // 字节数组转换为十六进制数 for (int i = 0; i < bytes.length; i++) { String shaHex = Integer.toHexString(bytes[i] & 0xFF); if (shaHex.length() < 2) { signature.append(0); } signature.append(shaHex); }
if (validation.getSignature().equals(signature.toString())) {
flag = true;
}
} catch (Exception e) {
logger.error("验证服务器地址的有效性时加密出现错误");
}
return flag;
}
}
FirstValidation
public class FirstValidation extends Base{ private String signature;// 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。 private String timestamp;// 时间戳 private String nonce;// 随机数 private String echostr;// 随机字符串 public String getSignature() { return signature; } public void setSignature(String signature) { this.signature = signature; } public String getTimestamp() { return timestamp; } public void setTimestamp(String timestamp) { this.timestamp = timestamp; } public String getNonce() { return nonce; } public void setNonce(String nonce) { this.nonce = nonce; } public String getEchostr() { return echostr; } public void setEchostr(String echostr) { this.echostr = echostr; } }
Base
public class Base { private String token = "HuangzhaoDong"; public String getToken() { return token; } public void setToken(String token) { this.token = token; } }