Rumah pembangunan bahagian belakang tutorial php java微信开发之上传下载多媒体文件_php实例

java微信开发之上传下载多媒体文件_php实例

Jul 06, 2016 pm 01:32 PM
java WeChat

回复图片、音频、视频消息都是需要media_id的,这个是需要将多媒体文件上传到微信服务器才有的。

将多媒体文件上传到微信服务器,以及从微信服务器下载文件,可以参考:http://mp.weixin.qq.com/wiki/index.php?title=上传下载多媒体文件

上传下载多媒体文件的方法还是写到WeixinUtil.java中。

代码如下:

import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import java.security.SecureRandom;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;

import net.sf.json.JSONObject;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;

import com.company.project.model.menu.AccessToken;
import com.company.project.model.menu.Menu;

public class WeixinUtil {
 private static Logger log = Logger.getLogger(WeixinUtil.class);
 public final static String APPID = "wxb927d4280e6db674";
 public final static String APP_SECRET = "21441e9f3226eee81e14380a768b6d1e";
 // 获取access_token的接口地址(GET) 限200(次/天)
 public final static String access_token_url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET";
 // 创建菜单
 public final static String create_menu_url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=ACCESS_TOKEN";
 // 存放:1.token,2:获取token的时间,3.过期时间
 public final static Map<String,Object> accessTokenMap = new HashMap<String,Object>();
 /**
 * 发起https请求并获取结果
 * 
 * @param requestUrl 请求地址
 * @param requestMethod 请求方式(GET、POST)
 * @param outputStr 提交的数据
 * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
 */
 public static JSONObject handleRequest(String requestUrl,String requestMethod,String outputStr) {
 JSONObject jsonObject = null;
 
 try {
  URL url = new URL(requestUrl);
  HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
  SSLContext ctx = SSLContext.getInstance("SSL", "SunJSSE");
  TrustManager[] tm = {new MyX509TrustManager()};
  ctx.init(null, tm, new SecureRandom());
  SSLSocketFactory sf = ctx.getSocketFactory();
  conn.setSSLSocketFactory(sf);
  conn.setDoInput(true);
  conn.setDoOutput(true);
  conn.setRequestMethod(requestMethod);
  conn.setUseCaches(false);
  
  if ("GET".equalsIgnoreCase(requestMethod)) {
  conn.connect();
  }
  
  if (StringUtils.isNotEmpty(outputStr)) {
  OutputStream out = conn.getOutputStream();
  out.write(outputStr.getBytes("utf-8"));
  out.close();
  }
  
  InputStream in = conn.getInputStream();
  BufferedReader br = new BufferedReader(new InputStreamReader(in,"utf-8"));
  StringBuffer buffer = new StringBuffer();
  String line = null;
  
  while ((line = br.readLine()) != null) {
  buffer.append(line);
  }
  
  in.close();
  conn.disconnect();
  
  jsonObject = JSONObject.fromObject(buffer.toString());
 } catch (MalformedURLException e) {
  e.printStackTrace();
  log.error("URL错误!");
 } catch (IOException e) {
  e.printStackTrace();
 } catch (NoSuchAlgorithmException e) {
  e.printStackTrace();
 } catch (NoSuchProviderException e) {
  e.printStackTrace();
 } catch (KeyManagementException e) {
  e.printStackTrace();
 }
 return jsonObject;
 }
 
