前言:在项目开发过程中,有时会遇到需要进行微信公众号相关的开发,但是在开发的过程中,可能微信公众号相关的appid等信息尚未拿到,在这种情况下我们便可以使用微信测试号进行开发。
测试号获取链接:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login ,通过此链接,使用微信扫码即可获得我们需要的appid 以及appsecret
环境分析:(作者环境为win10 x64)
在进行微信相关开发的时候,由于微信相关开发需要和微信服务器进行通信,而我们的开发环境是在公司内网环境中,这种情况下我们需要用一些工具进行内网穿透,把本地开发环境映射到公网环境,这样就可以和微信服务器进行通信了。
具体步骤:
Step1 : 常见的内网穿透工具有很多,此时我们可以通过搜索引擎寻找合适的穿透工具进行操作。本文以natapp为例进行介绍。
Step2: 进入natapp官网 https://natapp.cn/ 购买隧道和二级域名(操作步骤参考此工具官网,此处不再赘述)
Step3: 购买完成后,进入 会员中心–> 我的隧道 可见如下界面
Step4: 点击配置进行相关配置,设置本地地址和本地端口如下所示
Step5: 下载客户端到本地 , 进入客户端所在的目录,运行cmd或者 powershell ,执行命令:
.\natapp.exe -authtoken=12345abcde 此处的authtoken的值为 上图中authtoken的值
Step6:
黑窗口运行成功的效果如下
微信服务器现在就可以和本地项目进行通信了。可以在浏览器测试是否可以通过域名访问本地资源,如下可以正常显示本地的一些资源证明配置完全可用。
**1.知识扫盲:**通过阅读微信相关文档,我们可以发现,在和微信进行通信之前,需要先进行绑定操作,也就是告诉微信公众号, 你的服务器是你的服务器,这样微信才可以确定要和你的服务器进行通讯。
这里的url就是本地项目接口的路径,现在咱们还没有编写代码可以先空着。
2.新建项目,导入依赖
在本地新建springboot项目,pom中必要的依赖如下
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
//这个依赖不是必要的依赖,可以简化代码,可以不使用
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<optional>trueoptional>
dependency>
3.编写微信配置类
@Data //这是lombook注解,可以在编译时生成getter、setter、构造方法等代码
public class WxConstantConfig {
public static final String appID = " ";//微信测试号页面生成
public static final String appSecret = " ";//微信测试号页面生成
public static final String token = "hello";//微信测试号页面的接口配置信息中配置的 Token
public static final boolean safe = false;
public static final String assessToken="";
}
4.编写WeixinUtil类
public class WeixinUtil {
protected static Logger log = LoggerFactory.getLogger(WeixinUtil.class);
public static boolean isCheck(HttpServletRequest request, String token) {
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
return SignUtil.checkSignature(token, signature, timestamp, nonce);
}
}
5.编写SignUtil类
public class SignUtil {
private static final Logger log = LoggerFactory.getLogger(SignUtil.class);
private static final char[] digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
public static boolean checkSignature(String token, String signature, String timestamp, String nonce) {
if (isBlank(token, signature, timestamp, nonce)) {
return false;
} else {
String[] arr = new String[] { token, timestamp, nonce };
Arrays.sort(arr);
StringBuilder sb = new StringBuilder();
for (String anArr : arr) {
sb.append(anArr);
}
MessageDigest md;
String tmpStr = null;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(sb.toString().getBytes("UTF-8"));
tmpStr = byteToStr(digest);
} catch (NoSuchAlgorithmException e) {
log.error("加密方式异常", e);
} catch (UnsupportedEncodingException e) {
log.error("编码格式不支持", e);
}
return tmpStr != null && tmpStr.equalsIgnoreCase(signature);
}
}
}
6.编写service类
@Service
@Slf4j
public class WeixinBindService{
private static WxConfig wxconfig;
{
String token = WxConstantConfig.token;
boolean issafe = WxConstantConfig.safe;
String encodingaeskey = WxConstantConfig.encodingAESKey;
String secret = WxConstantConfig.appSecret;
String appid = WxConstantConfig.appID;
wxconfig = new WxConfig(appid, secret, encodingaeskey, issafe, token);
}
public WxConfig getWxConfig() {
return WeixinBindService.wxconfig;
}
}
7.编写action类
@RestController
@Scope("prototype")
@Slf4j
@RequestMapping("api/")
public class WeiXinMenuAction{
@Autowired
private WeixinBindService wxService;
@RequestMapping(value = "bind")
public @ResponseBody String bind(HttpServletRequest request) {
if (WeixinUtil.isCheck(request, wxService.getWxConfig().getToken())) {
// 绑定微信服务器成功
String echostr = request.getParameter("echostr");
//此处如果log报红,需要安装lom插件,安装方法请百度,此处不再赘述
log.warn("bind weixin server success , and echostr is {}", echostr);
return echostr;
} else {
// 绑定微信服务器失败
log.warn("bind weixin server faile !!!");
return "";
}
}
}
至此基本代码编写完成。
配置本地 action 的路径以及 token
至此,万里长征的第一步就走完了。接下来就可以进行相关开发了。