(相关资料图)
你要有一个微信公众号,一个内网穿透工具
相关网站微信公众号:https://mp.weixin.qq.com/官网文档:https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Access_Overview.html需要资料服务器配置:设置与开发-->基本配置-->服务器配置token:3-32字符,自己生成配置到服务器配置公网 IP:云服务器一般都有公网IP内网穿透工具:本地测试需要穿透,否则无法对接。花生壳、natapp 等自行百度注意事项请求URL超时,说明内网穿透有问题微信验证消息和推送消息事件接口是同一地址,验证消息是GET
请求 ,事件推送消息是POST
。验证成功接口需要给微信原样返回随机字符串(echostr)内容,否则配置失败响应类型(Content-Type) 一定要是 text/plan
切记自己对接的系统要是有权鉴,一定要放行微信消息验证接口代码示例消息验证public void pushGet(HttpServletRequest request, HttpServletResponse response) { String signature = request.getParameter("signature"); // 签名 String echostr = request.getParameter("echostr"); // 随机字符串 String timestamp = request.getParameter("timestamp"); // 时间戳 String nonce = request.getParameter("nonce"); // 随机数 log.debug("signature:{}", signature); log.debug("echostr:{}", echostr); log.debug("timestamp:{}", timestamp); log.debug("nonce:{}", nonce); System.out.println("signature:" + signature); String sha1 = getSHA1(token, timestamp, nonce); System.out.println("sha1:" + sha1); if (sha1.equals(signature)) { log.debug("成功"); this.responseText(echostr, response); }}
事件推送public void pushPost(HttpServletRequest request, HttpServletResponse response) { String signature = request.getParameter("signature"); // 签名 String timestamp = request.getParameter("timestamp"); // 时间戳 String nonce = request.getParameter("nonce"); // 随机数 String sha1 = getSHA1(token, timestamp, nonce); if (sha1.equals(signature)) { Map map = null; try { map = XmlUtil.parseXMLToMap(request.getInputStream()); } catch (IOException e) { e.printStackTrace(); } log.debug("事件消息体:{}", map); this.responseText("", response); // 回复空串,微信服务器不会对此作任何处理 }}
完整代码import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import lombok.extern.slf4j.Slf4j;import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;import java.io.IOException;import java.io.PrintWriter;import java.security.MessageDigest;import java.util.*;/** * @description: 微信配置 * @author: Mr.Fang * @create: 2023-05-26 **/@Api(tags = "微信配置")@Slf4j@RestController@RequestMapping("/wx/")public class WxController { String token="78******23"; @ApiOperation(value = "微信 token URL 验证") @GetMapping(value = "push") public void pushGet(HttpServletRequest request, HttpServletResponse response) { String signature = request.getParameter("signature"); // 签名 String echostr = request.getParameter("echostr"); // 随机字符串 String timestamp = request.getParameter("timestamp"); // 时间戳 String nonce = request.getParameter("nonce"); // 随机数 log.debug("signature:{}", signature); log.debug("echostr:{}", echostr); log.debug("timestamp:{}", timestamp); log.debug("nonce:{}", nonce); System.out.println("signature:" + signature); String sha1 = getSHA1(token, timestamp, nonce); System.out.println("sha1:" + sha1); if (sha1.equals(signature)) { log.debug("成功"); this.responseText(echostr, response); } } @ApiOperation(value = "接收微信事件") @PostMapping(value = "push") public void pushPost(HttpServletRequest request, HttpServletResponse response) { String signature = request.getParameter("signature"); // 签名 String timestamp = request.getParameter("timestamp"); // 时间戳 String nonce = request.getParameter("nonce"); // 随机数 String sha1 = getSHA1(token, timestamp, nonce); if (sha1.equals(signature)) { Map map = null; try { // input 流返回是 xml 格式 这里转 map 了 map = XmlUtil.parseXMLToMap(request.getInputStream()); } catch (IOException e) { e.printStackTrace(); } log.debug("事件消息体:{}", map); this.responseText("", response); // 回复空串,微信服务器不会对此作任何处理 } } /** * 返回响应结果 * * @param text 响应内容 * @param response */ public void responseText(String text, HttpServletResponse response) { response.setCharacterEncoding("UTF-8"); response.setContentType("text/plan;charset=UTF-8"); PrintWriter writer = null; try { writer = response.getWriter(); } catch (IOException e) { e.printStackTrace(); } writer.write(text); writer.flush(); writer.close(); } /** * 用SHA1算法生成安全签名 * * @param token 票据 * @param timestamp 时间戳 * @param nonce 随机字符串 * @return 安全签名 */ public String getSHA1(String token, String timestamp, String nonce) { try { String[] array = new String[]{token, timestamp, nonce}; StringBuffer sb = new StringBuffer(); // 字符串排序 Arrays.sort(array); for (int i = 0; i < 3; i++) { sb.append(array[i]); } String str = sb.toString(); // SHA1签名生成 MessageDigest md = MessageDigest.getInstance("SHA-1"); md.update(str.getBytes()); byte[] digest = md.digest(); StringBuffer hexstr = new StringBuffer(); String shaHex = ""; for (int i = 0; i < digest.length; i++) { shaHex = Integer.toHexString(digest[i] & 0xFF); if (shaHex.length() < 2) { hexstr.append(0); } hexstr.append(shaHex); } return hexstr.toString(); } catch (Exception e) { e.printStackTrace(); } return null; }}
响应结果消息验证signature:207e05105427e1203e769245b3860212c0ffcc56echostr:5692172970033782203timestamp:1685068850nonce:499790541signature:207e05105427e1203e769245b3860212c0ffcc56sha1:207e05105427e1203e769245b3860212c0ffcc56成功
事件推送打开公众号发送消息,接口就可以获取到推送事件消息内容了
{"Content":"嘻嘻嘻","CreateTime":"1685068967","ToUserName":"gh_2121212a95","FromUserName":"333333333nSg8OlaSuB0d-f8FKZo","MsgType":"text","MsgId":"24124387253374797"}
其他信息公众号配置
内网穿透