{"id":29249,"date":"2024-11-25T08:06:04","date_gmt":"2024-11-25T00:06:04","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29249\/"},"modified":"2024-11-25T08:06:04","modified_gmt":"2024-11-25T00:06:04","slug":"%e5%be%ae%e4%bf%a1%e5%85%ac%e4%bc%97%e8%b4%a6%e5%8f%b7%e5%bc%80%e5%8f%91%e8%87%aa%e5%ae%9a%e4%b9%89%e8%8f%9c%e5%8d%95%e7%9a%84%e7%bb%8f%e9%aa%8c%e6%80%bb%e7%bb%93","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29249\/","title":{"rendered":"\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\u5f00\u53d1\u81ea\u5b9a\u4e49\u83dc\u5355\u7684\u7ecf\u9a8c\u603b\u7ed3"},"content":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u5206\u4eab\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\u5f00\u53d1\u81ea\u5b9a\u4e49\u83dc\u5355\u7684\u7ecf\u9a8c\u603b\u7ed3<\/p>\n<pre>    \u5f00\u53d1\u516c\u53f8\u7684\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\uff0c\u5728\u6ca1\u4eba\u6307\u5bfc\u6ca1\u6709\u4eba\u5546\u91cf\u7684\u60c5\u51b5\u4e0b\u6ca1\u5c11\u67e5\u8d44\u6599\u3001\u901b\u8bba\u575b\u3002\u5176\u4e2d\u6709\u591a\u5c11\u9178\u751c\u82e6\u8fa3\uff0c\u76f8\u4fe1\u80fd\u8fdb\u6765\u770b\u89c1\u6211\u7684\u5e16\u5b50\u7684\u80fd\u4f53\u4f1a\u7684\u5230\u3002\u4e00\u5e74\u591a\u6765\u4e3a\u4e86\u5e94\u4ed8\u516c\u53f8\u7684\u5404\u79cd\u9700\u6c42\u6ca1\u65f6\u95f4\u6574\u7406\uff0c\u4eca\u5929\u6211\u5c31\u628a\u8be6\u7ec6\u7684\u6d41\u7a0b\u5199\u4e0b\u6765\u4f9b\u540c\u6837\u9047\u5230\u95ee\u9898\u7684\u53c2\u8003\u3002\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\u51e0\u79cd\u5206\u7c7b\u76f8\u4fe1\u5927\u5bb6\u90fd\u6709\u4e86\u89e3\u3002 \u8ba2\u9605\u53f7\u6211\u8868\u793a\u65e0\u80fd\u4e3a\u529b\u3002\u9664\u975e\u4f60\u80fd\u8ba4\u8bc1\u901a\u8fc7\u3002\u5e9f\u8bdd\u5c11\u8bf4\u5f00\u64b8\u3002\r\n     \r\n    \u81ea\u5b9a\u4e49\u83dc\u5355\u64cd\u4f5c\u6d41\u7a0b\u5176\u5b9e\u5f88\u7b80\u5355 \uff0c\u5c31\u662f\u6267\u884c\u4e00\u6bb5Java\u7a0b\u5e8f \u5c06\u4f60\u516c\u4f17\u8d26\u53f7\u7684appid\u548c\u5c01\u88c5\u7684\u83dc\u5355\u53d1\u9001\u5230\u817e\u8baf\u670d\u52a1\u5668\uff0c\u817e\u8baf\u670d\u52a1\u5668\u4f1a\u6839\u636e\u4f60\u8bf7\u6c42\u53c2\u6570appid\u548c\u5c01\u88c5\u7684\u83dc\u5355\u6dfb\u52a0\u5230\u5bf9\u5e94\u7684\u516c\u4f17\u8d26\u53f7\uff0c\u4e00\u5b9a\u8981\u7f57\u55e6\u4e00\u53e5\uff0c \u5728Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u4e00\u6b21 main \u65b9\u6cd5\u5c31\u53ef\u4ee5\uff0c\u4e0b\u6b21\u4fee\u6539\u91cd\u65b0\u6267\u884c\uff0c\u4e0d\u8fc7\u4f1a\u6709\u7f13\u5b58\uff0c\u53d6\u6d88\u91cd\u65b0\u5173\u6ce8\u5c31\u53ef\u4ee5\u4e86\u3002\r\n    1 \u65b0\u5efa\u6309\u94ae\u57fa\u7c7b   \r\n        public class Button {\r\n            \/\/\u6309\u94ae\u540d\u79f0\r\n            private String name;\r\n         \r\n            public String getName() {\r\n                return name;\r\n            }\r\n         \r\n            public void setName(String name) {\r\n                this.name = name;\r\n            }\r\n        }\r\n    2,\u6839\u636e\u4e1a\u52a1\u9700\u6c42\u65b0\u5efa\u4e0d\u540c\u7684\u6309\u94ae\u7c7b \r\n         \r\n    \/**\r\n     * view\u7c7b\u578b\u7684\u6309\u94ae  \u70b9\u51fb\u8df3\u8f6c\u94fe\u63a5\r\n     * \r\n     *\/\r\n    public class ViewButton extends Button {\r\n        private String type;\r\n        private String url;\r\n     \r\n        public String getType() {\r\n            return type;\r\n        }\r\n     \r\n        public void setType(String type) {\r\n            this.type = type;\r\n        }\r\n     \r\n        public String getUrl() {\r\n            return url;\r\n        }\r\n     \r\n        public void setUrl(String url) {\r\n            this.url = url;\r\n        }\r\n    }<\/pre>\n<p>  \u767b\u5f55\u540e\u590d\u5236   <\/p>\n<p>&nbsp; &nbsp; \/**<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;* click\u7c7b\u578b\u7684\u6309\u94ae \u7c7b\u4f3c\u4e8einput type = &#8216;button&#8217; \u6307\u5b9akey \u6839\u636e\u6355\u83b7\u5230\u7684key\u5904\u7406\u76f8\u5e94\u7684\u4e1a\u52a1<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;public class ClickButton extends Button {<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; private String type;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; private String key;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; public String getType() {<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; return type;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; public void setType(String type) {<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; this.type = type;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; public String getKey() {<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; return key;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; public void setKey(String key) {<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; this.key = key;<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp; }<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;3 \u521b\u5efa\u7b26\u5408\u7c7b\u578b\u7684\u6309\u94ae \uff0c \u8bf4\u767d\u4e86\u5c31\u662f\u521b\u5efa\u4e3b\u83dc\u5355\u5bb9\u5668<\/p>\n<p>\/**<\/p>\n<p>&nbsp;* \u590d\u5408\u7c7b\u578b\u7684\u6309\u94ae<\/p>\n<p>&nbsp;*&nbsp;<\/p>\n<p>&nbsp;*\/<\/p>\n<p>public class ComplexButton extends Button {<\/p>\n<p> private Button[] sub_button;<\/p>\n<p> public Button[] getSub_button() {<\/p>\n<p> return sub_button;<\/p>\n<p> }<\/p>\n<p> public void setSub_button(Button[] sub_button) {<\/p>\n<p> this.sub_button = sub_button;<\/p>\n<p> }<\/p>\n<p>}<\/p>\n<p>4 \u521b\u5efa\u83dc\u5355\u7c7b\uff0c \u7528\u4e8e\u76db\u653e \u4e09\u4e2a\u4e3b\u83dc\u5355<\/p>\n<p>\/**<\/p>\n<p>&nbsp;* \u83dc\u5355<\/p>\n<p>&nbsp;*\/<\/p>\n<p>public class Menu {<\/p>\n<p> private Button[] button;<\/p>\n<p> public Button[] getButton() {<\/p>\n<p> return button;<\/p>\n<p> }<\/p>\n<p> public void setButton(Button[] button) {<\/p>\n<p> this.button = button;<\/p>\n<p> }<\/p>\n<p>}<\/p>\n<p>5 \u521b\u5efa\u8c03\u7528\u51ed\u8bc1\u7c7bToken \u4e3a\u6267\u884cmain\u65b9\u6cd5\u8c03\u7528\u817e\u8baf\u63a5\u53e3\u505a\u51c6\u5907<\/p>\n<p>\/**<\/p>\n<p>&nbsp;* \u51ed\u8bc1<\/p>\n<p>&nbsp;*&nbsp;<\/p>\n<p>&nbsp;*\/<\/p>\n<p>public class Token {<\/p>\n<p> \/\/ \u63a5\u53e3\u8bbf\u95ee\u51ed\u8bc1<\/p>\n<p> private String accessToken;<\/p>\n<p> \/\/ \u51ed\u8bc1\u6709\u6548\u671f\uff0c\u5355\u4f4d\uff1a\u79d2<\/p>\n<p> private int expiresIn;<\/p>\n<p> public String getAccessToken() {<\/p>\n<p> return accessToken;<\/p>\n<p> }<\/p>\n<p> public void setAccessToken(String accessToken) {<\/p>\n<p> this.accessToken = accessToken;<\/p>\n<p> }<\/p>\n<p> public int getExpiresIn() {<\/p>\n<p> return expiresIn;<\/p>\n<p> }<\/p>\n<p> public void setExpiresIn(int expiresIn) {<\/p>\n<p> this.expiresIn = expiresIn;<\/p>\n<p> }<\/p>\n<p>}<\/p>\n<p>\u4ee5\u4e0b\u4ee3\u7801\u6211\u53ea\u505a\u7c7b\u7684\u63cf\u8ff0\u3002\u5177\u4f53\u4ee3\u7801\u529f\u80fd\u770b\u6ce8\u91ca\u3002<\/p>\n<p>6 \u4e3a\u8c03\u7528\u817e\u8baf\u63a5\u53e3\u505a\u51c6\u5907<\/p>\n<p>&nbsp;&nbsp;&nbsp;&nbsp;\uff081\uff09\u521b\u5efa\u901a\u7528\u5de5\u5177\u7c7b<\/p>\n<p>\/**<\/p>\n<p>&nbsp;* \u901a\u7528\u5de5\u5177\u7c7b<\/p>\n<p>&nbsp;*&nbsp;<\/p>\n<p>&nbsp;*\/<\/p>\n<p>public class CommonUtil {<\/p>\n<p> private static Logger log = LoggerFactory.getLogger(CommonUtil.class);<\/p>\n<p> \/**<\/p>\n<p> &nbsp;* \u83b7\u53d6\u63a5\u53e3\u8bbf\u95ee\u51ed\u8bc1<\/p>\n<p> &nbsp;*&nbsp;<\/p>\n<p> &nbsp;* @param appid \u51ed\u8bc1<\/p>\n<p> &nbsp;* @param appsecret \u5bc6\u94a5<\/p>\n<p> &nbsp;* @return<\/p>\n<p> &nbsp;*\/<\/p>\n<p> public static Token getToken(String appid, String appsecret) {<\/p>\n<p> \/\/ \u51ed\u8bc1\u83b7\u53d6\uff08GET\uff09<\/p>\n<p> String token_url = &#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;appid=APPID&amp;secret=APPSECRET&#8221;;<\/p>\n<p> Token token = null;<\/p>\n<p> String requestUrl = token_url.replace(&#8220;APPID&#8221;, appid).replace(&#8220;APPSECRET&#8221;, appsecret);<\/p>\n<p> \/\/ \u53d1\u8d77GET\u8bf7\u6c42\u83b7\u53d6\u51ed\u8bc1<\/p>\n<p> JSONObject jsonObject = httpsRequest(requestUrl, &#8220;GET&#8221;, null);<\/p>\n<p> if (null != jsonObject) {<\/p>\n<p> try {<\/p>\n<p> token = new Token();<\/p>\n<p> token.setAccessToken(jsonObject.getString(&#8220;access_token&#8221;));<\/p>\n<p> token.setExpiresIn(jsonObject.getInt(&#8220;expires_in&#8221;));<\/p>\n<p> } catch (JSONException e) {<\/p>\n<p> \/\/ \u83b7\u53d6token\u5931\u8d25<\/p>\n<p> token = null;<\/p>\n<p> }<\/p>\n<p> }<\/p>\n<p> return token;<\/p>\n<p> }<\/p>\n<p> \/**<\/p>\n<p> &nbsp;* \u53d1\u9001https\u8bf7\u6c42<\/p>\n<p> &nbsp;*&nbsp;<\/p>\n<p> &nbsp;* @param requestUrl \u8bf7\u6c42\u5730\u5740<\/p>\n<p> &nbsp;* @param requestMethod \u8bf7\u6c42\u65b9\u5f0f\uff08GET\u3001POST\uff09<\/p>\n<p> &nbsp;* @param outputStr \u63d0\u4ea4\u7684\u6570\u636e<\/p>\n<p> &nbsp;* @return JSONObject(\u901a\u8fc7JSONObject.get(key)\u7684\u65b9\u5f0f\u83b7\u53d6json\u5bf9\u8c61\u7684\u5c5e\u6027\u503c)<\/p>\n<p> &nbsp;*\/<\/p>\n<p> public static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr) {<\/p>\n<p> JSONObject jsonObject = null;<\/p>\n<p> try {<\/p>\n<p> \/\/ \u521b\u5efaSSLContext\u5bf9\u8c61\uff0c\u5e76\u4f7f\u7528\u6211\u4eec\u6307\u5b9a\u7684\u4fe1\u4efb\u7ba1\u7406\u5668\u521d\u59cb\u5316<\/p>\n<p> TrustManager[] tm = { new MyX509TrustManager() };<\/p>\n<p> SSLContext sslContext = SSLContext.getInstance(&#8220;SSL&#8221;, &#8220;SunJSSE&#8221;);<\/p>\n<p> sslContext.init(null, tm, new java.security.SecureRandom());<\/p>\n<p> \/\/ \u4ece\u4e0a\u8ff0SSLContext\u5bf9\u8c61\u4e2d\u5f97\u5230SSLSocketFactory\u5bf9\u8c61<\/p>\n<p> SSLSocketFactory ssf = sslContext.getSocketFactory();<\/p>\n<p> URL url = new URL(requestUrl);<\/p>\n<p> HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();<\/p>\n<p> conn.setSSLSocketFactory(ssf);<\/p>\n<p> conn.setDoOutput(true);<\/p>\n<p> conn.setDoInput(true);<\/p>\n<p> conn.setUseCaches(false);<\/p>\n<p> \/\/ \u8bbe\u7f6e\u8bf7\u6c42\u65b9\u5f0f\uff08GET\/POST\uff09<\/p>\n<p> conn.setRequestMethod(requestMethod);<\/p>\n<p> \/\/ \u5f53outputStr\u4e0d\u4e3anull\u65f6\u5411\u8f93\u51fa\u6d41\u5199\u6570\u636e<\/p>\n<p> if (null != outputStr) {<\/p>\n<p> OutputStream outputStream = conn.getOutputStream();<\/p>\n<p> \/\/ \u6ce8\u610f\u7f16\u7801\u683c\u5f0f<\/p>\n<p> outputStream.write(outputStr.getBytes(&#8220;UTF-8&#8221;));<\/p>\n<p> outputStream.close();<\/p>\n<p> }<\/p>\n<p> \/\/ \u4ece\u8f93\u5165\u6d41\u8bfb\u53d6\u8fd4\u56de\u5185\u5bb9<\/p>\n<p> InputStream inputStream = conn.getInputStream();<\/p>\n<p> InputStreamReader inputStreamReader = new InputStreamReader(inputStream, &#8220;utf-8&#8221;);<\/p>\n<p> BufferedReader bufferedReader = new BufferedReader(inputStreamReader);<\/p>\n<p> String str = null;<\/p>\n<p> StringBuffer buffer = new StringBuffer();<\/p>\n<p> while ((str = bufferedReader.readLine()) != null) {<\/p>\n<p> buffer.append(str);<\/p>\n<p> }<\/p>\n<p> \/\/ \u91ca\u653e\u8d44\u6e90<\/p>\n<p> bufferedReader.close();<\/p>\n<p> inputStreamReader.close();<\/p>\n<p> inputStream.close();<\/p>\n<p> inputStream = null;<\/p>\n<p> conn.disconnect();<\/p>\n<p> jsonObject = JSONObject.fromObject(buffer.toString());<\/p>\n<p> } catch (ConnectException ce) {<\/p>\n<p> log.error(&#8220;\u8fde\u63a5\u8d85\u65f6\uff1a{}&#8221;, ce);<\/p>\n<p> } catch (Exception e) {<\/p>\n<p> log.error(&#8220;https\u8bf7\u6c42\u5f02\u5e38\uff1a{}&#8221;, e);<\/p>\n<p> }<\/p>\n<p> return jsonObject;<\/p>\n<p> }<\/p>\n<p>}<\/p>\n<p>\uff082\uff09\u521b\u5efa\u4fe1\u4efb\u7ba1\u7406\u5668<\/p>\n<p>package com.test.util;<\/p>\n<p>import java.security.cert.CertificateException;<\/p>\n<p>import java.security.cert.X509Certificate;<\/p>\n<p>import javax.net.ssl.X509TrustManager;<\/p>\n<p>\/**<\/p>\n<p>&nbsp;* \u4fe1\u4efb\u7ba1\u7406\u5668<\/p>\n<p>&nbsp;*&nbsp;<\/p>\n<p>&nbsp;*\/<\/p>\n<p>public class MyX509TrustManager implements X509TrustManager {<\/p>\n<p> \/\/ \u68c0\u67e5\u5ba2\u6237\u7aef\u8bc1\u4e66<\/p>\n<p> public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {<\/p>\n<p> }<\/p>\n<p> \/\/ \u68c0\u67e5\u670d\u52a1\u5668\u7aef\u8bc1\u4e66<\/p>\n<p> public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {<\/p>\n<p> }<\/p>\n<p> \/\/ \u8fd4\u56de\u53d7\u4fe1\u4efb\u7684X509\u8bc1\u4e66\u6570\u7ec4<\/p>\n<p> public X509Certificate[] getAcceptedIssuers() {<\/p>\n<p> return null;<\/p>\n<p> }<\/p>\n<p>}<\/p>\n<p>7 \u4ee5\u4e0a\u5de5\u4f5c\u505a\u5b8c\u5c31\u53ef\u4ee5\u521b\u5efa\u81ea\u5b9a\u4e49\u83dc\u5355\u4e86\u3002\u521b\u5efa\u81ea\u5b9a\u4e49\u83dc\u5355\u7ba1\u7406\u7c7b\u3002\u8d4b\u503c appId \u548c&nbsp;appSecret &nbsp;\u8fd0\u884cmain\u65b9\u6cd5\uff0c \u641e\u5b9a\u3002<\/p>\n<p>package com.test.menu;<\/p>\n<p>import org.slf4j.Logger;<\/p>\n<p>import org.slf4j.LoggerFactory;<\/p>\n<p>import net.sf.json.JSONObject;<\/p>\n<p>import com.test.bean.Button;<\/p>\n<p>import com.test.bean.ComplexButton;<\/p>\n<p>import com.test.bean.Menu;<\/p>\n<p>import com.test.bean.Token;<\/p>\n<p>import com.test.bean.ViewButton;<\/p>\n<p>import com.test.util.CommonUtil;<\/p>\n<p>\/**<\/p>\n<p>&nbsp;* \u83dc\u5355\u7ba1\u7406\u5668\u7c7b<\/p>\n<p>&nbsp;*&nbsp;<\/p>\n<p>&nbsp;*\/<\/p>\n<p>public class MenuManager {<\/p>\n<p> private static Logger log = LoggerFactory.getLogger(MenuManager.class);<\/p>\n<p> \/**<\/p>\n<p> &nbsp;* \u5b9a\u4e49\u83dc\u5355\u7ed3\u6784<\/p>\n<p> &nbsp;* @return<\/p>\n<p> &nbsp;*\/<\/p>\n<p> private static Menu getMenu() {<\/p>\n<p> \/\/\u5b9a\u4e49\u5b50\u83dc\u5355<\/p>\n<p> ViewButton btn1 = new ViewButton();<\/p>\n<p> btn1.setName(&#8220;\u5b50\u83dc\u53551&#8221;);<\/p>\n<p> btn1.setType(&#8220;view&#8221;);<\/p>\n<p> btn1.setUrl(&#8220;http:\/\/www.baidu.com&#8221;);<\/p>\n<p> ViewButton btn2 = new ViewButton();<\/p>\n<p> btn2.setName(&#8220;\u5b50\u83dc\u53552&#8221;);<\/p>\n<p> btn2.setType(&#8220;view&#8221;);<\/p>\n<p> btn2.setUrl(&#8220;http:\/\/www.baidu.com&#8221;);<\/p>\n<p> ViewButton btn3 = new ViewButton();<\/p>\n<p> btn3.setName(&#8220;\u5b50\u83dc\u53553&#8221;);<\/p>\n<p> btn3.setType(&#8220;view&#8221;);<\/p>\n<p> btn3.setUrl(&#8220;http:\/\/www.baidu.com&#8221;);<\/p>\n<p> ViewButton btn4 = new ViewButton();<\/p>\n<p> btn4.setName(&#8220;\u5b50\u83dc\u53554&#8221;);<\/p>\n<p> btn4.setType(&#8220;view&#8221;);<\/p>\n<p> btn4.setUrl(&#8220;http:\/\/www.baidu.com&#8221;);<\/p>\n<p> ComplexButton mainBtn1 = new ComplexButton();<\/p>\n<p> mainBtn1.setName(&#8220;\u4e3b\u83dc\u53551&#8221;);<\/p>\n<p> mainBtn1.setSub_button(new Button[] { btn1,btn2});\/\/\u5fae\u4fe1\u89c4\u5b9a\u6700\u591a\u4e94\u4e2a\u5b50\u83dc\u5355<\/p>\n<p> ComplexButton mainBtn2 = new ComplexButton(); &nbsp;<\/p>\n<p> mainBtn2.setName(&#8220;\u4e3b\u83dc\u53552&#8221;);<\/p>\n<p> mainBtn2.setSub_button(new Button[] { btn3});<\/p>\n<p> ComplexButton mainBtn3 = new ComplexButton();&nbsp;<\/p>\n<p> mainBtn3.setName(&#8220;\u4e3b\u83dc\u53553&#8221;);<\/p>\n<p> mainBtn3.setSub_button(new Button[] {btn4});<\/p>\n<p> Menu menu = new Menu();<\/p>\n<p> menu.setButton(new Button[] { mainBtn1, mainBtn2, mainBtn3 });<\/p>\n<p> return menu;<\/p>\n<p> }<\/p>\n<p> public static void main(String[] args) {<\/p>\n<p> \/\/ \u516c\u4f17\u8d26\u53f7\u552f\u4e00\u51ed\u8bc1<\/p>\n<p>1<\/p>\n<p><\/p>\n<p> String appId = &#8220;&#8221;;<\/p>\n<p> &nbsp;\/\/\u516c\u4f17\u8d26\u53f7\u552f\u4e00\u51ed\u8bc1\u5bc6\u94a5<\/p>\n<p> String appSecret = &#8220;&#8221;;<\/p>\n<p> \/\/ \u8c03\u7528\u63a5\u53e3\u83b7\u53d6\u51ed\u8bc1<\/p>\n<p> Token token = CommonUtil.getToken(appId, appSecret);<\/p>\n<p> if (null != token) {<\/p>\n<p> \/\/ \u521b\u5efa\u83dc\u5355<\/p>\n<p> boolean result = createMenu(getMenu(), token.getAccessToken());<\/p>\n<p> \/\/ \u5224\u65ad\u83dc\u5355\u521b\u5efa\u7ed3\u679c<\/p>\n<p> if (result)<\/p>\n<p> log.info(&#8220;\u83dc\u5355\u521b\u5efa\u6210\u529f\uff01&#8221;);<\/p>\n<p> else<\/p>\n<p> log.info(&#8220;\u83dc\u5355\u521b\u5efa\u5931\u8d25\uff01&#8221;);<\/p>\n<p> }<\/p>\n<p> }<\/p>\n<p> \/**<\/p>\n<p> &nbsp;* \u521b\u5efa\u83dc\u5355<\/p>\n<p> &nbsp;*&nbsp;<\/p>\n<p> &nbsp;* @param menu \u83dc\u5355\u5b9e\u4f8b<\/p>\n<p> &nbsp;* @param accessToken \u51ed\u8bc1<\/p>\n<p> &nbsp;* @return true\u6210\u529f false\u5931\u8d25<\/p>\n<p> &nbsp;*\/<\/p>\n<p> public static boolean createMenu(Menu menu, String accessToken) {<\/p>\n<p> boolean result = false;<\/p>\n<p> String menu_create_url = &#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/menu\/create?access_token=ACCESS_TOKEN&#8221;;<\/p>\n<p> String url = menu_create_url.replace(&#8220;ACCESS_TOKEN&#8221;, accessToken);<\/p>\n<p> \/\/ \u5c06\u83dc\u5355\u5bf9\u8c61\u8f6c\u6362\u6210json\u5b57\u7b26\u4e32<\/p>\n<p> String jsonMenu = JSONObject.fromObject(menu).toString();<\/p>\n<p> \/\/ \u53d1\u8d77POST\u8bf7\u6c42\u521b\u5efa\u83dc\u5355<\/p>\n<p> JSONObject jsonObject = CommonUtil.httpsRequest(url, &#8220;POST&#8221;, jsonMenu);<\/p>\n<p> if (null != jsonObject) {<\/p>\n<p> int errorCode = jsonObject.getInt(&#8220;errcode&#8221;);<\/p>\n<p> String errorMsg = jsonObject.getString(&#8220;errmsg&#8221;);<\/p>\n<p> if (0 == errorCode) {<\/p>\n<p> result = true;<\/p>\n<p> } else {<\/p>\n<p> result = false;<\/p>\n<p> log.error(&#8220;\u521b\u5efa\u83dc\u5355\u5931\u8d25 errcode:{} errmsg:{}&#8221;, errorCode, errorMsg);<\/p>\n<p> }<\/p>\n<p> }<\/p>\n<p> return result;<\/p>\n<p> }<\/p>\n<p>}<\/p>\n<p>\u4ee5\u4e0a\u5c31\u662f\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\u5f00\u53d1\u81ea\u5b9a\u4e49\u83dc\u5355\u7684\u7ecf\u9a8c\u603b\u7ed3\u7684\u8be6\u7ec6\u5185\u5bb9\uff0c\u66f4\u591a\u8bf7\u5173\u6ce8\u7c73\u4e91\u5176\u5b83\u76f8\u5173\u6587\u7ae0\uff01<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u8fd9\u7bc7\u6587\u7ae0\u5206\u4eab\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\u5f00\u53d1\u81ea\u5b9a\u4e49\u83dc\u5355\u7684\u7ecf\u9a8c\u603b\u7ed3 \u5f00\u53d1\u516c\u53f8\u7684\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\uff0c\u5728\u6ca1\u4eba\u6307\u5bfc\u6ca1\u6709\u4eba\u5546\u91cf\u7684\u60c5\u51b5\u4e0b\u6ca1\u5c11\u67e5\u8d44\u6599\u3001\u901b\u8bba\u575b\u3002\u5176\u4e2d\u6709\u591a\u5c11\u9178\u751c\u82e6\u8fa3\uff0c\u76f8\u4fe1\u80fd\u8fdb\u6765\u770b\u89c1\u6211\u7684\u5e16\u5b50\u7684\u80fd\u4f53\u4f1a\u7684\u5230\u3002\u4e00\u5e74\u591a\u6765\u4e3a\u4e86\u5e94\u4ed8\u516c\u53f8\u7684\u5404\u79cd\u9700\u6c42\u6ca1\u65f6\u95f4\u6574\u7406\uff0c\u4eca\u5929\u6211\u5c31\u628a\u8be6\u7ec6\u7684\u6d41\u7a0b\u5199\u4e0b\u6765\u4f9b\u540c\u6837\u9047\u5230\u95ee\u9898\u7684\u53c2\u8003\u3002\u5fae\u4fe1\u516c\u4f17\u8d26\u53f7\u51e0\u79cd\u5206\u7c7b\u76f8\u4fe1\u5927\u5bb6\u90fd\u6709\u4e86\u89e3\u3002 \u8ba2\u9605\u53f7\u6211\u8868\u793a\u65e0\u80fd\u4e3a\u529b\u3002\u9664\u975e\u4f60\u80fd\u8ba4\u8bc1\u901a\u8fc7\u3002\u5e9f\u8bdd\u5c11\u8bf4\u5f00\u64b8\u3002 \u81ea\u5b9a\u4e49\u83dc\u5355\u64cd\u4f5c\u6d41\u7a0b\u5176\u5b9e\u5f88\u7b80\u5355 \uff0c\u5c31\u662f\u6267\u884c\u4e00\u6bb5Java\u7a0b\u5e8f \u5c06\u4f60\u516c\u4f17\u8d26\u53f7\u7684appid\u548c\u5c01\u88c5\u7684\u83dc\u5355\u53d1\u9001\u5230\u817e\u8baf\u670d\u52a1\u5668\uff0c\u817e\u8baf\u670d\u52a1\u5668\u4f1a\u6839\u636e\u4f60\u8bf7\u6c42\u53c2\u6570appid\u548c\u5c01\u88c5\u7684\u83dc\u5355\u6dfb\u52a0\u5230\u5bf9\u5e94\u7684\u516c\u4f17\u8d26\u53f7\uff0c\u4e00\u5b9a\u8981\u7f57\u55e6\u4e00\u53e5\uff0c \u5728Java \u7a0b\u5e8f\u4e2d\u6267\u884c\u4e00\u6b21 main \u65b9\u6cd5\u5c31\u53ef\u4ee5\uff0c\u4e0b\u6b21\u4fee\u6539\u91cd\u65b0\u6267\u884c\uff0c\u4e0d\u8fc7\u4f1a\u6709\u7f13\u5b58\uff0c\u53d6\u6d88\u91cd\u65b0\u5173\u6ce8\u5c31\u53ef\u4ee5\u4e86\u3002 1 \u65b0\u5efa\u6309\u94ae\u57fa\u7c7b public class Button { \/\/\u6309\u94ae\u540d\u79f0 private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } } 2,\u6839\u636e\u4e1a\u52a1\u9700\u6c42\u65b0\u5efa\u4e0d\u540c\u7684\u6309\u94ae\u7c7b \/** * view\u7c7b\u578b\u7684\u6309\u94ae \u70b9\u51fb\u8df3\u8f6c\u94fe\u63a5 * *\/ public class ViewButton extends Button { private String type; private String [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[19],"tags":[],"class_list":["post-29249","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29249","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=29249"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29249\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29249"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29249"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29249"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}