【微信公众号开发Java版】测试号申请

596 阅读4分钟

这篇文章主要是关于微信公众号测试号的申请与使用的文章。

一、内网穿透工具的下载和使用

在申请测试号之前,我们需要做一些准备工作,就是下载内网穿透(内网穿透简而言之就是将内网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… 如下图所示

微信扫码登录进来之后就如下图所示:

image-20200515190322687

如果你是一次申请测试号,那么箭头所示的信息就是空的,需要你去填写。其中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一致,然后就是运行项目,然后提交,如果成功,就是接入生效了(如下图所示),就可以用该测试号进行后续的接口开发了。

小结

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