这篇文章主要是关于微信公众号测试号的申请与使用的文章。
一、内网穿透工具的下载和使用
在申请测试号之前,我们需要做一些准备工作,就是下载内网穿透(内网穿透简而言之就是将内网IP映射成对外可访问的域名)的工具,当然内网穿透工具有很多,比如 Natapp、花生壳等,我这里用的是 ngrok。
1、下载
首先,需要进入ngrok官网:ngrok.com/, 需要先注册ngrok账号,然后才能下载ngrok。当你注册之后,就可以下载到本地了,下载的ngrok是一个压缩包,我们解压就行了。

2、使用
其中我们可以看到在登录成功后的网页上看到授权码:Authtoken,如下图所示

首先根据授权码,在本地使用cmd 到ngrok.exe的目录,然后运行如下授权命令;
ngrok authtoken 授权码
再根据需要,在本地使用cmd 到ngrok.exe的目录,运行命令开发端口(如下图),需要注意的是,这里的端口8080可以根据需要替换成其他端口,8080只是我觉得方便就用的8080端口。这条命令的意思是将本地8080端口对应的服务暴露到外网中。

上一步运行完之后将出现如下图所示的结果:

对上图进行解释:Forwarding,第一个是http协议对应的外网地址,第二个是https协议对应的外网地址。这样,凡是访问http://b23f8223.ngrok.io的请求都将发送到localhost:8080。
需要注意的是:每次启动ngrok都会分配一个新的外网域名,所以需要每次更换配置或者更换访问地址,不太方便。当然,ngrok也提供了解决方法,那就是付费,可以设置固定域名。
二、微信公众帐号测试号申请
上面的步骤一定要完成,才能开始微信公众号测试号的申请。
1、为什么要申请微信公众号测试号
由于个人申请只能申请订阅号,公众号的许多其它功能无法使用。而测试号可以调用微信公众平台所有的接口,只是不能群发消息。而测试号申请无需公众帐号,只要拥有微信账号,就可以快速申请一个测试号,并立即开始接口测试开发。
2、测试号申请流程
进入测试号申请网址:mp.weixin.qq.com/debug/cgi-b… 如下图所示

微信扫码登录进来之后就如下图所示:
如果你是一次申请测试号,那么箭头所示的信息就是空的,需要你去填写。其中URL必须是能够暴露给外界访问的一个公网地址,其中,Token的信息可以随意填写。上面的配置信息首先需要我们先去验证消息的确来自微信服务器,如官方文档下图所示(需要注意的是官网上的第一步:填写服务器配置是针对正式公众号,而我们这里是测试号,只需要验证上图的URL和Token就行了,切记!!):

其实说白了,就是一个安全校验的问题,我这里用java代码实现校验:
import com.winxin.wxdemo.utils.WeChatUtil;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.Arrays;
@RestController
public class WxMessageController {
/**
* URL接入校验
* @param signature
* @param timestamp
* @param echostr
* @param nonce
* @return
*/
@GetMapping("/validate")
public String validate(String signature, String timestamp, String echostr, String nonce){
//1)将token、timestamp、nonce三个参数进行字典序排序
String[] strs=new String[]{WeChatUtil.TOKEN, timestamp, nonce};
Arrays.sort(strs);
//2)将三个参数字符串拼接成一个字符串进行sha1加密
String strContent=strs[0]+strs[1]+strs[2];
String mySignatureSha1 = WeChatUtil.shal(strContent);
//3)开发者获得加密后的字符串可与signature对比,标识该请求来源于微信
if (mySignatureSha1.equals(signature)){
System.out.println("接入成功");
return echostr;
}
System.out.println("接入失败");
return null;
}
}
工具类:
public class WeChatUtil {
public static final String TOKEN = "myJavaTokenStr";
/**
* shal加密
* @param src
* @return
*/
public static String shal(String src){
//获取一个加密对象
MessageDigest md = null;
try {
md = MessageDigest.getInstance("sha1");
char[] chars={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
StringBuilder sb = new StringBuilder();
//加密
byte[] digest = md.digest(src.getBytes());
//处理加密结果
for (byte b : digest) {
sb.append(chars[(b>>4)&15]) ;
sb.append(chars[b&15]);
}
return sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
}
需要注意的是代码里面的Token一定要去测试号里面填的需要验证的Token一致,然后就是运行项目,然后提交,如果成功,就是接入生效了(如下图所示),就可以用该测试号进行后续的接口开发了。

小结
其实我在申请过程中踩了很多坑,希望通过写这篇文章能帮助到大家少踩坑(吐槽一下微信公众号开发文档真的很容易误导人!!!)