{"id":29036,"date":"2024-11-25T10:15:58","date_gmt":"2024-11-25T02:15:58","guid":{"rendered":"https:\/\/fwq.ai\/blog\/29036\/"},"modified":"2024-11-25T10:15:58","modified_gmt":"2024-11-25T02:15:58","slug":"java%e5%be%ae%e4%bf%a1%e5%bc%80%e5%8f%91%e4%b9%8b%e4%b8%8a%e4%bc%a0%e4%b8%8b%e8%bd%bd%e5%a4%9a%e5%aa%92%e4%bd%93%e6%96%87%e4%bb%b6","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/29036\/","title":{"rendered":"java\u5fae\u4fe1\u5f00\u53d1\u4e4b\u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6"},"content":{"rendered":"<p>\u56de\u590d\u3001\u3001\u6d88\u606f\u90fd\u662f\u9700\u8981media_id\u7684\uff0c\u8fd9\u4e2a\u662f\u9700\u8981\u5c06\u5230\u5fae\u4fe1\u670d\u52a1\u5668\u624d\u6709\u7684\u3002<\/p>\n<p>\u5c06\u591a\u5a92\u4f53\u6587\u4ef6\u4e0a\u4f20\u5230\u5fae\u4fe1\u670d\u52a1\u5668\uff0c\u4ee5\u53ca\u4ece\u5fae\u4fe1\u670d\u52a1\u5668\u4e0b\u8f7d\u6587\u4ef6\uff0c\u53ef\u4ee5\u53c2\u8003\uff1ahttp:\/\/mp.weixin.qq.com\/wiki\/index.php?title=\u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6<\/p>\n<p>\u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6\u7684\u65b9\u6cd5\u8fd8\u662f\u5199\u5230WeixinUtil.java\u4e2d\u3002<\/p>\n<p>\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<pre>import&nbsp;java.io.BufferedOutputStream;\r\nimport&nbsp;java.io.BufferedReader;\r\nimport&nbsp;java.io.DataInputStream;\r\nimport&nbsp;java.io.DataOutputStream;\r\nimport&nbsp;java.io.File;\r\nimport&nbsp;java.io.FileInputStream;\r\nimport&nbsp;java.io.FileOutputStream;\r\nimport&nbsp;java.io.IOException;\r\nimport&nbsp;java.io.InputStream;\r\nimport&nbsp;java.io.InputStreamReader;\r\nimport&nbsp;java.io.OutputStream;\r\nimport&nbsp;java.net.HttpURLConnection;\r\nimport&nbsp;java.net.MalformedURLException;\r\nimport&nbsp;java.net.URL;\r\nimport&nbsp;java.security.KeyManagementException;\r\nimport&nbsp;java.security.NoSuchAlgorithmException;\r\nimport&nbsp;java.security.NoSuchProviderException;\r\nimport&nbsp;java.security.SecureRandom;\r\nimport&nbsp;java.util.Calendar;\r\nimport&nbsp;java.util.Date;\r\nimport&nbsp;java.util.HashMap;\r\nimport&nbsp;java.util.Map;\r\n&nbsp;\r\nimport&nbsp;javax.net.ssl.HttpsURLConnection;\r\nimport&nbsp;javax.net.ssl.SSLContext;\r\nimport&nbsp;javax.net.ssl.SSLSocketFactory;\r\nimport&nbsp;javax.net.ssl.TrustManager;\r\n&nbsp;\r\nimport&nbsp;net.sf.json.JSONObject;\r\n&nbsp;\r\nimport&nbsp;org.apache.commons.lang.StringUtils;\r\nimport&nbsp;org.apache.log4j.Logger;\r\n&nbsp;\r\nimport&nbsp;com.company.project.model.menu.AccessToken;\r\nimport&nbsp;com.company.project.model.menu.Menu;\r\n&nbsp;\r\npublic&nbsp;class&nbsp;WeixinUtil&nbsp;{\r\n&nbsp;private&nbsp;static&nbsp;Logger&nbsp;log&nbsp;=&nbsp;Logger.getLogger(WeixinUtil.class);\r\n&nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;APPID&nbsp;=&nbsp;\"wxb927d4280e6db674\";\r\n&nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;APP_SECRET&nbsp;=&nbsp;\"21441e9f3226eee81e14380a768b6d1e\";\r\n&nbsp;\/\/&nbsp;\u83b7\u53d6access_token\u7684\u63a5\u53e3\u5730\u5740\uff08GET\uff09&nbsp;\u9650200\uff08\u6b21\/\u5929\uff09\r\n&nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;access_token_url&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;amp;appid=APPID&amp;amp;secret=APPSECRET\";\r\n&nbsp;\/\/&nbsp;\u521b\u5efa\u83dc\u5355\r\n&nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;create_menu_url&nbsp;=&nbsp;\"https:\/\/api.weixin.qq.com\/cgi-bin\/menu\/create?access_token=ACCESS_TOKEN\";\r\n&nbsp;\/\/&nbsp;\u5b58\u653e\uff1a1.token\uff0c2\uff1a\u83b7\u53d6token\u7684\u65f6\u95f4,3.\u8fc7\u671f\u65f6\u95f4\r\n&nbsp;public&nbsp;final&nbsp;static&nbsp;Map&lt;string&gt;&nbsp;accessTokenMap&nbsp;=&nbsp;new&nbsp;HashMap&lt;string&gt;();\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u53d1\u8d77https\u8bf7\u6c42\u5e76\u83b7\u53d6\u7ed3\u679c\r\n&nbsp;*&nbsp;\r\n&nbsp;*&nbsp;@param&nbsp;requestUrl&nbsp;\u8bf7\u6c42\u5730\u5740\r\n&nbsp;*&nbsp;@param&nbsp;requestMethod&nbsp;\u8bf7\u6c42\u65b9\u5f0f\uff08GET\u3001POST\uff09\r\n&nbsp;*&nbsp;@param&nbsp;outputStr&nbsp;\u63d0\u4ea4\u7684\u6570\u636e\r\n&nbsp;*&nbsp;@return&nbsp;JSONObject(\u901a\u8fc7JSONObject.get(key)\u7684\u65b9\u5f0f\u83b7\u53d6json\u5bf9\u8c61\u7684\u5c5e\u6027\u503c)\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;JSONObject&nbsp;handleRequest(String&nbsp;requestUrl,String&nbsp;requestMethod,String&nbsp;outputStr)&nbsp;{\r\n&nbsp;JSONObject&nbsp;jsonObject&nbsp;=&nbsp;null;\r\n&nbsp;&nbsp;\r\n&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;URL&nbsp;url&nbsp;=&nbsp;new&nbsp;URL(requestUrl);\r\n&nbsp;&nbsp;HttpsURLConnection&nbsp;conn&nbsp;=&nbsp;(HttpsURLConnection)&nbsp;url.openConnection();\r\n&nbsp;&nbsp;SSLContext&nbsp;ctx&nbsp;=&nbsp;SSLContext.getInstance(\"SSL\",&nbsp;\"SunJSSE\");\r\n&nbsp;&nbsp;TrustManager[]&nbsp;tm&nbsp;=&nbsp;{new&nbsp;MyX509TrustManager()};\r\n&nbsp;&nbsp;ctx.init(null,&nbsp;tm,&nbsp;new&nbsp;SecureRandom());\r\n&nbsp;&nbsp;SSLSocketFactory&nbsp;sf&nbsp;=&nbsp;ctx.getSocketFactory();\r\n&nbsp;&nbsp;conn.setSSLSocketFactory(sf);\r\n&nbsp;&nbsp;conn.setDoInput(true);\r\n&nbsp;&nbsp;conn.setDoOutput(true);\r\n&nbsp;&nbsp;conn.setRequestMethod(requestMethod);\r\n&nbsp;&nbsp;conn.setUseCaches(false);\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;if&nbsp;(\"GET\".equalsIgnoreCase(requestMethod))&nbsp;{\r\n&nbsp;&nbsp;conn.connect();\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;if&nbsp;(StringUtils.isNotEmpty(outputStr))&nbsp;{\r\n&nbsp;&nbsp;OutputStream&nbsp;out&nbsp;=&nbsp;conn.getOutputStream();\r\n&nbsp;&nbsp;out.write(outputStr.getBytes(\"utf-8\"));\r\n&nbsp;&nbsp;out.close();\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;InputStream&nbsp;in&nbsp;=&nbsp;conn.getInputStream();\r\n&nbsp;&nbsp;BufferedReader&nbsp;br&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(in,\"utf-8\"));\r\n&nbsp;&nbsp;StringBuffer&nbsp;buffer&nbsp;=&nbsp;new&nbsp;StringBuffer();\r\n&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;null;\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;br.readLine())&nbsp;!=&nbsp;null)&nbsp;{\r\n&nbsp;&nbsp;buffer.append(line);\r\n&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;in.close();\r\n&nbsp;&nbsp;conn.disconnect();\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;jsonObject&nbsp;=&nbsp;JSONObject.fromObject(buffer.toString());\r\n&nbsp;}&nbsp;catch&nbsp;(MalformedURLException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;&nbsp;log.error(\"URL\u9519\u8bef\uff01\");\r\n&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;}&nbsp;catch&nbsp;(NoSuchAlgorithmException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;}&nbsp;catch&nbsp;(NoSuchProviderException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;}&nbsp;catch&nbsp;(KeyManagementException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;}\r\n&nbsp;return&nbsp;jsonObject;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u83b7\u53d6access_token\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;9:56:43&nbsp;AM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;AccessToken&nbsp;getAccessToken(String&nbsp;appid,String&nbsp;appSecret)&nbsp;{\r\n&nbsp;AccessToken&nbsp;at&nbsp;=&nbsp;new&nbsp;AccessToken();\r\n&nbsp;\/\/&nbsp;\u6bcf\u6b21\u83b7\u53d6access_token\u65f6\uff0c\u5148\u4eceaccessTokenMap\u83b7\u53d6\uff0c\u5982\u679c\u8fc7\u671f\u4e86\u5c31\u91cd\u65b0\u4ece\u5fae\u4fe1\u83b7\u53d6\r\n&nbsp;\/\/&nbsp;\u6ca1\u6709\u8fc7\u671f\u76f4\u63a5\u8fd4\u56de\r\n&nbsp;\/\/&nbsp;\u4ece\u5fae\u4fe1\u83b7\u53d6\u7684token\u7684\u6709\u6548\u671f\u4e3a2\u4e2a\u5c0f\u65f6\r\n&nbsp;if&nbsp;(!accessTokenMap.isEmpty())&nbsp;{\r\n&nbsp;&nbsp;Date&nbsp;getTokenTime&nbsp;=&nbsp;(Date)&nbsp;accessTokenMap.get(\"getTokenTime\");\r\n&nbsp;&nbsp;Calendar&nbsp;c&nbsp;=&nbsp;Calendar.getInstance();\r\n&nbsp;&nbsp;c.setTime(getTokenTime);\r\n&nbsp;&nbsp;c.add(Calendar.HOUR_OF_DAY,&nbsp;2);\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;getTokenTime&nbsp;=&nbsp;c.getTime();\r\n&nbsp;&nbsp;if&nbsp;(getTokenTime.after(new&nbsp;Date()))&nbsp;{\r\n&nbsp;&nbsp;log.info(\"\u7f13\u5b58\u4e2d\u53d1\u73b0token\u672a\u8fc7\u671f\uff0c\u76f4\u63a5\u4ece\u7f13\u5b58\u4e2d\u83b7\u53d6access_token\");\r\n&nbsp;&nbsp;\/\/&nbsp;token\u672a\u8fc7\u671f\uff0c\u76f4\u63a5\u4ece\u7f13\u5b58\u83b7\u53d6\u8fd4\u56de\r\n&nbsp;&nbsp;String&nbsp;token&nbsp;=&nbsp;(String)&nbsp;accessTokenMap.get(\"token\");\r\n&nbsp;&nbsp;Integer&nbsp;expire&nbsp;=&nbsp;(Integer)&nbsp;accessTokenMap.get(\"expire\");\r\n&nbsp;&nbsp;at.setToken(token);\r\n&nbsp;&nbsp;at.setExpiresIn(expire);\r\n&nbsp;&nbsp;return&nbsp;at;\r\n&nbsp;&nbsp;}\r\n&nbsp;}\r\n&nbsp;String&nbsp;requestUrl&nbsp;=&nbsp;access_token_url.replace(\"APPID\",&nbsp;appid).replace(\"APPSECRET\",&nbsp;appSecret);\r\n&nbsp;&nbsp;\r\n&nbsp;JSONObject&nbsp;object&nbsp;=&nbsp;handleRequest(requestUrl,&nbsp;\"GET\",&nbsp;null);\r\n&nbsp;String&nbsp;access_token&nbsp;=&nbsp;object.getString(\"access_token\");\r\n&nbsp;int&nbsp;expires_in&nbsp;=&nbsp;object.getInt(\"expires_in\");\r\n&nbsp;&nbsp;\r\n&nbsp;log.info(\"\naccess_token:\"&nbsp;+&nbsp;access_token);\r\n&nbsp;log.info(\"\nexpires_in:\"&nbsp;+&nbsp;expires_in);\r\n&nbsp;&nbsp;\r\n&nbsp;at.setToken(access_token);\r\n&nbsp;at.setExpiresIn(expires_in);\r\n&nbsp;&nbsp;\r\n&nbsp;\/\/&nbsp;\u6bcf\u6b21\u83b7\u53d6access_token\u540e\uff0c\u5b58\u5165accessTokenMap\r\n&nbsp;\/\/&nbsp;\u4e0b\u6b21\u83b7\u53d6\u65f6\uff0c\u5982\u679c\u6ca1\u6709\u8fc7\u671f\u76f4\u63a5\u4eceaccessTokenMap\u53d6\u3002\r\n&nbsp;accessTokenMap.put(\"getTokenTime\",&nbsp;new&nbsp;Date());\r\n&nbsp;accessTokenMap.put(\"token\",&nbsp;access_token);\r\n&nbsp;accessTokenMap.put(\"expire\",&nbsp;expires_in);\r\n&nbsp;&nbsp;\r\n&nbsp;return&nbsp;at;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u521b\u5efa\u83dc\u5355\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;9:56:36&nbsp;AM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;boolean&nbsp;createMenu(Menu&nbsp;menu,String&nbsp;accessToken)&nbsp;{\r\n&nbsp;String&nbsp;requestUrl&nbsp;=&nbsp;create_menu_url.replace(\"ACCESS_TOKEN\",&nbsp;accessToken);\r\n&nbsp;String&nbsp;menuJsonString&nbsp;=&nbsp;JSONObject.fromObject(menu).toString();\r\n&nbsp;JSONObject&nbsp;jsonObject&nbsp;=&nbsp;handleRequest(requestUrl,&nbsp;\"POST\",&nbsp;menuJsonString);\r\n&nbsp;String&nbsp;errorCode&nbsp;=&nbsp;jsonObject.getString(\"errcode\");\r\n&nbsp;if&nbsp;(!\"0\".equals(errorCode))&nbsp;{\r\n&nbsp;&nbsp;log.error(String.format(\"\u83dc\u5355\u521b\u5efa\u5931\u8d25\uff01errorCode:%d,errorMsg:%s\",jsonObject.getInt(\"errcode\"),jsonObject.getString(\"errmsg\")));\r\n&nbsp;&nbsp;return&nbsp;false;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;log.info(\"\u83dc\u5355\u521b\u5efa\u6210\u529f\uff01\");\r\n&nbsp;&nbsp;\r\n&nbsp;return&nbsp;true;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;\/\/&nbsp;\u4e0a\u4f20\u591a\u5a92\u4f53\u6587\u4ef6\u5230\u5fae\u4fe1\u670d\u52a1\u5668\r\n&nbsp;public&nbsp;static&nbsp;final&nbsp;String&nbsp;upload_media_url&nbsp;=&nbsp;\"http:\/\/file.api.weixin.qq.com\/cgi-bin\/media\/upload?access_token=ACCESS_TOKEN&amp;amp;type=TYPE\";\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u4e0a\u4f20\u591a\u5a92\u4f53\u6587\u4ef6\u5230\u5fae\u4fe1\u670d\u52a1\u5668&lt;br&gt;\r\n&nbsp;*&nbsp;@see&nbsp;http:\/\/www.oschina.net\/code\/snippet_1029535_23824\r\n&nbsp;*&nbsp;@see&nbsp;http:\/\/mp.weixin.qq.com\/wiki\/index.php?title=\u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;4:11:22&nbsp;PM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;JSONObject&nbsp;uploadMediaToWX(String&nbsp;filePath,String&nbsp;type,String&nbsp;accessToken)&nbsp;throws&nbsp;IOException{\r\n&nbsp;File&nbsp;file&nbsp;=&nbsp;new&nbsp;File(filePath);\r\n&nbsp;if&nbsp;(!file.exists())&nbsp;{\r\n&nbsp;&nbsp;log.error(\"\u6587\u4ef6\u4e0d\u5b58\u5728\uff01\");\r\n&nbsp;&nbsp;return&nbsp;null;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;String&nbsp;url&nbsp;=&nbsp;upload_media_url.replace(\"ACCESS_TOKEN\",&nbsp;accessToken).replace(\"TYPE\",&nbsp;type);\r\n&nbsp;URL&nbsp;urlObj&nbsp;=&nbsp;new&nbsp;URL(url);\r\n&nbsp;HttpURLConnection&nbsp;conn&nbsp;=&nbsp;(HttpURLConnection)&nbsp;urlObj.openConnection();\r\n&nbsp;conn.setDoInput(true);\r\n&nbsp;conn.setDoOutput(true);\r\n&nbsp;conn.setUseCaches(false);\r\n&nbsp;&nbsp;\r\n&nbsp;conn.setRequestProperty(\"Connection\",&nbsp;\"Keep-Alive\");\r\n&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty(\"Charset\",&nbsp;\"UTF-8\");\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u8bbe\u7f6e\u8fb9\u754c\r\n&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;BOUNDARY&nbsp;=&nbsp;\"----------\"&nbsp;+&nbsp;System.currentTimeMillis();\r\n&nbsp;&nbsp;&nbsp;&nbsp;conn.setRequestProperty(\"Content-Type\",&nbsp;\"multipart\/form-data;&nbsp;boundary=\"\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;BOUNDARY);\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u8bf7\u6c42\u6b63\u6587\u4fe1\u606f\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u7b2c\u4e00\u90e8\u5206\uff1a\r\n&nbsp;&nbsp;&nbsp;&nbsp;StringBuilder&nbsp;sb&nbsp;=&nbsp;new&nbsp;StringBuilder();\r\n&nbsp;&nbsp;&nbsp;&nbsp;sb.append(\"--\");&nbsp;\/\/&nbsp;\/\/\/\/\/\/\/\/\u5fc5\u987b\u591a\u4e24\u9053\u7ebf\r\n&nbsp;&nbsp;&nbsp;&nbsp;sb.append(BOUNDARY);\r\n&nbsp;&nbsp;&nbsp;&nbsp;sb.append(\"\r\n\");\r\n&nbsp;&nbsp;&nbsp;&nbsp;sb.append(\"Content-Disposition:&nbsp;form-data;name=\"file\";filename=\"\"\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;+&nbsp;file.getName()&nbsp;+&nbsp;\"\"\r\n\");\r\n&nbsp;&nbsp;&nbsp;&nbsp;sb.append(\"Content-Type:application\/octet-stream\r\n\r\n\");\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;head&nbsp;=&nbsp;sb.toString().getBytes(\"utf-8\");\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u83b7\u5f97\u8f93\u51fa\u6d41\r\n&nbsp;&nbsp;&nbsp;&nbsp;OutputStream&nbsp;out&nbsp;=&nbsp;new&nbsp;DataOutputStream(conn.getOutputStream());\r\n&nbsp;&nbsp;&nbsp;&nbsp;out.write(head);\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u6587\u4ef6\u6b63\u6587\u90e8\u5206\r\n&nbsp;&nbsp;&nbsp;&nbsp;DataInputStream&nbsp;in&nbsp;=&nbsp;new&nbsp;DataInputStream(new&nbsp;FileInputStream(file));\r\n&nbsp;&nbsp;&nbsp;&nbsp;int&nbsp;bytes&nbsp;=&nbsp;0;\r\n&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;bufferOut&nbsp;=&nbsp;new&nbsp;byte[1024];\r\n&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((bytes&nbsp;=&nbsp;in.read(bufferOut))&nbsp;!=&nbsp;-1)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;out.write(bufferOut,&nbsp;0,&nbsp;bytes);\r\n&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;in.close();\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u7ed3\u5c3e\u90e8\u5206\r\n&nbsp;&nbsp;&nbsp;&nbsp;byte[]&nbsp;foot&nbsp;=&nbsp;(\"\r\n--\"&nbsp;+&nbsp;BOUNDARY&nbsp;+&nbsp;\"--\r\n\").getBytes(\"utf-8\");\/\/&nbsp;\u5b9a\u4e49\u6700\u540e\u6570\u636e\u5206\u9694\u7ebf\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;out.write(foot);\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;out.flush();\r\n&nbsp;&nbsp;&nbsp;&nbsp;out.close();\r\n&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;\/**\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*&nbsp;\u8bfb\u53d6\u670d\u52a1\u5668\u54cd\u5e94\uff0c\u5fc5\u987b\u8bfb\u53d6,\u5426\u5219\u63d0\u4ea4\u4e0d\u6210\u529f\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*\/\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\/\/&nbsp;\u5b9a\u4e49BufferedReader\u8f93\u5165\u6d41\u6765\u8bfb\u53d6URL\u7684\u54cd\u5e94\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;StringBuffer&nbsp;buffer&nbsp;=&nbsp;new&nbsp;StringBuffer();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedReader&nbsp;reader&nbsp;=&nbsp;new&nbsp;BufferedReader(new&nbsp;InputStreamReader(\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.getInputStream()));\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;String&nbsp;line&nbsp;=&nbsp;null;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while&nbsp;((line&nbsp;=&nbsp;reader.readLine())&nbsp;!=&nbsp;null)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;buffer.append(line);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reader.close();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;conn.disconnect();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;JSONObject.fromObject(buffer.toString());\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;catch&nbsp;(Exception&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;log.error(\"\u53d1\u9001POST\u8bf7\u6c42\u51fa\u73b0\u5f02\u5e38\uff01\"&nbsp;+&nbsp;e);\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}\r\n&nbsp;return&nbsp;null;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;public&nbsp;static&nbsp;final&nbsp;String&nbsp;download_media_url&nbsp;=&nbsp;\"http:\/\/file.api.weixin.qq.com\/cgi-bin\/media\/get?access_token=ACCESS_TOKEN&amp;amp;media_id=MEDIA_ID\";\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u4ece\u5fae\u4fe1\u670d\u52a1\u5668\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;4:32:12&nbsp;PM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;String&nbsp;downloadMediaFromWx(String&nbsp;accessToken,String&nbsp;mediaId,String&nbsp;fileSavePath)&nbsp;throws&nbsp;IOException&nbsp;{\r\n&nbsp;if&nbsp;(StringUtils.isEmpty(accessToken)&nbsp;||&nbsp;StringUtils.isEmpty(mediaId))&nbsp;return&nbsp;null;\r\n&nbsp;&nbsp;\r\n&nbsp;String&nbsp;requestUrl&nbsp;=&nbsp;download_media_url.replace(\"ACCESS_TOKEN\",&nbsp;accessToken).replace(\"MEDIA_ID\",&nbsp;mediaId);\r\n&nbsp;URL&nbsp;url&nbsp;=&nbsp;new&nbsp;URL(requestUrl);\r\n&nbsp;HttpURLConnection&nbsp;conn&nbsp;=&nbsp;(HttpURLConnection)&nbsp;url.openConnection();\r\n&nbsp;conn.setRequestMethod(\"GET\");\r\n&nbsp;conn.setDoInput(true);\r\n&nbsp;conn.setDoOutput(true);\r\n&nbsp;InputStream&nbsp;in&nbsp;=&nbsp;conn.getInputStream();\r\n&nbsp;&nbsp;\r\n&nbsp;File&nbsp;dir&nbsp;=&nbsp;new&nbsp;File(fileSavePath);\r\n&nbsp;if&nbsp;(!dir.exists())&nbsp;{\r\n&nbsp;&nbsp;dir.mkdirs();\r\n&nbsp;}\r\n&nbsp;if&nbsp;(!fileSavePath.endsWith(\"\/\"))&nbsp;{\r\n&nbsp;&nbsp;fileSavePath&nbsp;+=&nbsp;\"\/\";\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;String&nbsp;ContentDisposition&nbsp;=&nbsp;conn.getHeaderField(\"Content-disposition\");\r\n&nbsp;String&nbsp;weixinServerFileName&nbsp;=&nbsp;ContentDisposition.substring(ContentDisposition.indexOf(\"filename\")+10,&nbsp;ContentDisposition.length()&nbsp;-1);\r\n&nbsp;fileSavePath&nbsp;+=&nbsp;weixinServerFileName;&nbsp;\r\n&nbsp;BufferedOutputStream&nbsp;bos&nbsp;=&nbsp;new&nbsp;BufferedOutputStream(new&nbsp;FileOutputStream(fileSavePath));\r\n&nbsp;byte[]&nbsp;data&nbsp;=&nbsp;new&nbsp;byte[1024];\r\n&nbsp;int&nbsp;len&nbsp;=&nbsp;-1;\r\n&nbsp;&nbsp;\r\n&nbsp;while&nbsp;((len&nbsp;=&nbsp;in.read(data))&nbsp;!=&nbsp;-1)&nbsp;{\r\n&nbsp;&nbsp;bos.write(data,0,len);\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;bos.close();\r\n&nbsp;in.close();\r\n&nbsp;conn.disconnect();\r\n&nbsp;&nbsp;\r\n&nbsp;return&nbsp;fileSavePath;\r\n&nbsp;}\r\n}&lt;\/string&gt;&lt;\/string&gt;<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u6d4b\u8bd5\u4ee3\u7801\uff1a<\/p>\n<p><span>\u7acb\u5373\u5b66\u4e60<\/span>\u201c\u201d\uff1b<\/p>\n<pre>public&nbsp;class&nbsp;WeixinUtilTest&nbsp;{\r\n&nbsp;\r\n&nbsp;\/**\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;9:57:54&nbsp;AM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;void&nbsp;main(String[]&nbsp;args)&nbsp;{\r\n&nbsp;\/\/&nbsp;1).\u83b7\u53d6access_token\r\n&nbsp;AccessToken&nbsp;accessToken&nbsp;=&nbsp;WeixinUtil.getAccessToken(WeixinUtil.APPID,&nbsp;WeixinUtil.APP_SECRET);\r\n&nbsp;String&nbsp;filePath&nbsp;=&nbsp;\"C:\\Users\\qince\\Pictures\\\u58c1\u7eb820141029091612.jpg\";\r\n&nbsp;JSONObject&nbsp;uploadJsonObj&nbsp;=&nbsp;testUploadMedia(filePath,\"image\",accessToken.getToken());\r\n&nbsp;if&nbsp;(uploadJsonObj&nbsp;==&nbsp;null)&nbsp;{\r\n&nbsp;&nbsp;System.out.println(\"\u4e0a\u4f20\u56fe\u7247\u5931\u8d25\");\r\n&nbsp;&nbsp;return;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;int&nbsp;errcode&nbsp;=&nbsp;0;\r\n&nbsp;if&nbsp;(uploadJsonObj.containsKey(\"errcode\"))&nbsp;{\r\n&nbsp;&nbsp;errcode&nbsp;=&nbsp;uploadJsonObj.getInt(\"errcode\");\r\n&nbsp;}\r\n&nbsp;if&nbsp;(errcode&nbsp;==&nbsp;0)&nbsp;{\r\n&nbsp;&nbsp;System.out.println(\"\u56fe\u7247\u4e0a\u4f20\u6210\u529f\");\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;String&nbsp;mediaId&nbsp;=&nbsp;uploadJsonObj.getString(\"media_id\");\r\n&nbsp;&nbsp;long&nbsp;createAt&nbsp;=&nbsp;uploadJsonObj.getLong(\"created_at\");\r\n&nbsp;&nbsp;System.out.println(\"--Details:\");\r\n&nbsp;&nbsp;System.out.println(\"media_id:\"&nbsp;+&nbsp;mediaId);\r\n&nbsp;&nbsp;System.out.println(\"created_at:\"&nbsp;+&nbsp;createAt);\r\n&nbsp;}\r\n&nbsp;else&nbsp;{\r\n&nbsp;&nbsp;System.out.println(\"\u56fe\u7247\u4e0a\u4f20\u5931\u8d25\uff01\");\r\n&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;String&nbsp;errmsg&nbsp;=&nbsp;uploadJsonObj.getString(\"errmsg\");\r\n&nbsp;&nbsp;System.out.println(\"--Details:\");\r\n&nbsp;&nbsp;System.out.println(\"errcode:\"&nbsp;+&nbsp;errcode);\r\n&nbsp;&nbsp;System.out.println(\"errmsg:\"&nbsp;+&nbsp;errmsg);\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;String&nbsp;mediaId&nbsp;=&nbsp;\"6W-UvSrQ2hkdSdVQJJXShwtFDPLfbGI1qnbNFy8weZyb9Jac2xxxcAUwt8p4sYPH\";\r\n&nbsp;String&nbsp;filepath&nbsp;=&nbsp;testDownloadMedia(accessToken.getToken(),&nbsp;mediaId,&nbsp;\"d:\/test\");\r\n&nbsp;System.out.println(filepath);\r\n&nbsp;}\r\n&nbsp;\r\n&nbsp;\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u4e0a\u4f20\u591a\u5a92\u4f53\u6587\u4ef6\u5230\u5fae\u4fe1\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;4:15:14&nbsp;PM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;JSONObject&nbsp;testUploadMedia(String&nbsp;filePath,String&nbsp;type,String&nbsp;accessToken)&nbsp;{\r\n&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;return&nbsp;WeixinUtil.uploadMediaToWX(filePath,&nbsp;type,&nbsp;accessToken);\r\n&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;return&nbsp;null;\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;\/**\r\n&nbsp;*&nbsp;\u4ece\u5fae\u4fe1\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6\r\n&nbsp;*\r\n&nbsp;*&nbsp;@author&nbsp;qincd\r\n&nbsp;*&nbsp;@date&nbsp;Nov&nbsp;6,&nbsp;2014&nbsp;4:56:25&nbsp;PM\r\n&nbsp;*\/\r\n&nbsp;public&nbsp;static&nbsp;String&nbsp;testDownloadMedia(String&nbsp;accessToken,String&nbsp;mediaId,String&nbsp;fileSaveDir)&nbsp;{\r\n&nbsp;try&nbsp;{\r\n&nbsp;&nbsp;return&nbsp;WeixinUtil.downloadMediaFromWx(accessToken,&nbsp;mediaId,&nbsp;fileSaveDir);\r\n&nbsp;}&nbsp;catch&nbsp;(IOException&nbsp;e)&nbsp;{\r\n&nbsp;&nbsp;e.printStackTrace();\r\n&nbsp;}\r\n&nbsp;&nbsp;\r\n&nbsp;return&nbsp;null;\r\n&nbsp;}\r\n}<\/pre>\n<p> \u767b\u5f55\u540e\u590d\u5236 <\/p>\n<p>\u4ee5\u4e0a\u5c31\u662fjava\u5fae\u4fe1\u5f00\u53d1\u4e4b\u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6\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>\u56de\u590d\u3001\u3001\u6d88\u606f\u90fd\u662f\u9700\u8981media_id\u7684\uff0c\u8fd9\u4e2a\u662f\u9700\u8981\u5c06\u5230\u5fae\u4fe1\u670d\u52a1\u5668\u624d\u6709\u7684\u3002 \u5c06\u591a\u5a92\u4f53\u6587\u4ef6\u4e0a\u4f20\u5230\u5fae\u4fe1\u670d\u52a1\u5668\uff0c\u4ee5\u53ca\u4ece\u5fae\u4fe1\u670d\u52a1\u5668\u4e0b\u8f7d\u6587\u4ef6\uff0c\u53ef\u4ee5\u53c2\u8003\uff1ahttp:\/\/mp.weixin.qq.com\/wiki\/index.php?title=\u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6 \u4e0a\u4f20\u4e0b\u8f7d\u591a\u5a92\u4f53\u6587\u4ef6\u7684\u65b9\u6cd5\u8fd8\u662f\u5199\u5230WeixinUtil.java\u4e2d\u3002 \u4ee3\u7801\u5982\u4e0b\uff1a import&nbsp;java.io.BufferedOutputStream; import&nbsp;java.io.BufferedReader; import&nbsp;java.io.DataInputStream; import&nbsp;java.io.DataOutputStream; import&nbsp;java.io.File; import&nbsp;java.io.FileInputStream; import&nbsp;java.io.FileOutputStream; import&nbsp;java.io.IOException; import&nbsp;java.io.InputStream; import&nbsp;java.io.InputStreamReader; import&nbsp;java.io.OutputStream; import&nbsp;java.net.HttpURLConnection; import&nbsp;java.net.MalformedURLException; import&nbsp;java.net.URL; import&nbsp;java.security.KeyManagementException; import&nbsp;java.security.NoSuchAlgorithmException; import&nbsp;java.security.NoSuchProviderException; import&nbsp;java.security.SecureRandom; import&nbsp;java.util.Calendar; import&nbsp;java.util.Date; import&nbsp;java.util.HashMap; import&nbsp;java.util.Map; &nbsp; import&nbsp;javax.net.ssl.HttpsURLConnection; import&nbsp;javax.net.ssl.SSLContext; import&nbsp;javax.net.ssl.SSLSocketFactory; import&nbsp;javax.net.ssl.TrustManager; &nbsp; import&nbsp;net.sf.json.JSONObject; &nbsp; import&nbsp;org.apache.commons.lang.StringUtils; import&nbsp;org.apache.log4j.Logger; &nbsp; import&nbsp;com.company.project.model.menu.AccessToken; import&nbsp;com.company.project.model.menu.Menu; &nbsp; public&nbsp;class&nbsp;WeixinUtil&nbsp;{ &nbsp;private&nbsp;static&nbsp;Logger&nbsp;log&nbsp;=&nbsp;Logger.getLogger(WeixinUtil.class); &nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;APPID&nbsp;=&nbsp;&#8220;wxb927d4280e6db674&#8221;; &nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;APP_SECRET&nbsp;=&nbsp;&#8220;21441e9f3226eee81e14380a768b6d1e&#8221;; &nbsp;\/\/&nbsp;\u83b7\u53d6access_token\u7684\u63a5\u53e3\u5730\u5740\uff08GET\uff09&nbsp;\u9650200\uff08\u6b21\/\u5929\uff09 &nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;access_token_url&nbsp;=&nbsp;&#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/token?grant_type=client_credential&amp;amp;appid=APPID&amp;amp;secret=APPSECRET&#8221;; &nbsp;\/\/&nbsp;\u521b\u5efa\u83dc\u5355 &nbsp;public&nbsp;final&nbsp;static&nbsp;String&nbsp;create_menu_url&nbsp;=&nbsp;&#8220;https:\/\/api.weixin.qq.com\/cgi-bin\/menu\/create?access_token=ACCESS_TOKEN&#8221;; &nbsp;\/\/&nbsp;\u5b58\u653e\uff1a1.token\uff0c2\uff1a\u83b7\u53d6token\u7684\u65f6\u95f4,3.\u8fc7\u671f\u65f6\u95f4 &nbsp;public&nbsp;final&nbsp;static&nbsp;Map&lt;string&gt;&nbsp;accessTokenMap&nbsp;=&nbsp;new&nbsp;HashMap&lt;string&gt;(); &nbsp;\/** &nbsp;*&nbsp;\u53d1\u8d77https\u8bf7\u6c42\u5e76\u83b7\u53d6\u7ed3\u679c &nbsp;*&nbsp; &nbsp;*&nbsp;@param&nbsp;requestUrl&nbsp;\u8bf7\u6c42\u5730\u5740 &nbsp;*&nbsp;@param&nbsp;requestMethod&nbsp;\u8bf7\u6c42\u65b9\u5f0f\uff08GET\u3001POST\uff09 [&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-29036","post","type-post","status-publish","format-standard","hentry","category-19"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29036","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=29036"}],"version-history":[{"count":0,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/29036\/revisions"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=29036"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=29036"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=29036"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}