接入微信公众平台开发
接入微信公众平台开发,开发者需要按照如下步骤完成:
1、填写服务器配置
2、验证服务器地址的有效性
第一步:填写服务器配置
这里我用的是测试号,测试号具有所有的权限,方便后面的接口调用。
要注意在微信开发中,是需要提供一个外网可以访问的网址,这里我使用natapp映射本地服务器。Natapp的使用这里不做介绍了。
Token的填写可以自定义。
如图,
http://lonbon.natapp4.cc等同于http://192.168.2.39:80
192.168.2.39是本地服务器的ip;80是服务器的端口,微信开发文档规定,以http//开头只支持80端口。
在IDEA中配置tomcat服务器,如下图,
项目是创建在IEDA中。
url中的/respMsg是微信服务器与本地项目进行交互的入口。
需要在项目的web.xml进行配置,如下图
第二步:验证消息的确来自微信服务器
开发者提交信息后,微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:
参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串
开发者通过检验signature对请求进行校验(下面有校验方式)。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
检验signature的Java示例代码:
新建一个Servlet,继承httpServlet,重写doGet方法,在daGet方法中对signature进行校验。(Tomcat默认执行doGet方法)
新建一个校验signature的工具类SignUtil,如下
package com.lonbon.util;
import java.security.MessageDigest;
import java.util.Arrays;
/**
* 描述: 验证消息的确来自微信服务器
* Created by hst on 2017/10/20.
*/
public class SignUtil {
private static String token = “imooc”;
public static boolean checkSignature(String signature, String timestamp, String nonce) {
boolean result = false;
// 对token、timestamp和nonce按字典序排序
String[] array = new String[]{token, timestamp, nonce};
Arrays.sort(array);
// 将三个参数字符拼接成一个字符串
String str = array[0].concat(array[1]).concat(array[2]);
String sha1Str = null;
try {
// 对拼接后的字符串进行sha1加密
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(str.getBytes());
sha1Str = byte2str(digest);
}
catch(Exception e) {
}
if(sha1Str != null && sha1Str.equals(signature)) {
result = true;
}
return result;
}
/*
* 将字节数组转换成字符串
*/
public static String byte2str(byte[] array) {
StringBuffer hexstr = new StringBuffer();
String shaHex="";
for(int i = 0; i < array.length; i++) {
shaHex = Integer.toHexString(array[i] & 0xFF);
if(shaHex.length() < 2) {
hexstr.append(0);
}
hexstr.append(shaHex);
}
return hexstr.toString();
}
}
这里需要注意一点。Token要和接口配置信息的token一致。
代码写完后,再去配置接口信息,如果配置失败,大概是服务器没开或者填写的url不对。
Goog lucky!!!