 /**
 * 获取access_token
 *
 * @author qincd
 * @date Nov 6, 2014 9:56:43 AM
 */
 public static AccessToken getAccessToken(String appid,String appSecret) {
 AccessToken at = new AccessToken();
 // 每次获取access_token时,先从accessTokenMap获取,如果过期了就重新从微信获取
 // 没有过期直接返回
 // 从微信获取的token的有效期为2个小时
 if (!accessTokenMap.isEmpty()) {
  Date getTokenTime = (Date) accessTokenMap.get("getTokenTime");
  Calendar c = Calendar.getInstance();
  c.setTime(getTokenTime);
  c.add(Calendar.HOUR_OF_DAY, 2);
  
  getTokenTime = c.getTime();
  if (getTokenTime.after(new Date())) {
  log.info("缓存中发现token未过期,直接从缓存中获取access_token");
  // token未过期,直接从缓存获取返回
  String token = (String) accessTokenMap.get("token");
  Integer expire = (Integer) accessTokenMap.get("expire");
  at.setToken(token);
  at.setExpiresIn(expire);
  return at;
  }
 }
 String requestUrl = access_token_url.replace("APPID", appid).replace("APPSECRET", appSecret);
 
 JSONObject object = handleRequest(requestUrl, "GET", null);
 String access_token = object.getString("access_token");
 int expires_in = object.getInt("expires_in");
 
 log.info("\naccess_token:" + access_token);
 log.info("\nexpires_in:" + expires_in);
 
 at.setToken(access_token);
 at.setExpiresIn(expires_in);
 
 // 每次获取access_token后,存入accessTokenMap
 // 下次获取时,如果没有过期直接从accessTokenMap取。
 accessTokenMap.put("getTokenTime", new Date());
 accessTokenMap.put("token", access_token);
 accessTokenMap.put("expire", expires_in);
 
 return at;
 }
 
 /**
 * 创建菜单
 *
 * @author qincd
 * @date Nov 6, 2014 9:56:36 AM
 */
 public static boolean createMenu(Menu menu,String accessToken) {
 String requestUrl = create_menu_url.replace("ACCESS_TOKEN", accessToken);
 String menuJsonString = JSONObject.fromObject(menu).toString();
 JSONObject jsonObject = handleRequest(requestUrl, "POST", menuJsonString);
 String errorCode = jsonObject.getString("errcode");
 if (!"0".equals(errorCode)) {
  log.error(String.format("菜单创建失败!errorCode:%d,errorMsg:%s",jsonObject.getInt("errcode"),jsonObject.getString("errmsg")));
  return false;
 }
 
 log.info("菜单创建成功!");
 
 return true;
 }
 
 // 上传多媒体文件到微信服务器
 public static final String upload_media_url = "http://file.api.weixin.qq.com/cgi-bin/media/upload&#63;access_token=ACCESS_TOKEN&type=TYPE";
 /**
 * 上传多媒体文件到微信服务器<br>
 * @see http://www.oschina.net/code/snippet_1029535_23824
 * @see http://mp.weixin.qq.com/wiki/index.php&#63;title=上传下载多媒体文件
 *
 * @author qincd
 * @date Nov 6, 2014 4:11:22 PM
 */
 public static JSONObject uploadMediaToWX(String filePath,String type,String accessToken) throws IOException{
 File file = new File(filePath);
 if (!file.exists()) {
  log.error("文件不存在!");
  return null;
 }
 
 String url = upload_media_url.replace("ACCESS_TOKEN", accessToken).replace("TYPE", type);
 URL urlObj = new URL(url);
 HttpURLConnection conn = (HttpURLConnection) urlObj.openConnection();
 conn.setDoInput(true);
 conn.setDoOutput(true);
 conn.setUseCaches(false);
 
 conn.setRequestProperty("Connection", "Keep-Alive");
    conn.setRequestProperty("Charset", "UTF-8");
 
    // 设置边界
    String BOUNDARY = "----------" + System.currentTimeMillis();
    conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="
        + BOUNDARY);
 
    // 请求正文信息
 
    // 第一部分:
    StringBuilder sb = new StringBuilder();
    sb.append("--"); // ////////必须多两道线
    sb.append(BOUNDARY);
    sb.append("\r\n");
    sb.append("Content-Disposition: form-data;name=\"file\";filename=\""
        + file.getName() + "\"\r\n");
    sb.append("Content-Type:application/octet-stream\r\n\r\n");
 
    byte[] head = sb.toString().getBytes("utf-8");
 
    // 获得输出流
    OutputStream out = new DataOutputStream(conn.getOutputStream());
    out.write(head);
 
