1. 程式人生 > >第九篇 :微信公眾平臺開發實戰Java版之如何實現自定義分享內容

第九篇 :微信公眾平臺開發實戰Java版之如何實現自定義分享內容

第一部分:微信JS-SDK介紹

微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。

通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信使用者提供更優質的網頁體驗。

本次的內容:

實現:分享到朋友圈,qq,qq空間,微信朋友的功能。

基礎介面

判斷當前客戶端版本是否支援指定JS介面

wx.checkJsApi({
    jsApiList: ['chooseImage'], // 需要檢測的JS介面列表,所有JS介面列表見附錄2,
    success: function(res) {
        // 以鍵值對的形式返回,可用的api值true,不可用為false
        // 如:{"checkResult":{"chooseImage":true},"errMsg":"checkJsApi:ok"}
    }
});

備註:checkJsApi介面是客戶端6.0.2新引入的一個預留介面,第一期開放的介面均可不使用checkJsApi來檢測。

獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面

wx.onMenuShareTimeline({
    title: '', // 分享標題
    link: '', // 分享連結
    imgUrl: '', // 分享圖示
    success: function () { 
        // 使用者確認分享後執行的回撥函式
    },
    cancel: function () { 
        // 使用者取消分享後執行的回撥函式
    }
});

獲取“分享給朋友”按鈕點選狀態及自定義分享內容介面

wx.onMenuShareAppMessage({
    title: '', // 分享標題
    desc: '', // 分享描述
    link: '', // 分享連結
    imgUrl: '', // 分享圖示
    type: '', // 分享型別,music、video或link,不填預設為link
    dataUrl: '', // 如果type是music或video,則要提供資料鏈接,預設為空
    success: function () { 
        // 使用者確認分享後執行的回撥函式
    },
    cancel: function () { 
        // 使用者取消分享後執行的回撥函式
    }
});

獲取“分享到QQ”按鈕點選狀態及自定義分享內容介面

wx.onMenuShareQQ({
    title: '', // 分享標題
    desc: '', // 分享描述
    link: '', // 分享連結
    imgUrl: '', // 分享圖示
    success: function () { 
       // 使用者確認分享後執行的回撥函式
    },
    cancel: function () { 
       // 使用者取消分享後執行的回撥函式
    }
});

獲取“分享到騰訊微博”按鈕點選狀態及自定義分享內容介面

wx.onMenuShareWeibo({
    title: '', // 分享標題
    desc: '', // 分享描述
    link: '', // 分享連結
    imgUrl: '', // 分享圖示
    success: function () { 
       // 使用者確認分享後執行的回撥函式
    },
    cancel: function () { 
        // 使用者取消分享後執行的回撥函式
    }
});

獲取“分享到QQ空間”按鈕點選狀態及自定義分享內容介面

wx.onMenuShareQZone({
    title: '', // 分享標題
    desc: '', // 分享描述
    link: '', // 分享連結
    imgUrl: '', // 分享圖示
    success: function () { 
       // 使用者確認分享後執行的回撥函式
    },
    cancel: function () { 
        // 使用者取消分享後執行的回撥函式
    }
});

附錄2-所有JS介面列表

版本1.0.0介面

  • onMenuShareTimeline
  • onMenuShareAppMessage
  • onMenuShareQQ
  • onMenuShareWeibo
  • onMenuShareQZone

附錄3-所有選單項列表

  • 傳送給朋友: "menuItem:share:appMessage"
  • 分享到朋友圈: "menuItem:share:timeline"
  • 分享到QQ: "menuItem:share:qq"
  • 分享到Weibo: "menuItem:share:weiboApp"
  • 收藏: "menuItem:favorite"
  • 分享到FB: "menuItem:share:facebook"
  • 分享到 QQ 空間/menuItem:share:QZone

第二部分:分享方法的實現。

那麼,我們如何來實現這個分享內容呢?

JSSDK使用步驟

步驟一:繫結域名

1. 先登入微信公眾平臺 ,登入後可在“開發者中心”檢視對應的介面許可權。

說明了有這個分享的許可權。

2.  進入“公眾號設定”的“功能設定”裡填寫“JS介面安全域名”。

js域名,一般不用http這樣的開頭。

步驟二:引入JS檔案

如需使用搖一搖周邊功能,請引入 jweixin-1.1.0.js

備註:支援使用 AMD/CMD 標準模組載入方法載入

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>

步驟三:通過config介面注入許可權驗證配置

