微信公众号开发纪要(2)——微信公众号接入

,,,,,,,,,,当搭建好微信公众号开发环境后,先要和微信公众号建立联系。从本质上来说,微信公众号开发就是如何让自己的服务器与微信服务器进行交互的一个过程。

,,,,,,,,,,微信服务器就相当于一个转发服务器,终端(手机、垫等)发起请求至微信服务器,微信服务器然后将请求转发给我们的应用服务器。应用服务器处理完毕后,将响应数据回发给微信服务器,微信服务器再将具体响应信息回复到微信应用终端。

通信协议为:HTTP

数据传输格式为:XML

具体的流程如下图所示:

微信公众号开发纪要(2)——微信公众号接入

来一张更加直观的图吧:

微信公众号开发纪要(2)——微信公众号接入“> <br/> </p> <p>我们需要做的事情,就是对微信服务器转发的HTTP请求做出响应。具体的请求内容,我们按照特定的XML格式去解析,处理完毕后,也要按照特定的XML格式返回。</p> <p>,,,关于公众号接入这一节内容在接入指南上写的比较详细的,文档中说接入公众号需要3个步骤,分别是:</p> <p> 1,填写服务器配置<br/> 2,验证服务器地址的有效性<br/> 3,依据接口文档实现业务逻辑</p> <p>,,,,,,,,,第第1步中服务器配置包含服务器地址(URL),令牌和EncodingAESKey。</p> <p>,,,,,,,,,服务器地址即公众号后台提供业务逻辑的入口地址,目前只支持80端口,之后包括接入验证以及任何其它的操作的请求(例如消息的发,送菜单管理,素材管理等)都要从这个地址进入。接入验证和其它请求的区别就是,接入验证时是会请求,其它时候是帖子请求;</p> <p>标记可由开发者可以任意填写,用作生成签名(该令牌会和接口URL中包含的令牌进行比对,从而验证安全性),</p> <p> EncodingAESKey由开发者手动填写或随机生成,将用作消息体加解密密钥。如果你不加密,已明文消息方式,这个选项可以不配置。</p> <p>第2步,验证服务器地址的有效性,当点击”提交“按钮后,微信服务器将发送一个http的get请求到刚刚填写的服务器地址,并且携带四个参数:</p> <p> <br/> </p> <p>接到请求后,我们需要做如下三步,若确认此次得到请求来自微信服务器,原样返回echostr参数内容,则接入生效,否则接入失败。</p> <p> 1。将牌,时间戳,现时标志三个参数进行字典序排序<br/> 2。将三个参数字符串拼接成一个字符串进行sha1加密<br/> 3。开发者获得加密后的字符串可与签名对比,标识该请求来源于微信。如果与微信加密签名一致,则将echostr原样返回给微信服务器。</p> <p> <img src=

微信公众号开发纪要(2)——微信公众号接入”>,</p> <p> <img src=

验证微信加密签名可以写成一个方法,放到一个工具类中,现将该方法贴出来。

公共静态布尔checkSignature(时间戳签名字符串标记,字符串,字符串,字符串nonce) {
,,,String [] arr=新String[]{令牌,时间戳,nonce};
,,,//将牌,时间戳,现时标志三个参数进行字典序排序
,,,Arrays.sort (arr);
,,,StringBuilder内容=new StringBuilder ();
,,,for (int i=0;我& lt;arr.length;我+ +){
,,,,,,,content.append (arr[我]);
,,,}
,,,MessageDigest md=零;
,,,字符串tmpStr=零;

,,,尝试{
,,,,,,,md=MessageDigest.getInstance (“SHA-1");
,,,,,,,//将三个参数字符串拼接成一个字符串进行sha1加密
,,,,,,,byte[]消化=md.digest (content.toString () .getBytes ());
,,,,,,,tmpStr=byteToStr(消化);
,,,}捕捉(NoSuchAlgorithmException e) {
,,,,,,,e.printStackTrace ();
,,,}

,,,内容=零;
,,,//将sha1加密后的字符串可与签名对比,标识该请求来源于微信
,,,还tmpStr !=零?tmpStr.equals (signature.toUpperCase()):假;
}

/* *
*将字节数组转换为十六进制字符串
*
中byteArray
* * @param @return
*/
私有静态字符串byteToStr (byte[]中byteArray) {
,,,字符串strDigest=啊?br/>,,,for (int i=0;我& lt;byteArray.length;我+ +){
,,,,,,,strDigest +=byteToHexStr(中byteArray[我]);
,,,}
,,,返回strDigest;
}

/* *
*将字节转换为十六进制字符串
*
* @param兆字节
* @return
*/
私有静态字符串byteToHexStr兆字节(字节){

微信公众号开发纪要(2)——微信公众号接入