    // 文件正文部分
    DataInputStream in = new DataInputStream(new FileInputStream(file));
    int bytes = 0;
    byte[] bufferOut = new byte[1024];
    while ((bytes = in.read(bufferOut)) != -1) {
      out.write(bufferOut, 0, bytes);
    }
    in.close();
 
    // 结尾部分
    byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线
 
    out.write(foot);
 
    out.flush();
    out.close();
 
    /**
     * 读取服务器响应,必须读取,否则提交不成功
     */
     try {
     // 定义BufferedReader输入流来读取URL的响应
     StringBuffer buffer = new StringBuffer();
     BufferedReader reader = new BufferedReader(new InputStreamReader(
     conn.getInputStream()));
     String line = null;
     while ((line = reader.readLine()) != null) {
      buffer.append(line);
     }
     
     reader.close();
     conn.disconnect();
     
     return JSONObject.fromObject(buffer.toString());
     } catch (Exception e) {
     log.error("发送POST请求出现异常!" + e);
     e.printStackTrace();
     }
 return null;
 }
 
 public static final String download_media_url = "http://file.api.weixin.qq.com/cgi-bin/media/get&#63;access_token=ACCESS_TOKEN&media_id=MEDIA_ID";
 /**
 * 从微信服务器下载多媒体文件
 *
 * @author qincd
 * @date Nov 6, 2014 4:32:12 PM
 */
 public static String downloadMediaFromWx(String accessToken,String mediaId,String fileSavePath) throws IOException {
 if (StringUtils.isEmpty(accessToken) || StringUtils.isEmpty(mediaId)) return null;
 
 String requestUrl = download_media_url.replace("ACCESS_TOKEN", accessToken).replace("MEDIA_ID", mediaId);
 URL url = new URL(requestUrl);
 HttpURLConnection conn = (HttpURLConnection) url.openConnection();
 conn.setRequestMethod("GET");
 conn.setDoInput(true);
 conn.setDoOutput(true);
 InputStream in = conn.getInputStream();
 
 File dir = new File(fileSavePath);
 if (!dir.exists()) {
  dir.mkdirs();
 }
 if (!fileSavePath.endsWith("/")) {
  fileSavePath += "/";
 }
 
 String ContentDisposition = conn.getHeaderField("Content-disposition");
 String weixinServerFileName = ContentDisposition.substring(ContentDisposition.indexOf("filename")+10, ContentDisposition.length() -1);
 fileSavePath += weixinServerFileName; 
 BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(fileSavePath));
 byte[] data = new byte[1024];
 int len = -1;
 
 while ((len = in.read(data)) != -1) {
  bos.write(data,0,len);
 }
 
 bos.close();
 in.close();
 conn.disconnect();
 
 return fileSavePath;
 }
}
Salin selepas log masuk

测试代码:

public class WeixinUtilTest {

 /**
 *
 * @author qincd
 * @date Nov 6, 2014 9:57:54 AM
 */
 public static void main(String[] args) {
 // 1).获取access_token
 AccessToken accessToken = WeixinUtil.getAccessToken(WeixinUtil.APPID, WeixinUtil.APP_SECRET);
 String filePath = "C:\\Users\\qince\\Pictures\\壁纸20141029091612.jpg";
 JSONObject uploadJsonObj = testUploadMedia(filePath,"image",accessToken.getToken());
 if (uploadJsonObj == null) {
  System.out.println("上传图片失败");
  return;
 }
 
 int errcode = 0;
 if (uploadJsonObj.containsKey("errcode")) {
  errcode = uploadJsonObj.getInt("errcode");
 }
 if (errcode == 0) {
  System.out.println("图片上传成功");
  
  String mediaId = uploadJsonObj.getString("media_id");
  long createAt = uploadJsonObj.getLong("created_at");
  System.out.println("--Details:");
  System.out.println("media_id:" + mediaId);
  System.out.println("created_at:" + createAt);
 }
 else {
  System.out.println("图片上传失败!");
  
  String errmsg = uploadJsonObj.getString("errmsg");
  System.out.println("--Details:");
  System.out.println("errcode:" + errcode);
  System.out.println("errmsg:" + errmsg);
 }
 
 String mediaId = "6W-UvSrQ2hkdSdVQJJXShwtFDPLfbGI1qnbNFy8weZyb9Jac2xxxcAUwt8p4sYPH";
 String filepath = testDownloadMedia(accessToken.getToken(), mediaId, "d:/test");
 System.out.println(filepath);
 }