所有需要使用JS-SDK的頁面必須先注入配置資訊,否則將無法呼叫(同一個url僅需呼叫一次,對於變化url的SPA的web app可在每次url變化時進行呼叫,目前Android微信客戶端不支援pushState的H5新特性,所以使用pushState來實現web app的頁面會導致簽名失敗,此問題會在Android6.2中修復)。

wx.config({
    debug: true, // 開啟除錯模式,呼叫的所有api的返回值會在客戶端alert出來,若要檢視傳入的引數,可以在pc端開啟,引數資訊會通過log打出,僅在pc端時才會列印。
    appId: '', // 必填,公眾號的唯一標識
    timestamp: , // 必填,生成簽名的時間戳
    nonceStr: '', // 必填,生成簽名的隨機串
    signature: '',// 必填,簽名,見附錄1
    jsApiList: [] // 必填,需要使用的JS介面列表,所有JS介面列表見附錄2
});

注意,我這裡只是動態獲取,並沒有做快取,如果有需要的同學,需要做一些快取。

如何獲取以上的引數呢?

package com.souvc.weixin.util;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.net.ConnectException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.servlet.http.HttpServletRequest;

import net.sf.json.JSONObject;

public class WeixinUtil {
    
    /**
    * 方法名:httpRequest</br>
    * 詳述:傳送http請求</br>
    * 開發人員:souvc </br>
    * 建立時間:2016-1-5  </br>
    * @param requestUrl
    * @param requestMethod
    * @param outputStr
    * @return 說明返回值含義
    * @throws 說明發生此異常的條件
     */
    public static JSONObject httpRequest(String requestUrl,String requestMethod, String outputStr) {
        JSONObject jsonObject = null;
        StringBuffer buffer = new StringBuffer();
        try {
            TrustManager[] tm = { new MyX509TrustManager() };
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            SSLSocketFactory ssf = sslContext.getSocketFactory();
            URL url = new URL(requestUrl);
            HttpsURLConnection httpUrlConn = (HttpsURLConnection) url.openConnection();
            httpUrlConn.setSSLSocketFactory(ssf);
            httpUrlConn.setDoOutput(true);
            httpUrlConn.setDoInput(true);
            httpUrlConn.setUseCaches(false);
            httpUrlConn.setRequestMethod(requestMethod);
            if ("GET".equalsIgnoreCase(requestMethod))
                httpUrlConn.connect();
            if (null != outputStr) {
                OutputStream outputStream = httpUrlConn.getOutputStream();
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }
            InputStream inputStream = httpUrlConn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            httpUrlConn.disconnect();
            jsonObject = JSONObject.fromObject(buffer.toString());
        } catch (ConnectException ce) {
            ce.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return jsonObject;
    }

    
    /**
    * 方法名:getWxConfig</br>
    * 詳述:獲取微信的配置資訊 </br>
    * 開發人員:souvc  </br>
    * 建立時間:2016-1-5  </br>
    * @param request
    * @return 說明返回值含義
    * @throws 說明發生此異常的條件
     */
    public static Map<String, Object> getWxConfig(HttpServletRequest request) {
        Map<String, Object> ret = new HashMap<String, Object>();
      
        String appId = "xxxx"; // 必填,公眾號的唯一標識
        String secret = "xxxx";

        String requestUrl = request.getRequestURL().toString();
        String access_token = "";
        String jsapi_ticket = "";
        String timestamp = Long.toString(System.currentTimeMillis() / 1000); // 必填,生成簽名的時間戳
        String nonceStr = UUID.randomUUID().toString(); // 必填,生成簽名的隨機串
        String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="+ appId + "&secret=" + secret;
        
        JSONObject json = WeixinUtil.httpRequest(url, "GET", null);
        
        if (json != null) {
            //要注意,access_token需要快取
            access_token = json.getString("access_token");
            
            url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token="+ access_token + "&type=jsapi";
            json = WeixinUtil.httpRequest(url, "GET", null);
            if (json != null) {
                jsapi_ticket = json.getString("ticket");
            }
        }
        String signature = "";
        // 注意這裡引數名必須全部小寫,且必須有序
        String sign = "jsapi_ticket=" + jsapi_ticket + "&noncestr=" + nonceStr+ "&timestamp=" + timestamp + "&url=" + requestUrl;
        try {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(sign.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        ret.put("appId", appId);
        ret.put("timestamp", timestamp);
        ret.put("nonceStr", nonceStr);
        ret.put("signature", signature);
        return ret;
    }

    
    /**
    * 方法名:byteToHex</br>
    * 詳述:字串加密輔助方法 </br>
    * 開發人員:souvc  </br>
    * 建立時間:2016-1-5  </br>
    * @param hash
    * @return 說明返回值含義
    * @throws 說明發生此異常的條件
     */
    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash) {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;

    }
}
View Code

注意:以上需要替換成自己的appid和secret 。

步驟四:通過ready介面處理成功驗證

wx.ready(function(){

    // config資訊驗證後會執行ready方法,所有介面呼叫都必須在config介面獲得結果之後,config是一個客戶端的非同步操作,所以如果需要在頁面載入時就呼叫相關介面,則須把相關介面放在ready函式中呼叫來確保正確執行。對於使用者觸發時才呼叫的介面,則可以直接呼叫,不需要放在ready函式中。
});

根據以上的步驟,我們寫了一個頁面:

<%@ page language="java" import="java.util.*" contentType="text/html; charset=utf-8"  pageEncoding="utf-8"%>
<%@page language="java" import="com.souvc.weixin.util.WeixinUtil" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>歡迎訪問搜投網  www.souvc.com </title>
<%
        Map<String,Object>  ret = new HashMap<String,Object> ();
        ret=WeixinUtil.getWxConfig(request);
        request.setAttribute("appId", ret.get("appId"));
        request.setAttribute("timestamp", ret.get("timestamp"));
        request.setAttribute("nonceStr", ret.get("nonceStr"));
        request.setAttribute("signature", ret.get("signature"));
        %> 
</head>
<body>
        
        歡迎訪問搜投網!
        
</body>


<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script>
<script type="text/javascript">

// 微信資訊的以及呼叫的配置
wx.config({
    debug: false, 
    appId: '${appId}', 
    timestamp: '${timestamp}', 
    nonceStr: '${nonceStr}', 
    signature: '${signature}',
    jsApiList: ['onMenuShareTimeline', 'onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] 
});

wx.ready(function(){
    // 獲取“分享到朋友圈”按鈕點選狀態及自定義分享內容介面
    wx.onMenuShareTimeline({
        title: '第八篇 :微信公眾平臺開發實戰Java版之如何網頁授權獲取使用者基本資訊', // 分享標題
        link:"http://www.cnblogs.com/liuhongfeng/p/5099149.html",
        imgUrl: "http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_1442809977405.jpg" // 分享圖示
    });
    // 獲取“分享給朋友”按鈕點選狀態及自定義分享內容介面
    wx.onMenuShareAppMessage({
        title: '第七篇 :微信公眾平臺開發實戰Java版之如何獲取微信使用者基本資訊', // 分享標題
        desc: "第七篇 :微信公眾平臺開發實戰Java版之如何獲取微信使用者基本資訊", // 分享描述
        link:"http://www.cnblogs.com/liuhongfeng/p/5057167.html",
        imgUrl: "http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_QQ%E5%9B%BE%E7%89%8720151118180508.png", // 分享圖示
        type: 'link', // 分享型別,music、video或link,不填預設為link
    });
    
    //獲取“分享到QQ”按鈕點選狀態及自定義分享內容介面
    wx.onMenuShareQQ({
        title: '第六篇 :微信公眾平臺開發實戰Java版之如何自定義微信公眾號選單', // 分享標題
        desc: '第六篇 :微信公眾平臺開發實戰Java版之如何自定義微信公眾號選單', // 分享描述
        link: 'http://www.cnblogs.com/liuhongfeng/p/4857312.html', // 分享連結
        imgUrl: 'http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_qrcode_for_gh_228cd30523bc_258.jpg', // 分享圖示
        success: function () { 
           // 使用者確認分享後執行的回撥函式
        },
        cancel: function () { 
           // 使用者取消分享後執行的回撥函式
        }
    });
    
    //獲取“分享到騰訊微博”按鈕點選狀態及自定義分享內容介面
    wx.onMenuShareWeibo({
        title: '分享到騰訊微博標題', // 分享標題
        desc: '分享到騰訊微博描述', // 分享描述
        link: 'http://www.cnblogs.com/liuhongfeng/p/4857312.html', // 分享連結
        imgUrl: 'http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_qrcode_for_gh_228cd30523bc_258.jpg', // 分享圖示
        success: function () { 
           // 使用者確認分享後執行的回撥函式
        },
        cancel: function () { 
            // 使用者取消分享後執行的回撥函式
        }
    });
    
    //獲取“分享到QQ空間”按鈕點選狀態及自定義分享內容介面
    wx.onMenuShareQZone({
        title: '分享到QQ空間標題', // 分享標題
        desc: '分享到QQ空間描述', // 分享描述
        link: 'http://www.cnblogs.com/liuhongfeng/p/4857312.html', // 分享連結
        imgUrl: 'http://images.cnblogs.com/cnblogs_com/liuhongfeng/737147/o_qrcode_for_gh_228cd30523bc_258.jpg', // 分享圖示
        success: function () { 
           // 使用者確認分享後執行的回撥函式
        },
        cancel: function () { 
            // 使用者取消分享後執行的回撥函式
        }
    });
    
});
</script>

</html>
View Code

步驟五: 部署到伺服器。然後訪問到這個頁面,用微信掃一掃。然後分享到我們設定的介面。

效果如下:

發給微信朋友的效果:

分享到朋友圈的效果:

分享到qq空間的效果:

分享給朋友的效果:

恭喜你,配置成功!!

其他文章關聯:

相關推薦

公眾平臺開發實戰Java如何定義公眾號選單

我們來了解一下 自定義選單建立介面: 自定義選單查詢介面: 自定義選單刪除介面: 自定義選單介面可實現多種型別按鈕,如下: 1、click:點選推事件 使用者點選click型別按鈕後,微信伺服器會通過訊息介面推送訊息型別為event 的結構給開發者(參考訊息介面指

公眾平臺開發實戰Java如何實現定義分享內容

第一部分:微信JS-SDK介紹 微信JS-SDK是微信公眾平臺面向網頁開發者提供的基於微信內的網頁開發工具包。 通過使用微信JS-SDK,網頁開發者可藉助微信高效地使用拍照、選圖、語音、位置等手機系統的能力,同時可以直接使用微信分享、掃一掃、卡券、支付等微信特有的能力,為微信使用者提供更優質的網頁

公眾平臺開發實戰Java如何網頁授權獲取使用者基本資訊

第一部分:微信授權獲取基本資訊的介紹 我們首先來看看官方的文件怎麼說: 如果使用者在微信客戶端中訪問第三方網頁,公眾號可以通過微信網頁授權機制,來獲取使用者基本資訊,進而實現業務邏輯。 關於網頁授權回撥域名的說明 1、在微信公眾號請求使用者網頁授權之前,開發者需要先到公眾平臺官網中的開發者中心頁配置授權

公眾平臺開發實戰Java如何獲取公眾號的access_token以及快取access_token

一、access_token簡介 為了使第三方開發者能夠為使用者提供更多更有價值的個性化服務,微信公眾平臺 開放了許多介面,包括自定義選單介面、客服介面、獲取使用者資訊介面、使用者分組介面、群發介面等, 開發者在呼叫這些介面時,都需要傳入一個相同的引數 access_token,它是公眾賬號的全域性唯一票

公眾平臺開發實戰Java請求訊息,響應訊息以及事件訊息類的封裝

微信伺服器和第三方伺服器之間究竟是通過什麼方式進行對話的? 下面,我們先看下圖: 其實我們可以簡單的理解: (1)首先,使用者向微信伺服器傳送訊息; (2)微信伺服器接收到使用者的訊息處理之後,通過開發者配置的URL和Token 來找到第三方伺服器,並以XML形式向第三方伺服器傳送訊息

公眾平臺開發實戰Java完成訊息接受與相應以及訊息的處理

溫馨提示:      這篇文章是依賴前幾篇的文章的。 首先,我們看看原來寫的dopost方法: /** * 處理微信伺服器發來的訊息 */ public void doPost(HttpServletRequest request, Http

公眾平臺開發實戰Java如何獲取信使用者基本資訊

在關注者與公眾號產生訊息互動後,公眾號可獲得關注者的OpenID(加密後的微訊號,每個使用者對每個公眾號的OpenID是唯一的。對於不同公眾號,同一使用者的openid不同)。 公眾號可通過本介面來根據OpenID獲取使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和關注時間。 開發者可通過Ope

第一公眾平臺開發實戰Java瞭解公眾平臺基礎知識以及資料準備

相信很多人或多或少聽說了微信公眾平臺的火熱。但是開發還是有一點門檻,鑑於挺多朋友問我怎麼開發,問多了,自己平時也進行以下總結。 所以下面給大家分享一下我的經驗: 第一部分   介紹微信公眾號的一些簡單介紹以及微信扮演的一些角色,微信公眾號的重要性。 1. 微信公眾號是什麼?    官網

第二 公眾平臺開發實戰Java開啟開發者模式,接入微公眾平臺開發

第一部分:微信公眾號對接的基本介紹 一、填寫伺服器配置資訊的介紹 登入微信公眾平臺官網後,進入到公眾平臺後臺管理頁面。 選擇 公眾號基本設定-》基本配置 ,點選“修改配置”按鈕,填寫伺服器地址(URL)、Token和EncodingAESKey。 微信公眾號配置介面:  以上

公眾平臺開發實戰Java獲取使用者基本資訊

在關注者與公眾號產生訊息互動後,公眾號可獲得關注者的OpenID(加密後的微訊號,每個使用者對每個公眾號的OpenID是唯一的。對於不同公眾號,同一使用者的openid不同)。 公眾號可通過本介面來根據OpenID獲取使用者基本資訊,包括暱稱、頭像、性別、所在城市、語言和

公眾平臺開發實戰Java如何獲取公眾號的access_token以及快取access_token

一、access_token簡介 為了使第三方開發者能夠為使用者提供更多更有價值的個性化服務,微信公眾平臺 開放了許多介面,包括自定義選單介面、客服介面、獲取使用者資訊介面、使用者分組介面、群發介面等, 開發者在呼叫這些介面時,都需要傳入一個相同的引數 access_token,它是公眾賬號的全域性唯一票據,

公眾平臺開發教程Java(六) 事件處理(選單點選/關注/取消關注)

前言: 事件處理是非常重要的,這一章講講常見的事件處理 1、關注/取消關注 2、選單點選 事件型別介紹: 在微信中有事件請求是訊息請求中的一種。請求型別為:event 而event事件型別又分多種事件型別,具體分關注:subscribe取消關注:unsubscribe自定義選單點選:CLICK    根

Spring Cloud實戰 | Spring Cloud整合Spring Security OAuth2認證伺服器統一認證定義異常處理

[本文完整程式碼下載點選](https://github.com/hxrui/youlai-mall.git) # 一. 前言 相信瞭解過我或者看過我之前的系列文章應該多少知道點我寫這些文章包括建立 [有來商城youlai-mall](https://github.com/hxrui/youlai

[043] 公眾平臺開發教程19-應用例項人臉檢測

CSDN2013年度部落格之星評選活動開始,本人有幸入圍參加評選,如果部落格中的文章對你有所幫助,請為柳峰投上寶貴一票,非常感謝!        在筆者的公眾賬號小q機器人(微訊號:xiaoqrobot)中有一個非常好玩的功能"人臉檢測",它能夠檢測出使用者傳送的圖片中有多少

公眾平臺開發進入(Web App開發入門)

WebApp與Native App有何區別呢? Native App: 1、開發成本非常大。一般使用的開發語言為Java、C++、Objective-C。 2、更新體驗較差、同時也比較麻煩。每一次釋出新的版本,都需要做版本打包,且需要使用者手動更新(有些應用程式即使不需要使用者手動更新,但是也需要有一個噁心

[053] 公眾平臺開發教程23-SAE不支援XStream框架的解決方案

問題描述最近幾天(2014年8月20日之後),突然有不少網友反應,柳峰部落格中的微信公眾平臺開發程式碼在SAE上執行會報錯,或者是能正常部署,但向公眾號發訊息沒反應。以前也有一些初學者質疑過我部落格中的程式碼是否能正常執行,最後都被我一一證明是由於他們的不理解和粗心導致,但這

[044] 公眾平臺開發教程20-新手解惑40則

        筆者在CSDN部落格頻道推出微信公眾平臺開發教程之後,接觸了許多公眾平臺開發愛好者,也幫助他們解決了許多實際的問題,當然這其中有很多問題都是重複的,因此,筆者將這些問題及解答整理出來,以幫助更多初學者少走彎路。1、訂閱號與服務號的主要區別是什麼?訂閱號每天能群

粉絲一鍵同步工具類

1、前言   在公眾號開發的過程中,一般都需要獲取粉絲資料,針對單個粉絲,我們可以通過openid獲取其粉絲資訊; 但不排除這種業務,比如目前開發的公眾號已經在使用中,,當前的框架或者功能已經不能夠滿足使用者的需求、需要重新開發,那麼這個時候你開發的新的微信專案將要接入到之前老的微

素材管理工具類

1、前言 微信公眾號在使用的介面的時候是通過media_id來進行的,所以在使用的介面的時候我們往往需要先上傳素材,素材管理分為臨時素材和永久素材 1)、臨時素材媒體檔案在微信後臺儲存時間為3天,即3天后media_id失效,詳細文件檢視:上傳臨時素材 2)、開發者可通過本介面上傳到