1. 申请微信测试公众号
2. 本地开发需下载内网穿透工具,此处推荐申请natapp免费通道
访问natapp官网下载工具,传送门:Natapp 教程/文档 - NATAPP-内网穿透 基于ngrok的国内高速内网映射工具
然后登陆natapp购买免费的内网穿透通道,没有账号的自己注册一个
自行配置
3. 在后端定义该方法用于配置填写接口配置信息,微信公众平台会调用该接口进行验证
@GetMapping("/getWx")
public void enter(HttpServletRequest request, HttpServletResponse response) throws IOException {
/**
参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串
*/
String signature = request.getParameter("signature");
String timestamp = request.getParameter("timestamp");
String nonce = request.getParameter("nonce");
String echostr = request.getParameter("echostr");
System.out.println("signature----" + signature + "--nonce-----" + nonce + "echostr----" + echostr);
if (wxService.check(timestamp, nonce, signature)) {
System.out.println("验证成功" + echostr);
response.getWriter().print(echostr);
response.getWriter().flush();
response.getWriter().close();
} else {
System.out.println("验证失败");
}
}
public boolean check(String timestamp, String nonce, String signature) {
//将 timestamp , nonce , signature 字典排序
// 此处token应与上面图中的token对应
String[] strs = new String[]{TOKEN, timestamp, nonce};
System.out.println(strs);
Arrays.sort(strs);
//将三个拼接,加密
String string = strs[0] + strs[1] + strs[2];
String mysig = sha1(string);
System.out.println(mysig);
System.out.println(mysig);
// 对比
return mysig.equalsIgnoreCase(signature);
}
4. 在微信测试公众平台填入上面接口的地址
5. 配置域名,该域名就是开启内网穿透后的地址
6. 获取code和openid需要添加配置如下
7.通过下面两个方法获取openid
private String GET_CODE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
private String GET_OPENID_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
/**
* 该方法会将构造的连接生成一个二维码,用户使用微信扫码后会自动获得code,并进去回调方法
*/
@RequestMapping("/getCode")
public Result<?> getCode() throws IOException, WriterException {
String url = GET_CODE_URL.replace("APPID", "你的appid").replace("REDIRECT_URI", "http://"+"填写的域名" + "回调的路由").replace("SCOPE", "snsapi_base");
QRCodeWriter qrCodeWriter = new QRCodeWriter();
BitMatrix bitMatrix = qrCodeWriter.encode(url, BarcodeFormat.QR_CODE, 600, 600);
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
MatrixToImageWriter.writeToStream(bitMatrix, "PNG", outputStream);
Base64.Encoder encoder = Base64.getEncoder();
String image = encoder.encodeToString(outputStream.toByteArray());
return Result.OK(image);
}
/**
* 回调方法
*/
@RequestMapping("/REDIRECT_URI")
public String REDIRECT_URI(HttpServletRequest request, String state) {
String code = request.getParameter("code");
String replace = GET_OPENID_URL.replace("APPID","自己的appid").replace("CODE", code).replace("SECRET","自己的secret");
String result= Util.get(replace);
JSONObject resultObject = JSONObject.parseObject(result);
String openid = resultObject.getString("openid");
return openid;
}