最近开始玩公众号开发了,首先得注册一个公众号
公众号后台网址:https://mp.weixin.qq.com
进入后可以看到公众号分为两大类(服务号和订阅号),服务号个人注册不太到,个人一般使用订阅号。
订阅号也分认证和未认证。未认证的情况下,个人的接口调用有限制。
所以这里我们可以申请微信公众平台接口测试帐号,里面啥权限都有了。
申请地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login
进入以后如图:
授权登录以后,是这样的。
这里要填两个值(url和token),点击“提交”按钮的时候,微信会向我们的url发起一个请求。
我在这里随便跑了个项目,写了个controller,启动。访问地址localhost:8080/wx/get(测试走的通)
接下来我们可以把访问地址填在公众号后台的url里了。这里插一句嘴,我们一般开发的时候都是localhost:8080啥啥的,微信这边访问不到。(你可以试试在上面填个localhost:8080看人微信理你不。当然你要是有云平台那另说…)
我这个穷孩子的话就选一个免费的内网穿透工具ngrok。差不多就是把你的本地网址能让外界访问到。
以上通过ngrok就能把我的localhost:8080变成前面那一串,在把他丢在微信测试平台后台的url那一栏,在随便写个token。
我是这么填的。
点击提交,这时候,微信就向你的服务器上发起一个请求,并带过来四个参数。每次微信测试平台点“提交”都来一次请求哈!!
这里我在后台接收了这四个参数,并打印出来代表流程走通了。
@GetMapping("/get")
private String get(String signature, String timestamp, String nonce, String echostr) {
System.out.println("signature="+signature);
System.out.println("timestamp="+timestamp);
System.out.println("nonce="+nonce);
System.out.println("echostr="+echostr);
return “”;
}
接下来步骤按着微信官方文档来走。
开发者通过检验signature对请求进行校验。若确认此次GET请求来自微信服务器,请原样返回echostr参数内容,则接入生效,成为开发者成功,否则接入失败。加密/校验流程如下:
1)将token、timestamp、nonce三个参数进行字典序排序
2)将三个参数字符串拼接成一个字符串进行sha1加密
3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信。
//Controller完整代码
@GetMapping("/get")
private String get(String signature, String timestamp, String nonce, String echostr) {
System.out.println("signature="+signature);
System.out.println("timestamp="+timestamp);
System.out.println("nonce="+nonce);
System.out.println("echostr="+echostr);
boolean isSuccess = weChatService.check(signature, timestamp, nonce);
if (isSuccess) {
System.out.println("成功");
}else {
System.out.println("失败");
}
//若确认此次GET请求来自微信服务器,请原样返回echostr参数内容
return echostr;
}
//具体校验
@Service
public class WeChatServiceImpl implements WeChatService {
private static final String TOKEN = "token";
// 1)将token、timestamp、nonce三个参数进行字典序排序 2)将三个参数字符串拼接成一个字符串进行sha1加密
// 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
@Override
public boolean check(String signature, String timestamp, String nonce) {
boolean isSuccess = true;
// 1)将token、timestamp、nonce三个参数进行字典序排序
String [] arr = new String [] {TOKEN, timestamp, nonce};
Arrays.sort(arr);
// 2)将三个参数字符串拼接成一个字符串进行sha1加密
String mdResult = getMdAh1Result(arr[0] + arr[1] + arr[2]);
// 3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
return signature.endsWith(mdResult);
}
//加密
private String getMdAh1Result(String str) {
char hexDigits[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'a', 'b', 'c', 'd', 'e', 'f' };
try {
MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
mdTemp.update(str.getBytes("UTF-8"));
byte[] md = mdTemp.digest();
int j = md.length;
char buf[] = new char[j * 2];
int k = 0;
for (int i = 0; i < j; i++) {
byte byte0 = md[i];
buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
buf[k++] = hexDigits[byte0 & 0xf];
}
return new String(buf);
} catch (Exception e) {
return null;
}
}
}
后台校验写完以后再回到公众号点提交。校验完成以后就是配置成功了。