前面几篇文章谈到了微信公众平台的开发准备,现在我们将正式进入Javawechatpublic平台开发的整个过程。 那么,让我们开始谈谈如何与服务端对接微信公众平台。
(一)访问流程分析
从文档中可以看到,要访问微信发布平台开发,开发者需要执行以下步骤:
输入服务器配置
验证服务器地址的有效性
基于接口文档的业务逻辑实现
按照上面的逻辑,填写服务器配置信息可能是第一步,但在实际的开发过程中,往往需要完成第一步【编写代码以验证服务器地址的有效性】。 因为,在没有第二个步骤的情况下完成第一个步骤的配置不会产生任何效果。
(二)编写验证服务器有效性的代码
根据开发文件,我们知道我们的APP应用服务器需要接受微信服务器的get请求。 其中包含4个参数(signature、timestamp、nonce、echostr ),然后通过按词典顺序排列验证token、timestamp、nonce这3个参数来验证服务器的信任
将3个参数字符串连接成1个字符串进行sha1加密
在开发人员获取加密字符串后,可以将其与signature进行比较,以识别请求来自微信
在这里写了实现其前两个步骤的工具类。 对三个参数进行排序,返回sha1加密的字符串。 代码如下所示。 package com.cuiyong zhi.we chat.util;
import Java.security.message digest;
import Java.security.nosuchalgorithmexception;
importjava.util.Arrays;
//*
*ClassName:SignUtil
*@Description:请求验证工具类
*@authordapengniao
*@date2016年3月4日下午6:25:41
*/
publicclassSignUtil{
//匹配接口配置信息中的Token
privatestaticstringtoken=' dapengniaowechat ';
//*
*签名验证
*@paramsignature
*@paramtimestamp
*@paramnonce
*@return
*/
publicstaticbooleanchecksignature (string signature,Stringtimestamp,Stringnonce ) {
String[]arr=newString[]{token,timestamp,nonce};
按词典顺序对token、timestamp、nonce三个参数进行排序
Arrays.sort(arr;
stringbuilder content=new stringbuilder (;
for(inti=0; I
content.append(arr[I];
}
MessageDigestmd=null;
StringtmpStr=null;
try{
MD=消息digest.getinstance (sha-1 );
//将3个参数字符串连接成1个字符串进行sha1加密
byte [ ] digest=MD.digest (content.tostring ().getBytes ) );
tmpstr=bytetostr(digest );
} catch (nosuchalgorithmexceptione ) )
e .打印任务跟踪(;
}
content=空;
将sha1加密后的字符串与signature进行比较,可以识别该请求来自微信
returntmpStr!=null? tmpstr.equals (signature.toupper case ) ) :false;
}
//*
*将字节数组转换为十六进制字符串
*@parambyteArray
*@return
*/
privatestaticstringbytetostr (byte [ ] bytearray ) {
StringstrDigest=' ';
for(inti=0; I
str digest=bytetohexstr (bytearray [ I ];
}
返回开始诊断;
}
p>/**
* 将字节转换为十六进制字符串
* @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;
}
}
②将我们的工具类应用到我们的服务器验证过程中,这里我新建一个controller为WechatSecurity,实现同一个get用于接收参数和返回验证参数,简单代码如下:package com.cuiyongzhi.wechat.controller;
import java.io.PrintWriter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import com.cuiyongzhi.wechat.util.SignUtil;
@Controller
@RequestMapping("/wechat")
public class WechatSecurity {
private static Logger logger = Logger.getLogger(WechatSecurity.class);
/**
*
* @Description: 用于接收get参数,返回验证参数
* @param @param request
* @param @param response
* @param @param signature
* @param @param timestamp
* @param @param nonce
* @param @param echostr
* @author dapengniao
* @date 2016年3月4日 下午6:20:00
*/
@RequestMapping(value = "security", method = RequestMethod.GET)
public void doGet(
HttpServletRequest request,
HttpServletResponse response,
@RequestParam(value = "signature", required = true) String signature,
@RequestParam(value = "timestamp", required = true) String timestamp,
@RequestParam(value = "nonce", required = true) String nonce,
@RequestParam(value = "echostr", required = true) String echostr) {
try {
if (SignUtil.checkSignature(signature, timestamp, nonce)) {
PrintWriter out = response.getWriter();
out.print(echostr);
out.close();
} else {
logger.info("这里存在非法请求!");
}
} catch (Exception e) {
logger.error(e, e);
}
}
@RequestMapping(value = "security", method = RequestMethod.POST)
// post方法用于接收微信服务端消息
public void DoPost() {
System.out.println("这是post方法!");
}
}
那么到这里我们的服务器验证的代码就基本完成了,下面我们就进入验证过程!
(三)服务器验证
这里我用来验证的是我的个人公众号【英勇的砖头】,如果大家有兴趣可以搜索看到的,通过微博认证的一个私人号,当然有想法在这里我们也是可以一起交流的,验证方法如下图:
点击【提交】成功之后如下图所示:
点击图中【启用】即可,那么到这里我们的服务器接入配置就完成了,【下一篇我们将讲述如何接收消息并进行消息处理】,感谢你的翻阅,如有疑问可以留言讨论!
除非注明,否则文章均由 英勇的砖头博客 整理发布,欢迎转载。
如果喜欢,可以点此订阅本站