{"id":531,"date":"2025-08-04T19:44:52","date_gmt":"2025-08-04T11:44:52","guid":{"rendered":"http:\/\/8.141.4.74\/?p=531"},"modified":"2025-08-04T19:44:52","modified_gmt":"2025-08-04T11:44:52","slug":"%ef%bc%88java%ef%bc%89%e8%87%aa%e5%bb%ba%e5%ba%94%e7%94%a8%e8%b0%83%e7%94%a8%e4%bc%81%e4%b8%9a%e5%be%ae%e4%bf%a1api%e6%8e%a5%e5%8f%a3%ef%bc%8c%e8%ae%be%e7%bd%ae%e4%bc%81%e4%b8%9a%e5%8f%af%e4%bf%a1ip","status":"publish","type":"post","link":"http:\/\/8.141.4.74\/?p=531","title":{"rendered":"\uff08JAVA\uff09\u81ea\u5efa\u5e94\u7528\u8c03\u7528\u4f01\u4e1a\u5fae\u4fe1API\u63a5\u53e3\uff0c\u8bbe\u7f6e\u4f01\u4e1a\u53ef\u4fe1IP"},"content":{"rendered":"<blockquote>\n<p>\u672c\u4eba\u76ee\u524d\u662f\u4e00\u540d\u8fd0\u7ef4\u3001\u4e91\u539f\u751f\u4eba\u5458\uff0c\u90a3\u4e3a\u4ec0\u4e48\u8981\u7528JAVA\u5199\u4e00\u4e2a\u63a5\u53e3\u5462\uff1f\u662f\u8fd9\u6837\u7684\uff0c\u5728\u4f7f\u7528zabbix \u76d1\u63a7\u670d\u52a1\u7684\u65f6\u5019\uff0c\u5c06\u544a\u8b66\u4fe1\u606f\u901a\u8fc7\u4f01\u4e1a\u5fae\u4fe1\u53d1\u9001\u7ed9\u81ea\u5efa\u5e94\u7528\u7528\u4e8e\u63d0\u9192\u7528\u6237\uff0c\u4f46\u662f\u5728\u53d1\u9001\u7684\u65f6\u5019\u63d0\u793a\u4e0b\u9762\u9519\u8bef\uff1a<\/p>\n<pre><code class=\"language-bash\">[root@zabbix-server.example.com ~]#python3.12 weixin_sender.py XingYuYu  sdklj message\n\u6b63\u5728\u521d\u59cb\u5316\u5e76\u5c1d\u8bd5\u83b7\u53d6 access_token...\n\n==================================================\n\u6210\u529f\u83b7\u53d6\u5230 Access Token: \n1_jkRPWEkV6ylL9m5oqUTn9Sa0HLQg1McmLFz-xfNLeLieqxn5B6Gh6TX9I110yPLAFSgFAbV4XLXy1iAeinpp-_ykvfXHSQZPGbecQYrJs0cUj6bJIN-nizsRQOT3qB_m0hk5nDaU9lrZQ_tCEywJCh4jICDKDGUSVQlkndjmycPqHWlIsKR20WEtaoacxnhnnDmecb_Q-Z-nsTwLkbRA\n==================================================\n\n\u51c6\u5907\u5411 XingYuYu \u53d1\u9001\u6d88\u606f...\n\u9519\u8bef: \u53d1\u9001\u6d88\u606f\u5931\u8d25: not allow to access from your ip, hint: [1754296456358772672706616], from ip: 223.104.209.42, more info at https:\/\/open.work.weixin.qq.com\/devtool\/query?e=60020\n[root@zabbix-server.example.com ~]<\/code><\/pre>\n<p>\u8fd9\u4e2a\u7684\u610f\u601d\u662f\u9700\u8981\u5c06\u4f60\u6240\u5728\u5730\u7684ip\u52a0\u5165\u5230\u4f01\u4e1a\u5fae\u4fe1\u81ea\u5efa\u5e94\u7528\u7684\u767d\u540d\u5355\u5f53\u4e2d\u3002\u4f46\u662f\u73b0\u5728\u4f01\u4e1a\u5fae\u4fe1\u52a0\u5165\u767d\u540d\u5355\u6709\u4e00\u4e2a\u524d\u63d0\uff1a1.\u8981\u4e48\u8bbe\u7f6e\u53ef\u4fe1\u57df\u540d 2.\u8981\u4e48\u8bbe\u7f6e\u63a5\u6536\u6d88\u606f\u670d\u52a1\u5668URL\u3002\u57df\u540d\u9700\u8981\u5907\u6848\uff0c\u5982\u679c\u662f\u81ea\u5df1\u5728\u5b66\u4e60\u6216\u8005\u6d4b\u8bd5\u7684\u8bdd\uff0c\u8fd9\u4e2a\u8017\u8d39\u7684\u65f6\u95f4\u5468\u671f\u5c31\u592a\u957f\u4e86\u3002\u6240\u4ee5\u4e0b\u9762\u5c31\u662f\u4f7f\u7528JAVA\u4ee3\u7801\u6765\u8c03\u53bb\u4f01\u4e1a\u5fae\u4fe1\u7684\u63a5\u53e3\uff0c\u8fd9\u4e2a\u524d\u63d0\u662f\u8981\u6709\u4e00\u53f0\u516c\u7f51\u670d\u52a1\u5668\uff0c\u4f8b\u5982\u963f\u91cc\u4e91\uff0c\u6b63\u597d\u672c\u4eba\u6709\u4e00\u53f0\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804163719223.png\" alt=\"image-20250804163719223\" \/><\/p>\n<p>\u4f46\u662f\u95ee\u9898\u6765\u4e86\uff0c\u6211\u662f\u8fd0\u7ef4\u4eba\u5458\uff0cJAVA\u867d\u7136\u542c\u8fc7\u4f46\u662f\u6ca1\u6709\u505a\u8fc7\uff0c\u8fd9\u4e2a\u5f88\u5934\u75bc\uff0c\u53ea\u80fd\u627eGemini\u3001ChatGPT\u6765\uff0c\u7ec8\u4e8e\u5728\u4e00\u756a\u52aa\u529b\u4e4b\u4e0b\u6210\u529f\u4e86\u3002<\/p>\n<\/blockquote>\n<p>\u8fd9\u91cc\u7684token\u548cEncodingAESKey\u968f\u673a\u83b7\u53d6\uff0c\u91cd\u8981\u7684URL\u3002<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804164624188.png\" alt=\"image-20250804164624188\" \/><\/p>\n<h2>\u9a8c\u8bc1URL\u51fd\u6570<\/h2>\n<h3>\u4f01\u4e1a\u5fae\u4fe1\u5f00\u53d1\u8005\u4e2d\u5fc3\uff0c\u63d0\u4f9b\u4e86demo<\/h3>\n<p><a href=\"https:\/\/developer.work.weixin.qq.com\/document\/path\/90307\">\u52a0\u89e3\u5bc6\u5e93\u4e0b\u8f7d\u4e0e\u8fd4\u56de\u7801 - \u6587\u6863 - \u4f01\u4e1a\u5fae\u4fe1\u5f00\u53d1\u8005\u4e2d\u5fc3<\/a><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804164915688.png\" alt=\"image-20250804164915688\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804164952394.png\" alt=\"image-20250804164952394\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804165303197.png\" alt=\"image-20250804165303197\" \/> <\/p>\n<p>\u4f1aJAVA\u5f00\u53d1\u7684\uff0c\u770b\u5230\u8fd9\u91cc\u5c31\u5e94\u8be5\u77e5\u9053\u600e\u4e48\u505a\u4e86\uff0c\u4e0b\u9762\u6211\u6309\u7167\u5c0f\u767d\u5982\u4f55\u628a\u8fd9\u4e2a\u505a\u51fa\u6765\u3002<\/p>\n<h3>\u7eaf\u5c0f\u767d\u5b8c\u6210<\/h3>\n<p>\u524d\u63d0\u662f\u4f60\u6709IDEA\uff0c\u914d\u7f6e\u597d\u4e86jdk1.8\u3001\u914d\u7f6e\u597d\u4e86Maven\u73af\u5883\u3002<\/p>\n<h4>\u521b\u5efa\u9879\u76ee\u6587\u4ef6\u5939\u7ed3\u6784<\/h4>\n<p>\u9996\u5148\uff0c\u521b\u5efa\u4e00\u4e2a\u9879\u76ee\u6587\u4ef6\u5939\uff0c\u4f8b\u5982 <code>wechat-callback<\/code>\u3002\u7136\u540e\uff0c\u5728\u91cc\u9762\u521b\u5efa\u5982\u4e0b\u7684\u76ee\u5f55\u7ed3\u6784\u3002\u8fd9\u662f\u6807\u51c6\u7684Maven\u9879\u76ee\u7ed3\u6784\u3002<\/p>\n<pre><code class=\"language-bash\">wechat-callback\/\n\u251c\u2500\u2500 src\/\n\u2502   \u251c\u2500\u2500 main\/\n\u2502   \u2502   \u251c\u2500\u2500 java\/\n\u2502   \u2502   \u2502   \u2514\u2500\u2500 com\/\n\u2502   \u2502   \u2502       \u2514\u2500\u2500 example\/\n\u2502   \u2502   \u2502           \u2514\u2500\u2500 wechat\/\n\u2502   \u2502   \u2502               \u251c\u2500\u2500 WechatApplication.java  (\u8fd9\u662f\u65b0\u7684\u4e3b\u542f\u52a8\u7c7b)\n\u2502   \u2502   \u2502               \u251c\u2500\u2500 controller\/\n\u2502   \u2502   \u2502               \u2502   \u2514\u2500\u2500 WxVerifyController.java (\u8fd9\u662f\u60a8\u63d0\u4f9b\u7684\uff0c\u5df2\u4f18\u5316)\n\u2502   \u2502   \u2502               \u2514\u2500\u2500 util\/\n\u2502   \u2502   \u2502                   \u251c\u2500\u2500 AesException.java\n\u2502   \u2502   \u2502                   \u251c\u2500\u2500 ByteGroup.java\n\u2502   \u2502   \u2502                   \u251c\u2500\u2500 PKCS7Encoder.java\n\u2502   \u2502   \u2502                   \u251c\u2500\u2500 SHA1.java\n\u2502   \u2502   \u2502                   \u251c\u2500\u2500 WXBizMsgCrypt.java\n\u2502   \u2502   \u2502                   \u2514\u2500\u2500 XMLParse.java\n\u2502   \u2502   \u2514\u2500\u2500 resources\/\n\u2502   \u2502       \u2514\u2500\u2500 application.properties (\u65b0\u7684\u914d\u7f6e\u6587\u4ef6)\n\u2514\u2500\u2500 pom.xml (\u65b0\u7684Maven\u914d\u7f6e\u6587\u4ef6)<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804165859138.png\" alt=\"image-20250804165859138\" \/><\/p>\n<h4>\u5c06\u4ee3\u7801\u653e\u5165\u6b63\u786e\u7684\u4f4d\u7f6e<\/h4>\n<p>\u4e0b\u9762\u63d0\u4f9b\u6240\u6709\u4f18\u5316\u540e\u7684\u4ee3\u7801\u3002\u8bf7\u5c06\u4e0b\u9762\u7684\u4ee3\u7801\u5757\u5185\u5bb9\uff0c\u5206\u522b\u590d\u5236\u5e76\u4fdd\u5b58\u5230\u4e0a\u9762\u7ed3\u6784\u4e2d\u5bf9\u5e94\u7684\u6587\u4ef6\u91cc\u3002<\/p>\n<ul>\n<li><strong><code>pom.xml<\/code><\/strong>: \u76f4\u63a5\u653e\u5728\u9879\u76ee\u6839\u76ee\u5f55 <code>wechat-callback\/<\/code> \u4e0b\u3002<\/li>\n<li><strong><code>application.properties<\/code><\/strong>: \u653e\u5728 <code>src\/main\/resources\/<\/code> \u76ee\u5f55\u4e0b\u3002<\/li>\n<li><strong><code>WechatApplication.java<\/code><\/strong>: \u653e\u5728 <code>src\/main\/java\/com\/example\/wechat\/<\/code> \u76ee\u5f55\u4e0b\u3002<\/li>\n<li><strong><code>WxVerifyController.java<\/code><\/strong>: \u653e\u5728 <code>src\/main\/java\/com\/example\/wechat\/controller\/<\/code> \u76ee\u5f55\u4e0b\u3002<\/li>\n<li><strong>\u5176\u4f59\u6240\u6709 <code>util<\/code> \u5305\u7684\u6587\u4ef6<\/strong>: \u5168\u90e8\u653e\u5728 <code>src\/main\/java\/com\/example\/wechat\/util\/<\/code> \u76ee\u5f55\u4e0b\u3002<\/li>\n<\/ul>\n<h5>WechatApplication<\/h5>\n<pre><code class=\"language-java\">package com.example.wechat;\n\nimport org.springframework.boot.SpringApplication;\nimport org.springframework.boot.autoconfigure.SpringBootApplication;\n\n\/**\n * Spring Boot \u4e3b\u542f\u52a8\u7c7b\n * \u8fd9\u4e2a\u6ce8\u89e3\u5305\u542b\u4e86@Configuration, @EnableAutoConfiguration, @ComponentScan\n *\/\n@SpringBootApplication\npublic class WechatApplication {\n\n    public static void main(String[] args) {\n        SpringApplication.run(WechatApplication.class, args);\n        System.out.println(&quot;\u4f01\u4e1a\u5fae\u4fe1\u56de\u8c03\u670d\u52a1\u542f\u52a8\u6210\u529f\uff01&quot;);\n    }\n\n}\n<\/code><\/pre>\n<h5>WxVerifyController<\/h5>\n<pre><code class=\"language-java\">package com.example.wechat.controller;\n\nimport com.example.wechat.util.WXBizMsgCrypt;\nimport org.springframework.beans.factory.annotation.Value;\nimport org.springframework.web.bind.annotation.GetMapping;\nimport org.springframework.web.bind.annotation.PostMapping;\nimport org.springframework.web.bind.annotation.RequestBody;\nimport org.springframework.web.bind.annotation.RequestMapping;\nimport org.springframework.web.bind.annotation.RequestParam;\nimport org.springframework.web.bind.annotation.RestController;\n\nimport javax.servlet.http.HttpServletResponse;\nimport java.io.IOException;\n\n\/**\n * \u4f01\u4e1a\u5fae\u4fe1\u9a8c\u8bc1\u4e0e\u6d88\u606f\u56de\u8c03\u63a7\u5236\u5c42\n *\/\n@RestController\n@RequestMapping(&quot;\/wx\/verify&quot;) \/\/ \u5b9a\u4e49\u57fa\u7840\u8def\u5f84\npublic class WxVerifyController {\n\n    \/\/ \u4ece application.properties \u6587\u4ef6\u4e2d\u6ce8\u5165\u914d\u7f6e\n    @Value(&quot;${wechat.token}&quot;)\n    private String token;\n\n    @Value(&quot;${wechat.encodingAesKey}&quot;)\n    private String encodingAesKey;\n\n    @Value(&quot;${wechat.corpId}&quot;)\n    private String corpId;\n\n    \/**\n     * \u5904\u7406\u4f01\u4e1a\u5fae\u4fe1\u7684URL\u9a8c\u8bc1\u8bf7\u6c42 (GET\u65b9\u6cd5)\n     * @param msg_signature \u4f01\u4e1a\u5fae\u4fe1\u52a0\u5bc6\u7b7e\u540d\n     * @param timestamp \u65f6\u95f4\u6233\n     * @param nonce \u968f\u673a\u6570\n     * @param echostr \u52a0\u5bc6\u7684\u968f\u673a\u5b57\u7b26\u4e32\n     * @return \u89e3\u5bc6\u540e\u7684echostr\n     *\/\n    @GetMapping(&quot;\/url&quot;) \/\/ \u8def\u5f84\u4e3a \/wx\/verify\/url\n    public String verifyUrl(@RequestParam(&quot;msg_signature&quot;) String msg_signature,\n                            @RequestParam(&quot;timestamp&quot;) String timestamp,\n                            @RequestParam(&quot;nonce&quot;) String nonce,\n                            @RequestParam(&quot;echostr&quot;) String echostr) {\n        try {\n            System.out.println(&quot;\u6536\u5230URL\u9a8c\u8bc1\u8bf7\u6c42...&quot;);\n            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, corpId);\n            \/\/ \u9a8c\u8bc1 URL\n            String sReplyEchoStr = wxcpt.VerifyURL(msg_signature, timestamp, nonce, echostr);\n            System.out.println(&quot;URL\u9a8c\u8bc1\u6210\u529f, \u8fd4\u56de: &quot; + sReplyEchoStr);\n            return sReplyEchoStr;\n        } catch (Exception e) {\n            e.printStackTrace();\n            System.out.println(&quot;URL\u9a8c\u8bc1\u5931\u8d25!&quot;);\n            return &quot;error&quot;;\n        }\n    }\n\n    \/**\n     * \u5904\u7406\u4f01\u4e1a\u5fae\u4fe1\u63a8\u9001\u8fc7\u6765\u7684\u6d88\u606f (POST\u65b9\u6cd5)\n     * @param msg_signature \u7b7e\u540d\n     * @param timestamp \u65f6\u95f4\u6233\n     * @param nonce \u968f\u673a\u6570\n     * @param postData \u52a0\u5bc6\u7684\u8bf7\u6c42\u4f53\n     * @return \u56fa\u5b9a\u8fd4\u56de &quot;success&quot;\n     *\/\n    @PostMapping(&quot;\/url&quot;) \/\/ \u540c\u6837\u4f7f\u7528 \/wx\/verify\/url \u8def\u5f84\n    public String receiveMessage(@RequestParam(&quot;msg_signature&quot;) String msg_signature,\n                                 @RequestParam(&quot;timestamp&quot;) String timestamp,\n                                 @RequestParam(&quot;nonce&quot;) String nonce,\n                                 @RequestBody String postData) {\n        try {\n            System.out.println(&quot;\u6536\u5230\u6d88\u606f\u63a8\u9001...&quot;);\n            WXBizMsgCrypt wxcpt = new WXBizMsgCrypt(token, encodingAesKey, corpId);\n            String decryptedMsg = wxcpt.DecryptMsg(msg_signature, timestamp, nonce, postData);\n            System.out.println(&quot;\u89e3\u5bc6\u540e\u7684\u6d88\u606f: &quot; + decryptedMsg);\n\n            \/\/ \u5728\u8fd9\u91cc\u6dfb\u52a0\u60a8\u5904\u7406\u6d88\u606f\u7684\u4e1a\u52a1\u903b\u8f91\n            \/\/ ...\n\n        } catch (Exception e) {\n            e.printStackTrace();\n            System.out.println(&quot;\u6d88\u606f\u5904\u7406\u5931\u8d25!&quot;);\n        }\n        \/\/ \u4f01\u4e1a\u5fae\u4fe1\u8981\u6c42\u6210\u529f\u5904\u7406\u540e\u8fd4\u56de &quot;success&quot; \u6216\u7a7a\u5b57\u7b26\u4e32\n        return &quot;success&quot;;\n    }\n}<\/code><\/pre>\n<h5>AesException<\/h5>\n<pre><code class=\"language-java\">package com.example.wechat.util;\n\n@SuppressWarnings(&quot;serial&quot;)\npublic class AesException extends Exception {\n    \/\/ ... (\u6b64\u5904\u7701\u7565\u548c\u60a8\u63d0\u4f9b\u7684\u4e00\u6837\u7684\u4ee3\u7801)\n    public final static int OK = 0;\n    public final static int ValidateSignatureError = -40001;\n    public final static int ParseXmlError = -40002;\n    public final static int ComputeSignatureError = -40003;\n    public final static int IllegalAesKey = -40004;\n    public final static int ValidateCorpidError = -40005;\n    public final static int EncryptAESError = -40006;\n    public final static int DecryptAESError = -40007;\n    public final static int IllegalBuffer = -40008;\n    private int code;\n    private static String getMessage(int code) {\n        switch (code) {\n            case ValidateSignatureError: return &quot;\u7b7e\u540d\u9a8c\u8bc1\u9519\u8bef&quot;;\n            case ParseXmlError: return &quot;xml\u89e3\u6790\u5931\u8d25&quot;;\n            case ComputeSignatureError: return &quot;sha\u52a0\u5bc6\u751f\u6210\u7b7e\u540d\u5931\u8d25&quot;;\n            case IllegalAesKey: return &quot;SymmetricKey\u975e\u6cd5&quot;;\n            case ValidateCorpidError: return &quot;corpid\u6821\u9a8c\u5931\u8d25&quot;;\n            case EncryptAESError: return &quot;aes\u52a0\u5bc6\u5931\u8d25&quot;;\n            case DecryptAESError: return &quot;aes\u89e3\u5bc6\u5931\u8d25&quot;;\n            case IllegalBuffer: return &quot;\u89e3\u5bc6\u540e\u5f97\u5230\u7684buffer\u975e\u6cd5&quot;;\n            default: return null;\n        }\n    }\n    public int getCode() {\n        return code;\n    }\n    AesException(int code) {\n        super(getMessage(code));\n        this.code = code;\n    }\n}<\/code><\/pre>\n<h5>ByteGroup<\/h5>\n<pre><code class=\"language-java\">\/\/ \u6587\u4ef6: src\/main\/java\/com\/example\/wechat\/util\/ByteGroup.java\npackage com.example.wechat.util;\n\nimport java.util.ArrayList;\n\nclass ByteGroup {\n    public static PKCS7Encoder PKCS7Encoder;\n    \/\/ ... (\u6b64\u5904\u7701\u7565\u548c\u60a8\u63d0\u4f9b\u7684\u4e00\u6837\u7684\u4ee3\u7801)\n    ArrayList&lt;Byte&gt; byteContainer = new ArrayList&lt;Byte&gt;();\n    public byte[] toBytes() {\n        byte[] bytes = new byte[byteContainer.size()];\n        for (int i = 0; i &lt; byteContainer.size(); i++) {\n            bytes[i] = byteContainer.get(i);\n        }\n        return bytes;\n    }\n    public ByteGroup addBytes(byte[] bytes) {\n        for (byte b : bytes) {\n            byteContainer.add(b);\n        }\n        return this;\n    }\n    public int size() {\n        return byteContainer.size();\n    }\n}<\/code><\/pre>\n<h5>PKCS7Encoder<\/h5>\n<pre><code class=\"language-java\">\/\/ \u6587\u4ef6: src\/main\/java\/com\/example\/wechat\/util\/PKCS7Encoder.java\npackage com.example.wechat.util;\n\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\n\nclass PKCS7Encoder {\n    \/\/ ... (\u6b64\u5904\u7701\u7565\u548c\u60a8\u63d0\u4f9b\u7684\u4e00\u6837\u7684\u4ee3\u7801)\n    static Charset CHARSET = StandardCharsets.UTF_8;\n    static int BLOCK_SIZE = 32;\n    static byte[] encode(int count) {\n        int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);\n        if (amountToPad == 0) {\n            amountToPad = BLOCK_SIZE;\n        }\n        char padChr = chr(amountToPad);\n        String tmp = &quot;&quot;;\n        for (int index = 0; index &lt; amountToPad; index++) {\n            tmp += padChr;\n        }\n        return tmp.getBytes(CHARSET);\n    }\n    static byte[] decode(byte[] decrypted) {\n        int pad = (int) decrypted[decrypted.length - 1];\n        if (pad &lt; 1 || pad &gt; 32) {\n            pad = 0;\n        }\n        return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);\n    }\n    static char chr(int a) {\n        byte target = (byte) (a &amp; 0xFF);\n        return (char) target;\n    }\n}<\/code><\/pre>\n<h5>SHA1<\/h5>\n<pre><code class=\"language-java\">\/\/ \u6587\u4ef6: src\/main\/java\/com\/example\/wechat\/util\/SHA1.java\npackage com.example.wechat.util;\n\nimport java.security.MessageDigest;\nimport java.util.Arrays;\n\nclass SHA1 {\n    \/\/ ... (\u6b64\u5904\u7701\u7565\u548c\u60a8\u63d0\u4f9b\u7684\u4e00\u6837\u7684\u4ee3\u7801)\n    public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException {\n        try {\n            String[] array = new String[]{token, timestamp, nonce, encrypt};\n            StringBuilder sb = new StringBuilder();\n            Arrays.sort(array);\n            for (int i = 0; i &lt; 4; i++) {\n                sb.append(array[i]);\n            }\n            String str = sb.toString();\n            MessageDigest md = MessageDigest.getInstance(&quot;SHA-1&quot;);\n            md.update(str.getBytes());\n            byte[] digest = md.digest();\n            StringBuilder hexstr = new StringBuilder();\n            String shaHex = &quot;&quot;;\n            for (int i = 0; i &lt; digest.length; i++) {\n                shaHex = Integer.toHexString(digest[i] &amp; 0xFF);\n                if (shaHex.length() &lt; 2) {\n                    hexstr.append(0);\n                }\n                hexstr.append(shaHex);\n            }\n            return hexstr.toString();\n        } catch (Exception e) {\n            e.printStackTrace();\n            throw new AesException(AesException.ComputeSignatureError);\n        }\n    }\n}<\/code><\/pre>\n<h5>WXBizMsgCrypt<\/h5>\n<pre><code class=\"language-java\">\/\/ \u6587\u4ef6: src\/main\/java\/com\/example\/wechat\/util\/WXBizMsgCrypt.java\n\/\/ \u6ce8\u610f\uff1a\u8fd9\u4e2a\u6587\u4ef6\u4f9d\u8d56\u4e8e\u5176\u4ed6\u7684\u51e0\u4e2autil\u6587\u4ef6\uff0c\u8bf7\u786e\u4fdd\u5b83\u4eec\u90fd\u5728\u540c\u4e00\u4e2a\u5305\u4e0b\npackage com.example.wechat.util;\n\nimport org.apache.commons.codec.binary.Base64;\nimport javax.crypto.Cipher;\nimport javax.crypto.spec.IvParameterSpec;\nimport javax.crypto.spec.SecretKeySpec;\nimport java.nio.charset.Charset;\nimport java.nio.charset.StandardCharsets;\nimport java.util.Arrays;\nimport java.util.Random;\n\npublic class WXBizMsgCrypt {\n    static Charset CHARSET = StandardCharsets.UTF_8;\n    byte[] aesKey;\n    String token;\n    String receiveId;\n\n    public WXBizMsgCrypt(String token, String encodingAesKey, String receiveId) throws AesException {\n        if (encodingAesKey.length() != 43) {\n            throw new AesException(AesException.IllegalAesKey);\n        }\n        this.token = token;\n        this.receiveId = receiveId;\n        aesKey = Base64.decodeBase64(encodingAesKey + &quot;=&quot;);\n    }\n\n    byte[] getNetworkBytesOrder(int sourceNumber) {\n        byte[] orderBytes = new byte[4];\n        orderBytes[3] = (byte) (sourceNumber &amp; 0xFF);\n        orderBytes[2] = (byte) (sourceNumber &gt;&gt; 8 &amp; 0xFF);\n        orderBytes[1] = (byte) (sourceNumber &gt;&gt; 16 &amp; 0xFF);\n        orderBytes[0] = (byte) (sourceNumber &gt;&gt; 24 &amp; 0xFF);\n        return orderBytes;\n    }\n\n    int recoverNetworkBytesOrder(byte[] orderBytes) {\n        int sourceNumber = 0;\n        for (int i = 0; i &lt; 4; i++) {\n            sourceNumber &lt;&lt;= 8;\n            sourceNumber |= orderBytes[i] &amp; 0xff;\n        }\n        return sourceNumber;\n    }\n\n    String getRandomStr() {\n        String base = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789&quot;;\n        Random random = new Random();\n        StringBuilder sb = new StringBuilder();\n        for (int i = 0; i &lt; 16; i++) {\n            int number = random.nextInt(base.length());\n            sb.append(base.charAt(number));\n        }\n        return sb.toString();\n    }\n\n    String encrypt(String randomStr, String text) throws AesException {\n        ByteGroup byteCollector = new ByteGroup();\n        byte[] randomStrBytes = randomStr.getBytes(CHARSET);\n        byte[] textBytes = text.getBytes(CHARSET);\n        byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);\n        byte[] receiveIdBytes = receiveId.getBytes(CHARSET);\n\n        byteCollector.addBytes(randomStrBytes);\n        byteCollector.addBytes(networkBytesOrder);\n        byteCollector.addBytes(textBytes);\n        byteCollector.addBytes(receiveIdBytes);\n\n        byte[] padBytes = ByteGroup.PKCS7Encoder.encode(byteCollector.size());\n        byteCollector.addBytes(padBytes);\n\n        byte[] unencrypted = byteCollector.toBytes();\n\n        try {\n            Cipher cipher = Cipher.getInstance(&quot;AES\/CBC\/NoPadding&quot;);\n            SecretKeySpec keySpec = new SecretKeySpec(aesKey, &quot;AES&quot;);\n            IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);\n            cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);\n            byte[] encrypted = cipher.doFinal(unencrypted);\n            return Base64.encodeBase64String(encrypted);\n        } catch (Exception e) {\n            e.printStackTrace();\n            throw new AesException(AesException.EncryptAESError);\n        }\n    }\n\n    String decrypt(String text) throws AesException {\n        byte[] original;\n        try {\n            Cipher cipher = Cipher.getInstance(&quot;AES\/CBC\/NoPadding&quot;);\n            SecretKeySpec key_spec = new SecretKeySpec(aesKey, &quot;AES&quot;);\n            IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));\n            cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);\n            byte[] encrypted = Base64.decodeBase64(text);\n            original = cipher.doFinal(encrypted);\n        } catch (Exception e) {\n            e.printStackTrace();\n            throw new AesException(AesException.DecryptAESError);\n        }\n\n        String xmlContent, from_receiveId;\n        try {\n            byte[] bytes = ByteGroup.PKCS7Encoder.decode(original);\n            byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);\n            int xmlLength = recoverNetworkBytesOrder(networkOrder);\n            xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);\n            from_receiveId = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length), CHARSET);\n        } catch (Exception e) {\n            e.printStackTrace();\n            throw new AesException(AesException.IllegalBuffer);\n        }\n\n        if (!from_receiveId.equals(receiveId)) {\n            throw new AesException(AesException.ValidateCorpidError);\n        }\n        return xmlContent;\n    }\n\n    public String EncryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {\n        String encrypt = encrypt(getRandomStr(), replyMsg);\n        if (timeStamp == null || timeStamp.isEmpty()) {\n            timeStamp = Long.toString(System.currentTimeMillis());\n        }\n        String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);\n        return XMLParse.generate(encrypt, signature, timeStamp, nonce);\n    }\n\n    public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData) throws AesException {\n        Object[] encrypt = XMLParse.extract(postData);\n        String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());\n        if (!signature.equals(msgSignature)) {\n            throw new AesException(AesException.ValidateSignatureError);\n        }\n        return decrypt(encrypt[1].toString());\n    }\n\n    public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr) throws AesException {\n        String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);\n        if (!signature.equals(msgSignature)) {\n            throw new AesException(AesException.ValidateSignatureError);\n        }\n        return decrypt(echoStr);\n    }\n}<\/code><\/pre>\n<h5>XMLParse<\/h5>\n<pre><code class=\"language-java\">\/\/ \u6587\u4ef6: src\/main\/java\/com\/example\/wechat\/util\/XMLParse.java\npackage com.example.wechat.util;\n\nimport org.w3c.dom.Document;\nimport org.w3c.dom.Element;\nimport org.w3c.dom.NodeList;\nimport org.xml.sax.InputSource;\nimport javax.xml.parsers.DocumentBuilder;\nimport javax.xml.parsers.DocumentBuilderFactory;\nimport java.io.StringReader;\n\nclass XMLParse {\n    \/\/ ... (\u6b64\u5904\u7701\u7565\u548c\u60a8\u63d0\u4f9b\u7684\u4e00\u6837\u7684\u4ee3\u7801)\n    public static Object[] extract(String xmltext) throws AesException     {\n        Object[] result = new Object[2];\n        try {\n            DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();\n            dbf.setFeature(&quot;http:\/\/apache.org\/xml\/features\/disallow-doctype-decl&quot;, true);\n            dbf.setFeature(&quot;http:\/\/xml.org\/sax\/features\/external-general-entities&quot;, false);\n            dbf.setFeature(&quot;http:\/\/xml.org\/sax\/features\/external-parameter-entities&quot;, false);\n            dbf.setFeature(&quot;http:\/\/apache.org\/xml\/features\/nonvalidating\/load-external-dtd&quot;, false);\n            dbf.setXIncludeAware(false);\n            dbf.setExpandEntityReferences(false);\n            DocumentBuilder db = dbf.newDocumentBuilder();\n            StringReader sr = new StringReader(xmltext);\n            InputSource is = new InputSource(sr);\n            Document document = db.parse(is);\n            Element root = document.getDocumentElement();\n            NodeList nodelist1 = root.getElementsByTagName(&quot;Encrypt&quot;);\n            result[0] = 0;\n            result[1] = nodelist1.item(0).getTextContent();\n            return result;\n        } catch (Exception e) {\n            e.printStackTrace();\n            throw new AesException(AesException.ParseXmlError);\n        }\n    }\n    public static String generate(String encrypt, String signature, String timestamp, String nonce) {\n        String format = &quot;&lt;xml&gt;\\n&quot; + &quot;&lt;Encrypt&gt;&lt;![CDATA[%1$s]]&gt;&lt;\/Encrypt&gt;\\n&quot;\n                + &quot;&lt;MsgSignature&gt;&lt;![CDATA[%2$s]]&gt;&lt;\/MsgSignature&gt;\\n&quot;\n                + &quot;&lt;TimeStamp&gt;%3$s&lt;\/TimeStamp&gt;\\n&quot; + &quot;&lt;Nonce&gt;&lt;![CDATA[%4$s]]&gt;&lt;\/Nonce&gt;\\n&quot; + &quot;&lt;\/xml&gt;&quot;;\n        return String.format(format, encrypt, signature, timestamp, nonce);\n    }\n}<\/code><\/pre>\n<h5>application.properties<\/h5>\n<pre><code class=\"language-bash\"># \u670d\u52a1\u5668\u7aef\u53e3\u53f7\uff0c\u9ed8\u8ba4\u4e3a8080\uff0c\u60a8\u53ef\u4ee5\u6839\u636e\u9700\u8981\u4fee\u6539\nserver.port=8080\n\n# \u4f01\u4e1a\u5fae\u4fe1\u56de\u8c03\u914d\u7f6e\n# \u8bf7\u5c06\u4e0b\u9762\u7684\u4e2d\u6587\u63d0\u793a\u66ff\u6362\u4e3a\u81ea\u5df1\u7684\u771f\u5b9e\u914d\u7f6e\nwechat.corpId=\u4f01\u4e1a\u5fae\u4fe1ID\nwechat.token=\u5bf9\u5e94\u7684token\nwechat.encodingAesKey=\u5bf9\u5e94\u7684EncodingAESKey<\/code><\/pre>\n<h5>pom.xml<\/h5>\n<pre><code class=\"language-xml\">&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;\n&lt;project xmlns=&quot;http:\/\/maven.apache.org\/POM\/4.0.0&quot; xmlns:xsi=&quot;http:\/\/www.w3.org\/2001\/XMLSchema-instance&quot;\n         xsi:schemaLocation=&quot;http:\/\/maven.apache.org\/POM\/4.0.0 https:\/\/maven.apache.org\/xsd\/maven-4.0.0.xsd&quot;&gt;\n    &lt;modelVersion&gt;4.0.0&lt;\/modelVersion&gt;\n    &lt;!-- \u7ee7\u627fSpring Boot\u7684\u7236\u9879\u76ee\uff0c\u5b83\u80fd\u5e2e\u52a9\u6211\u4eec\u7ba1\u7406\u7248\u672c\u53f7 --&gt;\n    &lt;parent&gt;\n        &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n        &lt;artifactId&gt;spring-boot-starter-parent&lt;\/artifactId&gt;\n        &lt;version&gt;2.7.5&lt;\/version&gt; &lt;!-- \u60a8\u53ef\u4ee5\u6839\u636e\u9700\u8981\u9009\u62e9\u66f4\u65b0\u7684\u7248\u672c --&gt;\n        &lt;relativePath\/&gt; &lt;!-- lookup parent from repository --&gt;\n    &lt;\/parent&gt;\n\n    &lt;groupId&gt;com.example&lt;\/groupId&gt;\n    &lt;artifactId&gt;wechat-callback&lt;\/artifactId&gt;\n    &lt;version&gt;0.0.1-SNAPSHOT&lt;\/version&gt;\n    &lt;name&gt;wechat-callback&lt;\/name&gt;\n    &lt;description&gt;\u4f01\u4e1a\u5fae\u4fe1\u56de\u8c03\u9a8c\u8bc1\u670d\u52a1&lt;\/description&gt;\n\n    &lt;properties&gt;\n        &lt;java.version&gt;1.8&lt;\/java.version&gt;\n    &lt;\/properties&gt;\n\n    &lt;dependencies&gt;\n        &lt;!-- Spring Boot Web \u542f\u52a8\u5668\uff0c\u5305\u542b\u4e86\u6784\u5efaWeb\u5e94\u7528\u6240\u9700\u7684\u4e00\u5207 --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-web&lt;\/artifactId&gt;\n        &lt;\/dependency&gt;\n\n        &lt;!-- Apache Commons Codec, WXBizMsgCrypt.java \u4e2d\u4f7f\u7528\u5230\u7684Base64\u89e3\u7801 --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;commons-codec&lt;\/groupId&gt;\n            &lt;artifactId&gt;commons-codec&lt;\/artifactId&gt;\n            &lt;version&gt;1.15&lt;\/version&gt;\n        &lt;\/dependency&gt;\n\n        &lt;!-- Spring Boot \u6d4b\u8bd5\u542f\u52a8\u5668\uff0c\u7528\u4e8e\u7f16\u5199\u6d4b\u8bd5\u7528\u4f8b --&gt;\n        &lt;dependency&gt;\n            &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n            &lt;artifactId&gt;spring-boot-starter-test&lt;\/artifactId&gt;\n            &lt;scope&gt;test&lt;\/scope&gt;\n        &lt;\/dependency&gt;\n    &lt;\/dependencies&gt;\n\n    &lt;build&gt;\n        &lt;plugins&gt;\n            &lt;!-- Spring Boot Maven \u63d2\u4ef6\uff0c\u7528\u4e8e\u5c06\u5e94\u7528\u6253\u5305\u6210\u4e00\u4e2a\u53ef\u6267\u884c\u7684JAR --&gt;\n            &lt;plugin&gt;\n                &lt;groupId&gt;org.springframework.boot&lt;\/groupId&gt;\n                &lt;artifactId&gt;spring-boot-maven-plugin&lt;\/artifactId&gt;\n            &lt;\/plugin&gt;\n        &lt;\/plugins&gt;\n    &lt;\/build&gt;\n\n&lt;\/project&gt;\n<\/code><\/pre>\n<h4>\u4fee\u6539\u914d\u7f6e<\/h4>\n<p>\u6253\u5f00 <code>src\/main\/resources\/application.properties<\/code> \u6587\u4ef6\uff0c\u5c06\u91cc\u9762\u7684\u4e2d\u6587\u63d0\u793a\u66ff\u6362\u6210\u81ea\u5df1\u7684\u4f01\u4e1a\u5fae\u4fe1\u540e\u53f0\u83b7\u53d6\u7684\u771f\u5b9e\u4fe1\u606f\u3002<\/p>\n<h4>\u4f7f\u7528Maven\u6253\u5305<\/h4>\n<p>\u6253\u5f00\u547d\u4ee4\u884c\u5de5\u5177\uff08\u7ec8\u7aef\u3001CMD\u6216PowerShell\uff09\u3002<\/p>\n<p>\u4f7f\u7528 <code>cd<\/code> \u547d\u4ee4\u8fdb\u5165\u5230\u60a8\u7684\u9879\u76ee\u6839\u76ee\u5f55 <code>wechat-callback\/<\/code>\u3002<\/p>\n<p>Maven\u4f1a\u81ea\u52a8\u4e0b\u8f7d\u6240\u6709\u9700\u8981\u7684\u4f9d\u8d56\u5e93\uff0c\u7f16\u8bd1\u4ee3\u7801\uff0c\u7136\u540e\u751f\u6210\u4e00\u4e2a\u53ef\u6267\u884c\u7684JAR\u5305\u3002\u5728\u9879\u76ee\u4e0b\u7684 <code>target\/<\/code> \u6587\u4ef6\u5939\u91cc\u627e\u5230\u5b83\uff0c\u6587\u4ef6\u540d\u901a\u5e38\u662f <code>wechat-callback-0.0.1-SNAPSHOT.jar<\/code>\u3002<\/p>\n<p>\u8fd0\u884c\u4ee5\u4e0bMaven\u547d\u4ee4\uff1a<\/p>\n<pre><code class=\"language-bash\">PS E:\\XYY_WorkSpaces\\JetBrains_WorkSpace\\IDEA\\wechat-callback&gt; mvn clean package\n[INFO] Scanning for projects...\n[INFO] \n[INFO] --------------------&lt; com.example:wechat-callback &gt;---------------------\n[INFO] Building wechat-callback 0.0.1-SNAPSHOT\n[INFO] --------------------------------[ jar ]---------------------------------\n[INFO] \n[INFO] --- maven-clean-plugin:3.2.0:clean (default-clean) @ wechat-callback ---\n[INFO] \n[INFO] --- maven-resources-plugin:3.2.0:resources (default-resources) @ wechat-callback ---\n[INFO] Using &#039;UTF-8&#039; encoding to copy filtered resources.\n[INFO] Using &#039;UTF-8&#039; encoding to copy filtered properties files.\n[INFO] Copying 1 resource\n[INFO] Copying 0 resource\n[INFO] \n[INFO] --- maven-compiler-plugin:3.10.1:compile (default-compile) @ wechat-callback ---\n[INFO] Changes detected - recompiling the module!\n[INFO] Compiling 9 source files to E:\\XYY_WorkSpaces\\JetBrains_WorkSpace\\IDEA\\wechat-callback\\target\\classes\n[INFO] --- maven-compiler-plugin:3.10.1:testCompile (default-testCompile) @ wechat-callback ---\n[INFO] Changes detected - recompiling the module!\n[INFO]\n[INFO] --- maven-surefire-plugin:2.22.2:test (default-test) @ wechat-callback ---\n[INFO]\n[INFO] --- maven-jar-plugin:3.2.2:jar (default-jar) @ wechat-callback ---\n[INFO] Building jar: E:\\XYY_WorkSpaces\\JetBrains_WorkSpace\\IDEA\\wechat-callback\\target\\wechat-callback-0.0.1-SNAPSHOT.jar\n[INFO]\n[INFO] --- spring-boot-maven-plugin:2.7.5:repackage (repackage) @ wechat-callback ---\n[INFO] Replacing main artifact with repackaged archive\n[INFO] ------------------------------------------------------------------------\n[INFO] BUILD SUCCESS\n[INFO] BUILD SUCCESS\n[INFO] ------------------------------------------------------------------------\n[INFO] Total time:  2.210 s\n[INFO] Finished at: 2025-08-04T15:06:22+08:00\n[INFO] ------------------------------------------------------------------------\nPS E:\\XYY_WorkSpaces\\JetBrains_WorkSpace\\IDEA\\wechat-callback&gt;<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804171402414.png\" alt=\"image-20250804171402414\" \/><\/p>\n<h4>\u5728\u670d\u52a1\u5668\u4e0a\u8fd0\u884c<\/h4>\n<pre><code class=\"language-bash\">java -jar wechat-callback-0.0.1-SNAPSHOT.jar<\/code><\/pre>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804171601465.png\" alt=\"image-20250804171601465\" \/><\/p>\n<h2>\u9a8c\u8bc1\u6210\u529f<\/h2>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/41278c66a2aad2816d1f6a367fab6a0.png\" alt=\"41278c66a2aad2816d1f6a367fab6a0\" \/><\/p>\n<p>\u4e0b\u9762\u5c31\u53ef\u4ee5\u8bbe\u7f6e\u767d\u540d\u5355\u4e86<\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804171821582.png\" alt=\"image-20250804171821582\" \/><\/p>\n<p><img decoding=\"async\" src=\"https:\/\/typora-images-1307361841.cos.ap-beijing.myqcloud.com\/img\/image-20250804171834384.png\" alt=\"image-20250804171834384\" \/><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u672c\u4eba\u76ee\u524d\u662f\u4e00\u540d\u8fd0\u7ef4\u3001\u4e91\u539f\u751f\u4eba\u5458\uff0c\u90a3\u4e3a\u4ec0\u4e48\u8981\u7528JAVA\u5199\u4e00\u4e2a\u63a5\u53e3\u5462\uff1f\u662f\u8fd9\u6837\u7684\uff0c\u5728\u4f7f\u7528zabbix \u76d1\u63a7 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[91],"tags":[92],"views":604,"_links":{"self":[{"href":"http:\/\/8.141.4.74\/index.php?rest_route=\/wp\/v2\/posts\/531"}],"collection":[{"href":"http:\/\/8.141.4.74\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/8.141.4.74\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/8.141.4.74\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/8.141.4.74\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=531"}],"version-history":[{"count":1,"href":"http:\/\/8.141.4.74\/index.php?rest_route=\/wp\/v2\/posts\/531\/revisions"}],"predecessor-version":[{"id":532,"href":"http:\/\/8.141.4.74\/index.php?rest_route=\/wp\/v2\/posts\/531\/revisions\/532"}],"wp:attachment":[{"href":"http:\/\/8.141.4.74\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=531"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/8.141.4.74\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=531"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/8.141.4.74\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=531"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}