 /**
 * 上传多媒体文件到微信
 *
 * @author qincd
 * @date Nov 6, 2014 4:15:14 PM
 */
 public static JSONObject testUploadMedia(String filePath,String type,String accessToken) {
 try {
  return WeixinUtil.uploadMediaToWX(filePath, type, accessToken);
 } catch (IOException e) {
  e.printStackTrace();
 }
 
 return null;
 }
 
 /**
 * 从微信下载多媒体文件
 *
 * @author qincd
 * @date Nov 6, 2014 4:56:25 PM
 */
 public static String testDownloadMedia(String accessToken,String mediaId,String fileSaveDir) {
 try {
  return WeixinUtil.downloadMediaFromWx(accessToken, mediaId, fileSaveDir);
 } catch (IOException e) {
  e.printStackTrace();
 }
 
 return null;
 }
}
Salin selepas log masuk

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

AI Hentai Generator

AI Hentai Generator

Menjana ai hentai secara percuma.

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Tutorial Generasi Imej DeepSeek Tutorial Generasi Imej DeepSeek Feb 19, 2025 pm 04:15 PM

DeepSeek: Alat Generasi Imej AI yang kuat! DeepSeek sendiri bukan alat penjanaan imej, tetapi teknologi terasnya yang kuat memberikan sokongan yang mendasari untuk banyak alat lukisan AI. Ingin tahu cara menggunakan DeepSeek untuk menjana imej secara tidak langsung? Sila teruskan membaca! Menjana imej dengan alat AI berasaskan DeepSeek: Langkah-langkah berikut akan membimbing anda untuk menggunakan alat ini: Lancarkan alat lukisan AI: Cari dan buka alat lukisan AI berasaskan Deepseek (contohnya, cari "AI Simple"). Pilih Mod Lukisan: Pilih "Lukisan AI" atau fungsi yang serupa, dan pilih Jenis Imej mengikut keperluan anda, seperti "Anime Avatar", "Landskap"

Laman Web Platform Perdagangan Laman Web Gateio Cina. Laman Web Platform Perdagangan Laman Web Gateio Cina. Feb 21, 2025 pm 03:06 PM

Gate.io, sebuah platform perdagangan cryptocurrency terkemuka yang ditubuhkan pada tahun 2013, menyediakan pengguna Cina dengan laman web rasmi Cina yang lengkap. Laman web ini menyediakan pelbagai perkhidmatan, termasuk perdagangan tempat, perdagangan niaga hadapan dan pinjaman, dan menyediakan ciri khas seperti antara muka Cina, sumber yang kaya dan sokongan masyarakat.

Senarai yuran pengendalian untuk platform perdagangan okx Senarai yuran pengendalian untuk platform perdagangan okx Feb 15, 2025 pm 03:09 PM

Platform perdagangan OKX menawarkan pelbagai kadar, termasuk yuran transaksi, yuran pengeluaran dan yuran pembiayaan. Untuk urus niaga tempat, yuran urus niaga berbeza -beza mengikut jumlah urus niaga dan tahap VIP, dan mengamalkan "model pembuat pasaran", iaitu, pasaran mengenakan bayaran pengendalian yang lebih rendah untuk setiap transaksi. Di samping itu, OKX juga menawarkan pelbagai kontrak niaga hadapan, termasuk kontrak standard mata wang, kontrak USDT dan kontrak penghantaran, dan struktur yuran setiap kontrak juga berbeza.

