登录
注册
写文章
发现
工具
java微信开发之接入验证
_3t3lfz KEKfID
编辑文章
java微信开发之接入验证
asfx站长
2020.12.03 22:49:30
阅读
731
## 前言 最近在做微信开发,关于接入验证遇到了一些坑,在这里记录一下。 ## 正文 首先,得有公网服务器或者做了内网穿透的机器。(当然,最近云开发也是挺火的,这个是不需要自己有服务器,在此先不展开,有兴趣的小伙伴可以自己去研究使用。)值得注意的是微信开发的接口必须是80端口,这里开发阶段本人使用的是[frp内网穿透](//www.asfx.xyz/p/b4c23dc8be814143b26c1d3df46742b9 "frp内网穿透")。接下来就是微信接口验证了,这里详细记录下过程。 在微信公众号平台设置服务器基本信息后点击提交,提示token验证失败 问题原因: 1.可能是你的域名被微信官方屏蔽了,你可以尝试在微信里打开你的域名地址,若无法正常打开说明你的域名已经被封,那就赶紧去申诉吧。(申诉也是个坑,这里吐槽一下~,直接在微信里申诉有可能被直接驳回,而且没有明显的提示违规内容,这种时候你只能尝试通过发邮件的方式去询问哪里违规了,并作出相应处理。腾讯官方邮件地址:moment@tencent.com,发给TA,邮件标题写:【链接解封反馈】,邮件正文写上你的域名以及自己申诉的内容) 2.配置的地址能被访问的情况下需要写代码了(在验证完参数后返回微信规定的内容) ## 代码 ``` import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import javax.servlet.http.HttpServletRequest; import java.util.Arrays; @Slf4j @Controller @RequestMapping("/wx") public class ThirdWxSubController extends BaseController { /** * 验证token * @return */ @RequestMapping("/verify") @ResponseBody public String verify(HttpServletRequest request) throws Exception { log.debug("{}", request.getQueryString()); String signature = request.getParameter("signature"); if(StringUtils.isNotBlank(signature)){ String nonce = request.getParameter("nonce"); String timestamp = request.getParameter("timestamp"); String encode = getWxSign("配置在公众号平台的token", timestamp, nonce); if(signature.equals(encode)){ // 验证是wx服务器,原样返回echostr参数值 log.debug("验证通过"); return request.getParameter("echostr"); } } return "error"; } /** * 获取加签结果 * @param token * @param timestamp * @param nonce * @return */ private String getWxSign(String token, String timestamp, String nonce){ String[] arr = new String[]{token, timestamp, nonce}; //1.实现按字典顺序排序 Arrays.sort(arr); //2.将排序后的数组拼接成一个字符串 StringBuilder builder = new StringBuilder(); for(int i=0;i<arr.length;i++) { builder.append(arr[i]); } String encode = SHA1.encode(builder.toString()); return encode; } } ``` SHA1工具类 ``` import java.security.MessageDigest; public class SHA1 { private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'}; /** * Takes the raw bytes from the digest and formats them correct. * * @param bytes the raw bytes from the digest. * @return the formatted bytes. */ private static String getFormattedText(byte[] bytes) { int len = bytes.length; StringBuilder buf = new StringBuilder(len * 2); // 把密文转换成十六进制的字符串形式 for (int j = 0; j < len; j++) { buf.append(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]); buf.append(HEX_DIGITS[bytes[j] & 0x0f]); } return buf.toString(); } public static String encode(String str) { if (str == null) { return null; } try { MessageDigest messageDigest = MessageDigest.getInstance("SHA1"); messageDigest.update(str.getBytes()); return getFormattedText(messageDigest.digest()); } catch (Exception e) { throw new RuntimeException(e); } } } ```
我的主页
退出