();
41 | res.put("appId", corpId); // 必填,企业微信的corpID
42 | res.put("timestamp", timestamp); // 必填,生成签名的时间戳
43 | res.put("nonceStr", nonceStr); // 必填,生成签名的随机串
44 | res.put("signature", signature); // 必填,签名,见 附录-JS-SDK使用权限签名算法
45 | return res;
46 | }
47 |
48 |
49 | public static String genNonce() {
50 | return bytesToHex(Long.toString(System.nanoTime()).getBytes(StandardCharsets.UTF_8));
51 | }
52 |
53 | public static String bytesToHex(final byte[] hash) {
54 | Formatter formatter = new Formatter();
55 | for (byte b : hash) {
56 | formatter.format("%02x", b);
57 | }
58 | String result = formatter.toString();
59 | formatter.close();
60 | return result;
61 | }
62 |
63 | }
64 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/controller/single/WxPortalController.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.controller.single;
2 |
3 | import com.github.binarywang.demo.wx.cp.config.single.WxCpConfiguration;
4 | import com.github.binarywang.demo.wx.cp.utils.JsonUtils;
5 | import lombok.extern.slf4j.Slf4j;
6 | import me.chanjar.weixin.cp.api.WxCpService;
7 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
8 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
9 | import me.chanjar.weixin.cp.util.crypto.WxCpCryptUtil;
10 | import org.apache.commons.lang3.StringUtils;
11 | import org.slf4j.Logger;
12 | import org.slf4j.LoggerFactory;
13 | import org.springframework.web.bind.annotation.*;
14 |
15 | /**
16 | * @author Binary Wang
17 | */
18 | //@RestController
19 | //@RequestMapping("/wx/cp/portal/{agentId}")
20 | @Slf4j
21 | public class WxPortalController {
22 | @GetMapping(produces = "text/plain;charset=utf-8")
23 | public String authGet(@PathVariable Integer agentId,
24 | @RequestParam(name = "msg_signature", required = false) String signature,
25 | @RequestParam(name = "timestamp", required = false) String timestamp,
26 | @RequestParam(name = "nonce", required = false) String nonce,
27 | @RequestParam(name = "echostr", required = false) String echostr) {
28 | log.info("\n接收到来自微信服务器的认证消息:signature = [{}], timestamp = [{}], nonce = [{}], echostr = [{}]",
29 | signature, timestamp, nonce, echostr);
30 |
31 | if (StringUtils.isAnyBlank(signature, timestamp, nonce, echostr)) {
32 | throw new IllegalArgumentException("请求参数非法,请核实!");
33 | }
34 |
35 | final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
36 | if (wxCpService == null) {
37 | throw new IllegalArgumentException(String.format("未找到对应agentId=[%d]的配置,请核实!", agentId));
38 | }
39 |
40 | if (wxCpService.checkSignature(signature, timestamp, nonce, echostr)) {
41 | return new WxCpCryptUtil(wxCpService.getWxCpConfigStorage()).decrypt(echostr);
42 | }
43 |
44 | return "非法请求";
45 | }
46 |
47 | @PostMapping(produces = "application/xml; charset=UTF-8")
48 | public String post(@PathVariable Integer agentId,
49 | @RequestBody String requestBody,
50 | @RequestParam("msg_signature") String signature,
51 | @RequestParam("timestamp") String timestamp,
52 | @RequestParam("nonce") String nonce) {
53 | log.info("\n接收微信请求:[signature=[{}], timestamp=[{}], nonce=[{}], requestBody=[\n{}\n] ",
54 | signature, timestamp, nonce, requestBody);
55 |
56 | final WxCpService wxCpService = WxCpConfiguration.getCpService(agentId);
57 | WxCpXmlMessage inMessage = WxCpXmlMessage.fromEncryptedXml(requestBody, wxCpService.getWxCpConfigStorage(),
58 | timestamp, nonce, signature);
59 | log.debug("\n消息解密后内容为:\n{} ", JsonUtils.toJson(inMessage));
60 | WxCpXmlOutMessage outMessage = this.route(agentId, inMessage);
61 | if (outMessage == null) {
62 | return "";
63 | }
64 |
65 | String out = outMessage.toEncryptedXml(wxCpService.getWxCpConfigStorage());
66 | log.debug("\n组装回复信息:{}", out);
67 | return out;
68 | }
69 |
70 | private WxCpXmlOutMessage route(Integer agentId, WxCpXmlMessage message) {
71 | try {
72 | return WxCpConfiguration.getRouters().get(agentId).route(message);
73 | } catch (Exception e) {
74 | log.error(e.getMessage(), e);
75 | }
76 |
77 | return null;
78 | }
79 |
80 |
81 | }
82 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/error/ErrorController.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.error;
2 |
3 | import org.springframework.stereotype.Controller;
4 | import org.springframework.web.bind.annotation.GetMapping;
5 | import org.springframework.web.bind.annotation.RequestMapping;
6 |
7 | /**
8 | *
9 | * 出错页面控制器
10 | * Created by Binary Wang on 2018/8/25.
11 | *
12 | *
13 | * @author Binary Wang
14 | */
15 | @Controller
16 | @RequestMapping("/error")
17 | public class ErrorController {
18 |
19 | @GetMapping(value = "/404")
20 | public String error404() {
21 | return "error";
22 | }
23 |
24 | @GetMapping(value = "/500")
25 | public String error500() {
26 | return "error";
27 | }
28 |
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/error/ErrorPageConfiguration.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.error;
2 |
3 | import org.springframework.boot.web.server.ErrorPage;
4 | import org.springframework.boot.web.server.ErrorPageRegistrar;
5 | import org.springframework.boot.web.server.ErrorPageRegistry;
6 | import org.springframework.http.HttpStatus;
7 | import org.springframework.stereotype.Component;
8 |
9 | /**
10 | *
11 | * 配置错误状态与对应访问路径
12 | * Created by Binary Wang on 2018/8/25.
13 | *
14 | *
15 | * @author Binary Wang
16 | */
17 | @Component
18 | public class ErrorPageConfiguration implements ErrorPageRegistrar {
19 | @Override
20 | public void registerErrorPages(ErrorPageRegistry errorPageRegistry) {
21 | errorPageRegistry.addErrorPages(
22 | new ErrorPage(HttpStatus.NOT_FOUND, "/error/404"),
23 | new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500")
24 | );
25 | }
26 |
27 | }
28 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/AbstractHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import org.slf4j.Logger;
4 | import org.slf4j.LoggerFactory;
5 |
6 | import me.chanjar.weixin.cp.message.WxCpMessageHandler;
7 |
8 | /**
9 | * @author Binary Wang
10 | */
11 | public abstract class AbstractHandler implements WxCpMessageHandler {
12 | }
13 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/ContactChangeHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import com.github.binarywang.demo.wx.cp.builder.TextBuilder;
4 | import com.github.binarywang.demo.wx.cp.utils.JsonUtils;
5 | import lombok.extern.slf4j.Slf4j;
6 | import me.chanjar.weixin.common.session.WxSessionManager;
7 | import me.chanjar.weixin.cp.api.WxCpService;
8 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
9 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
10 | import org.springframework.stereotype.Component;
11 |
12 | import java.util.Map;
13 |
14 | /**
15 | * 通讯录变更事件处理器.
16 | *
17 | * @author Binary Wang
18 | */
19 | @Slf4j
20 | @Component
21 | public class ContactChangeHandler extends AbstractHandler {
22 |
23 | @Override
24 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
25 | WxSessionManager sessionManager) {
26 | String content = "收到通讯录变更事件,内容:" + JsonUtils.toJson(wxMessage);
27 | log.info(content);
28 |
29 | return new TextBuilder().build(content, wxMessage, cpService);
30 | }
31 |
32 | }
33 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/EnterAgentHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import java.util.Map;
4 |
5 | import lombok.extern.slf4j.Slf4j;
6 | import me.chanjar.weixin.common.error.WxErrorException;
7 | import me.chanjar.weixin.common.session.WxSessionManager;
8 | import me.chanjar.weixin.cp.api.WxCpService;
9 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
10 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
11 |
12 | /**
13 | *
14 | *
15 | * Created by Binary Wang on 2018/8/27.
16 | *
17 | *
18 | * @author Binary Wang
19 | */
20 | @Slf4j
21 | public class EnterAgentHandler extends AbstractHandler {
22 | private static final int TEST_AGENT = 1000002;
23 |
24 | @Override
25 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService wxCpService, WxSessionManager sessionManager) throws WxErrorException {
26 | // do something
27 | return null;
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/LocationHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import com.github.binarywang.demo.wx.cp.builder.TextBuilder;
4 | import lombok.extern.slf4j.Slf4j;
5 | import me.chanjar.weixin.common.api.WxConsts;
6 | import me.chanjar.weixin.common.session.WxSessionManager;
7 | import me.chanjar.weixin.cp.api.WxCpService;
8 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
9 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
10 | import org.springframework.stereotype.Component;
11 |
12 | import java.util.Map;
13 |
14 | /**
15 | * @author Binary Wang
16 | */
17 | @Slf4j
18 | @Component
19 | public class LocationHandler extends AbstractHandler {
20 |
21 | @Override
22 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
23 | WxSessionManager sessionManager) {
24 | if (wxMessage.getMsgType().equals(WxConsts.XmlMsgType.LOCATION)) {
25 | //TODO 接收处理用户发送的地理位置消息
26 | try {
27 | String content = "感谢反馈,您的的地理位置已收到!";
28 | return new TextBuilder().build(content, wxMessage, null);
29 | } catch (Exception e) {
30 | log.error("位置消息接收处理失败", e);
31 | return null;
32 | }
33 | }
34 |
35 | //上报地理位置事件
36 | log.info("\n上报地理位置,纬度 : {}\n经度 : {}\n精度 : {}",
37 | wxMessage.getLatitude(), wxMessage.getLongitude(), String.valueOf(wxMessage.getPrecision()));
38 |
39 | //TODO 可以将用户地理位置信息保存到本地数据库,以便以后使用
40 |
41 | return null;
42 | }
43 |
44 | }
45 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/LogHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import com.github.binarywang.demo.wx.cp.utils.JsonUtils;
4 | import lombok.extern.slf4j.Slf4j;
5 | import me.chanjar.weixin.common.session.WxSessionManager;
6 | import me.chanjar.weixin.cp.api.WxCpService;
7 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
8 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
9 | import org.springframework.stereotype.Component;
10 |
11 | import java.util.Map;
12 |
13 | /**
14 | * @author Binary Wang
15 | */
16 | @Slf4j
17 | @Component
18 | public class LogHandler extends AbstractHandler {
19 | @Override
20 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
21 | WxSessionManager sessionManager) {
22 | log.info("\n接收到请求消息,内容:{}", JsonUtils.toJson(wxMessage));
23 | return null;
24 | }
25 |
26 | }
27 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/MenuHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import java.util.Map;
4 |
5 | import org.springframework.stereotype.Component;
6 |
7 | import me.chanjar.weixin.common.api.WxConsts.MenuButtonType;
8 | import me.chanjar.weixin.common.session.WxSessionManager;
9 | import me.chanjar.weixin.cp.api.WxCpService;
10 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
11 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
12 |
13 | /**
14 | * @author Binary Wang
15 | */
16 | @Component
17 | public class MenuHandler extends AbstractHandler {
18 |
19 | @Override
20 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
21 | WxSessionManager sessionManager) {
22 |
23 | String msg = String.format("type:%s, event:%s, key:%s",
24 | wxMessage.getMsgType(), wxMessage.getEvent(),
25 | wxMessage.getEventKey());
26 | if (MenuButtonType.VIEW.equals(wxMessage.getEvent())) {
27 | return null;
28 | }
29 |
30 | return WxCpXmlOutMessage.TEXT().content(msg)
31 | .fromUser(wxMessage.getToUserName()).toUser(wxMessage.getFromUserName())
32 | .build();
33 | }
34 |
35 | }
36 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/MsgHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import com.github.binarywang.demo.wx.cp.builder.TextBuilder;
4 | import com.github.binarywang.demo.wx.cp.utils.JsonUtils;
5 | import me.chanjar.weixin.common.api.WxConsts;
6 | import me.chanjar.weixin.common.session.WxSessionManager;
7 | import me.chanjar.weixin.cp.api.WxCpService;
8 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
9 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
10 | import org.springframework.stereotype.Component;
11 |
12 | import java.util.Map;
13 |
14 | /**
15 | * @author Binary Wang
16 | */
17 | @Component
18 | public class MsgHandler extends AbstractHandler {
19 |
20 | @Override
21 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
22 | WxSessionManager sessionManager) {
23 | final String msgType = wxMessage.getMsgType();
24 | if (msgType == null) {
25 | // 如果msgType没有,就自己根据具体报文内容做处理
26 | }
27 |
28 | if (!msgType.equals(WxConsts.XmlMsgType.EVENT)) {
29 | //TODO 可以选择将消息保存到本地
30 | }
31 |
32 | //TODO 组装回复消息
33 | String content = "收到信息内容:" + JsonUtils.toJson(wxMessage);
34 |
35 | return new TextBuilder().build(content, wxMessage, cpService);
36 |
37 | }
38 |
39 | }
40 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/NullHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import java.util.Map;
4 |
5 | import org.springframework.stereotype.Component;
6 |
7 | import me.chanjar.weixin.common.session.WxSessionManager;
8 | import me.chanjar.weixin.cp.api.WxCpService;
9 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
10 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
11 |
12 | /**
13 | * @author Binary Wang
14 | */
15 | @Component
16 | public class NullHandler extends AbstractHandler {
17 |
18 | @Override
19 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
20 | WxSessionManager sessionManager) {
21 | return null;
22 | }
23 |
24 | }
25 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/ScanHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | /**
4 | * @author Binary Wang
5 | */
6 | public abstract class ScanHandler extends AbstractHandler {
7 |
8 | }
9 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/SubscribeHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import com.github.binarywang.demo.wx.cp.builder.TextBuilder;
4 | import lombok.extern.slf4j.Slf4j;
5 | import me.chanjar.weixin.common.error.WxErrorException;
6 | import me.chanjar.weixin.common.session.WxSessionManager;
7 | import me.chanjar.weixin.cp.api.WxCpService;
8 | import me.chanjar.weixin.cp.bean.WxCpUser;
9 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
10 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
11 | import org.springframework.stereotype.Component;
12 |
13 | import java.util.Map;
14 |
15 | /**
16 | * @author Binary Wang
17 | */
18 | @Slf4j
19 | @Component
20 | public class SubscribeHandler extends AbstractHandler {
21 |
22 | @Override
23 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
24 | WxSessionManager sessionManager) throws WxErrorException {
25 |
26 | log.info("新关注用户 OPENID: " + wxMessage.getFromUserName());
27 |
28 | // 获取微信用户基本信息
29 | WxCpUser userWxInfo = cpService.getUserService().getById(wxMessage.getFromUserName());
30 |
31 | if (userWxInfo != null) {
32 | // TODO 可以添加关注用户到本地
33 | }
34 |
35 | WxCpXmlOutMessage responseResult = null;
36 | try {
37 | responseResult = handleSpecial(wxMessage);
38 | } catch (Exception e) {
39 | log.error(e.getMessage(), e);
40 | }
41 |
42 | if (responseResult != null) {
43 | return responseResult;
44 | }
45 |
46 | try {
47 | return new TextBuilder().build("感谢关注", wxMessage, cpService);
48 | } catch (Exception e) {
49 | log.error(e.getMessage(), e);
50 | }
51 |
52 | return null;
53 | }
54 |
55 | /**
56 | * 处理特殊请求,比如如果是扫码进来的,可以做相应处理
57 | */
58 | private WxCpXmlOutMessage handleSpecial(WxCpXmlMessage wxMessage) {
59 | //TODO
60 | return null;
61 | }
62 |
63 | }
64 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/handler/UnsubscribeHandler.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.handler;
2 |
3 | import lombok.extern.slf4j.Slf4j;
4 | import me.chanjar.weixin.common.session.WxSessionManager;
5 | import me.chanjar.weixin.cp.api.WxCpService;
6 | import me.chanjar.weixin.cp.bean.message.WxCpXmlMessage;
7 | import me.chanjar.weixin.cp.bean.message.WxCpXmlOutMessage;
8 | import org.springframework.stereotype.Component;
9 |
10 | import java.util.Map;
11 |
12 | /**
13 | * @author Binary Wang
14 | */
15 | @Slf4j
16 | @Component
17 | public class UnsubscribeHandler extends AbstractHandler {
18 |
19 | @Override
20 | public WxCpXmlOutMessage handle(WxCpXmlMessage wxMessage, Map context, WxCpService cpService,
21 | WxSessionManager sessionManager) {
22 | String openId = wxMessage.getFromUserName();
23 | log.info("取消关注用户 OPENID: " + openId);
24 | // TODO 可以更新本地数据库为取消关注状态
25 | return null;
26 | }
27 |
28 | }
29 |
--------------------------------------------------------------------------------
/src/main/java/com/github/binarywang/demo/wx/cp/utils/JsonUtils.java:
--------------------------------------------------------------------------------
1 | package com.github.binarywang.demo.wx.cp.utils;
2 |
3 | import com.fasterxml.jackson.annotation.JsonInclude.Include;
4 | import com.fasterxml.jackson.core.JsonProcessingException;
5 | import com.fasterxml.jackson.databind.ObjectMapper;
6 | import com.fasterxml.jackson.databind.SerializationFeature;
7 | import lombok.extern.slf4j.Slf4j;
8 |
9 | /**
10 | * @author Binary Wang
11 | */
12 | @Slf4j
13 | public class JsonUtils {
14 | private static final ObjectMapper JSON = new ObjectMapper();
15 |
16 | static {
17 | JSON.setSerializationInclusion(Include.NON_NULL);
18 | JSON.configure(SerializationFeature.INDENT_OUTPUT, Boolean.TRUE);
19 | }
20 |
21 | public static String toJson(Object obj) {
22 | try {
23 | return JSON.writeValueAsString(obj);
24 | } catch (JsonProcessingException e) {
25 | log.error(e.getMessage(), e);
26 | }
27 |
28 | return null;
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/src/main/resources/META-INF/MANIFEST.MF:
--------------------------------------------------------------------------------
1 | Manifest-Version: 1.0
2 | Main-Class: com.github.binarywang.demo.wx.cp.WxCpDemoApplication
3 |
4 |
--------------------------------------------------------------------------------
/src/main/resources/application.yml.template:
--------------------------------------------------------------------------------
1 | server:
2 | port: 8000
3 | logging:
4 | level:
5 | org.springframework.web: INFO
6 | com.github.binarywang.demo.wx.cp: DEBUG
7 | me.chanjar.weixin: DEBUG
8 |
9 | #多实例配置
10 | spring:
11 | redis:
12 | database: 0
13 | host: xx.xx.xx.xx
14 | password: xxxx
15 | port: 6380
16 | wechat:
17 | cp:
18 | appConfigs:
19 | - agentId: 1000001
20 | corpId: xxxx
21 | secret: 1111
22 | token: 111
23 | aesKey: 111
24 | - agentId: 1000002
25 | corpId: xxxx
26 | secret: 1111
27 | token: 111
28 | aesKey: 111
29 |
30 | #单实例配置
31 | wechat:
32 | cp:
33 | corpId: 111
34 | appConfigs:
35 | - agentId: 1000001
36 | secret: 1111
37 | token: 111
38 | aesKey: 111
39 | - agentId: 1000002
40 | secret: 1111
41 | token: 111
42 | aesKey: 111
43 |
--------------------------------------------------------------------------------
/src/main/resources/templates/error.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | 出错啦!
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
--------------------------------------------------------------------------------