您的位置:首页 > 移动开发 > 微信开发

公众平台测试帐号开发全流程第3篇-接入

2016-03-14 22:19 525 查看
微信中的填写服务器配置完成后就进入验证服务器地址的有效性,也就是微信接入验证。公众平台测试账号中只需配置下图中的两项即可。



当你点击提交信息时微信就验证你所填写的服务器地址的有效性,验证成功是会出现配置成功字样,失败则出现配置失败。如下如所示





接下来我们来看看微信公众平台开发者文档



从上图可以看出使用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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息