GATEIO EXCHANGE Versi lama Gateio Exchange App Versi Lama Saluran Muat turun GATEIO EXCHANGE Versi lama Gateio Exchange App Versi Lama Saluran Muat turun Mar 04, 2025 pm 11:36 PM

Saluran muat turun aplikasi gerbang untuk versi lama, meliputi pasaran aplikasi rasmi, pihak ketiga, komuniti forum dan saluran lain.

Tutorial muat turun domestik Tutorial muat turun domestik Mar 21, 2025 pm 05:42 PM

Artikel ini menyediakan panduan terperinci untuk muat turun selamat aplikasi OUYI OKX di China. Oleh kerana sekatan ke kedai aplikasi domestik, pengguna dinasihatkan untuk memuat turun aplikasi melalui laman web rasmi OUYI OKX, atau menggunakan kod QR yang disediakan oleh laman web rasmi untuk mengimbas dan memuat turun. Semasa proses muat turun, pastikan anda mengesahkan alamat laman web rasmi, periksa kebenaran aplikasi, lakukan imbasan keselamatan selepas pemasangan, dan membolehkan pengesahan dua faktor. Semasa penggunaan, sila mematuhi undang -undang dan peraturan tempatan, gunakan persekitaran rangkaian yang selamat, melindungi keselamatan akaun, berhati -hati terhadap penipuan, dan melabur secara rasional. Artikel ini hanya untuk rujukan dan tidak menjadi nasihat pelaburan.

Pintu Masuk Masuk Log Masuk Masuk. Pintu Masuk Masuk Log Masuk Masuk. Mar 04, 2025 pm 04:51 PM

Gate.io (Pintu Terbuka Sesame) adalah platform perdagangan cryptocurrency terkemuka di dunia. Tutorial ini meliputi langkah -langkah seperti pendaftaran akaun dan log masuk, pensijilan KYC, mata wang fiat dan mata wang digital, pemilihan pasangan dagangan, pesanan urus niaga/pasaran, dan pesanan dan rekod transaksi melihat, membantu anda memulakan platform GATE.IO untuk perdagangan cryptocurrency. Sama ada pemula atau veteran, anda boleh mendapat manfaat daripada tutorial ini dan mudah menguasai kemahiran perdagangan Gate.io.

Perbezaan antara program H5 dan mini dan aplikasi Perbezaan antara program H5 dan mini dan aplikasi Apr 06, 2025 am 10:42 AM

H5. Perbezaan utama antara program mini dan aplikasi ialah: Senibina Teknikal: H5 adalah berdasarkan teknologi web, dan program mini dan aplikasi adalah aplikasi bebas. Pengalaman dan Fungsi: H5 adalah ringan dan mudah digunakan, dengan fungsi terhad; Program mini adalah ringan dan mempunyai interaktif yang baik; Aplikasi berkuasa dan mempunyai pengalaman yang lancar. Keserasian: H5 adalah serasi, aplikasinya dan aplikasinya yang serasi dengan platform. Kos Pembangunan: H5 mempunyai kos pembangunan yang rendah, program mini sederhana, dan aplikasi tertinggi. Senario yang berkenaan: H5 sesuai untuk paparan maklumat, applet sesuai untuk aplikasi ringan, dan aplikasi sesuai untuk fungsi kompleks.

Apa yang perlu saya lakukan sekiranya perisian keselamatan syarikat bertentangan dengan aplikasi? Bagaimana untuk menyelesaikan masalah perisian keselamatan yang menyebabkan perisian biasa gagal dibuka? Apa yang perlu saya lakukan sekiranya perisian keselamatan syarikat bertentangan dengan aplikasi? Bagaimana untuk menyelesaikan masalah perisian keselamatan yang menyebabkan perisian biasa gagal dibuka? Apr 01, 2025 pm 10:48 PM

Isu keserasian dan kaedah penyelesaian masalah untuk perisian dan aplikasi keselamatan syarikat. Banyak syarikat akan memasang perisian keselamatan untuk memastikan keselamatan intranet. Walau bagaimanapun, perisian keselamatan kadang -kadang ...

See all articles