Java微信公众平台之素材管理

微信素材管理和群发这块文档对Java很不友好。本文只对新增临时素材,新增永久素材做介绍,其余获取、删除、修改自行补充

公众号经常有需要用到一些临时性的多媒体素材的场景,例如在使用接口特别是发送消息时,对多媒体文件、多媒体消息的获取和调用等操作,是通过media_id来进行的。素材管理接口对所有认证的订阅号和服务号开放

素材的限制

图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
视频(video):10MB,支持MP4格式
缩略图(thumb):64KB,支持JPG格式

一、新增临时素材

接口:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE,再传一个媒体文件类型,可以是图片(image)、语音(voice)、视频(video)和缩略图(thumb)。

1、订阅号和服务号要通过认证
2、临时素材media_id是可复用的

3、媒体文件在微信后台保存时间为3天,即3天后media_id失效。

/**
 * 上传临时素材(本地)
 *
 * @param accessToken
 * @param type
 *   媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
 * @param path
 *   图片路径
 * @return
 */ 

public static UploadMediasResult uploadTempMediaFile(String accessToken, String type, String path) {
 UploadMediasResult result = null;
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 params.put("type", type);
 try {
  String json = HttpsUploadMediaFile(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_TEMP_MEDIA_TYPE_URL,
    params, path);
  result = JsonUtil.fromJsonString(json, UploadMediasResult.class);
 } catch (Exception e) {
  e.printStackTrace();
 }
 return result;
} 

/**
 * 上传临时素材(网络)
 *
 * @param accessToken
 * @param type
 *   媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
 * @param path
 *   图片路径
 * @return
 */
public static UploadMediasResult uploadTempMedia(String accessToken, String type, String path) {
 UploadMediasResult result = null;
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 params.put("type", type);
 try {
  String json = HttpsUploadMedia(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_TEMP_MEDIA_TYPE_URL, params,
    path, 0, 0);
  result = JsonUtil.fromJsonString(json, UploadMediasResult.class);
 } catch (Exception e) {
  e.printStackTrace();
 }
 return result;
}

二、新增永久素材

接口:https://api.weixin.qq.com/cgi-bin/material/add_material?access_token=ACCESS_TOKEN&type=TYPE,媒体文件类型,分别有图片(image)、语音(voice)、视频(video,例外)和缩略图(thumb)

/**
 * 上传永久素材(本地)
 *
 * @param accessToken
 * @param type
 *   媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
 * @return
 */
public static UploadMediasResult uploadForeverMediaFile(String accessToken, String type, String path) {
 UploadMediasResult result = null;
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 params.put("type", type);
 try {
  String json = HttpsUploadMediaFile(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_FOREVER_MEDIA_TYPE_URL,
    params, path);
  result = JsonUtil.fromJsonString(json, UploadMediasResult.class);
 } catch (Exception e) {
  e.printStackTrace();
 }
 return result;
} 

/**
 * 上传永久素材(网络)
 *
 * @param accessToken
 * @param type
 *   媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb)
 * @return
 */
public static UploadMediasResult uploadForeverMedia(String accessToken, String type, String path) {
 UploadMediasResult result = null;
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 params.put("type", type);
 try {
  String json = HttpsUploadMedia(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_FOREVER_MEDIA_TYPE_URL, params,
    path, 0, 0);
  result = JsonUtil.fromJsonString(json, UploadMediasResult.class);
 } catch (Exception e) {
  e.printStackTrace();
 }
 return result;
} 

新增永久视频素材需特别注意,在上传视频素材时需要POST另一个表单,id为description,包含素材的描述信息title和introduction,内容格式为JSON

/**
 * 上传永久素材(video)
 *
 * @param accessToken
 * @return
 */
public static String uploadForeverMediaFile(String accessToken, String title, String introduction, String path) {
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 params.put("type", "video");
 String mediaId = null;
 try {
  String json = HttpsUploadVideoMediaFile(SystemConfig.POST_METHOD,
    WechatConfig.UPLOAD_FOREVER_MEDIA_TYPE_URL, params, path, title, introduction);
  mediaId = JsonUtil.fromJsonString(json, "media_id");
 } catch (Exception e) {
  e.printStackTrace();
 }
 return mediaId;
} 

/**
 * 上传永久素材(video,网络)
 *
 * @param accessToken
 * @return
 */
public static String uploadForeverMedia(String accessToken, String title, String introduction, String path) {
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 params.put("type", "video");
 String mediaId = null;
 try {
  String json = HttpsUploadVideoMedia(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_FOREVER_MEDIA_TYPE_URL,
    params, path, title, introduction, 0, 0);
  mediaId = JsonUtil.fromJsonString(json, "media_id");
 } catch (Exception e) {
  e.printStackTrace();
 }
 return mediaId;
}

三、新增永久图文素材

接口:https://api.weixin.qq.com/cgi-bin/material/add_news?access_token=ACCESS_TOKEN,post信息参见UploadNewsMedia 实体类

对于常用的素材,开发者可通过本接口上传到微信服务器,永久使用.

1、永久图片素材新增后,将带有URL返回给开发者,开发者可以在腾讯系域名内使用(腾讯系域名外使用,图片将被屏蔽)。
2、公众号的素材库保存总数量有上限:图文消息素材、图片素材上限为5000,其他类型为1000。
3、图文消息的具体内容中,微信后台将过滤外部的图片链接,图片url需通过"上传图文消息内的图片获取URL"接口上传图片获取。
4、"上传图文消息内的图片获取URL"接口所上传的图片,不占用公众号的素材库中图片数量的5000个的限制,图片仅支持jpg/png格式,大小必须在1MB以下。
5、图文消息支持正文中插入自己帐号和其他公众号已群发文章链接的能力。

/**
 * 上传永久图文消息的素材
 *
 * @param accessToken
 *   授权token
 * @param entity
 *   图文消息对象
 * @return
 */
public static UploadMediasResult uploadNewsMedia(String accessToken, List<UploadNewsMedia> entity) {
 UploadMediasResult result = null;
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 // post 提交的参数
 TreeMap<String, List<UploadNewsMedia>> dataParams = new TreeMap<String, List<UploadNewsMedia>>();
 dataParams.put("articles", entity);
 String data = JsonUtil.toJsonString(dataParams);
 String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,
   WechatConfig.UPLOAD_FOREVER_NEWS_MEDIA_URL, params, data);
 result = JsonUtil.fromJsonString(json, UploadMediasResult.class);
 return result;
}

四、上传图文消息内的图片获取URL

接口:https://api.weixin.qq.com/cgi-bin/media/uploadimg?access_token=ACCESS_TOKEN

本接口所上传的图片不占用公众号的素材库中图片数量的5000个的限制。图片仅支持jpg/png格式,大小必须在1MB以下,此接口返回的url就是上传图片的URL,可放置图文消息中使用。

/**
 * 上传图文消息内的图片获取URL(本地)
 *
 * @param accessToken
 * @param path
 * @return
 */
public static String uploadImgMediaFile(String accessToken, String path) {
 TreeMap<String, String> params = new TreeMap<>();
 params.put("access_token", accessToken);
 String url = null;
 try {
  String json = HttpsUploadMediaFile(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_IMG_MEDIA_URL, params,
    path);
  url = JsonUtil.fromJsonString(json, "url");
 } catch (Exception e) {
  e.printStackTrace();
 }
 return url;
} 

/**
 * 上传图文消息内的图片获取URL(网络)
 *
 * @param accessToken
 * @param path
 * @return
 */
public static String uploadImgMedia(String accessToken, String path) {
 TreeMap<String, String> params = new TreeMap<String, String>();
 params.put("access_token", accessToken);
 String url = null;
 try {
  String json = HttpsUploadMedia(SystemConfig.POST_METHOD, WechatConfig.UPLOAD_IMG_MEDIA_URL, params, path, 0,
    0);
  url = JsonUtil.fromJsonString(json, "url");
 } catch (Exception e) {
  e.printStackTrace();
 }
 return url;
}

五、部分工具类

配置类

public static final String UPLOAD_IMG_MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/media/uploadimg";
public static final String UPLOAD_FOREVER_NEWS_MEDIA_URL = "https://api.weixin.qq.com/cgi-bin/material/add_news";
public static final String UPLOAD_TEMP_MEDIA_TYPE_URL = "https://api.weixin.qq.com/cgi-bin/media/upload";
public static final String UPLOAD_FOREVER_MEDIA_TYPE_URL = "https://api.weixin.qq.com/cgi-bin/material/add_material"; 

上传图文消息素材返回类

package com.phil.wechat.msg.model.media; 

/**
 * 上传图文消息素材返回的结果
 * @author phil
 * @date 2017年9月20日
 *
 */
public class UploadMediasResult {
 private String type; // 媒体文件类型,分别有图片(image)、语音(voice)、视频(video)和缩略图(thumb),次数为news,即图文消息
 private String media_id; // 媒体文件/图文消息上传后获取的唯一标识
 private String created_at; // 媒体文件上传时间
}

上传图文消息素材实体类

package com.phil.wechat.msg.model.media; 

import java.io.Serializable; 

/**
 * 上传图文消息素材实体类
 * @author phil
 * @date 2017年9月20日
 */
public class UploadNewsMedia implements Serializable { 

 private static final long serialVersionUID = 6551817058101753854L;
 private String thumb_media_id; // 图文消息缩略图的media_id,可以在基础支持-上传多媒体文件接口中获得
 private String author; // 图文消息的作者
 private String title; // 图文消息的标题
 private String content_source_url; // 图文消息点击阅读原文的链接
 private String content; // 图文消息页面的内容,支持HTML标签
 private String digest; // 图文消息的描述
 private int show_conver_pic; // 是否显示为封面 1表示显示为封面 0 不显示为封面
}

上传方法

/**
 * 上传媒体文件(本地)
 *
 * @param method
 *   请求方法 GET/POST
 * @param path
 *   api的路径
 * @param param
 *   api参数
 * @param mediaPath
 *   待上传的image/music 的path
 * @return
 * @throws Exception
 */
public static String HttpsUploadMediaFile(String method, String path, Map<String, String> param, String mediaPath)
  throws Exception {
 String result = null;
 URL url = new URL(setParmas(param, path, ""));
 OutputStream output = null;
 DataInputStream inputStream = null;
 try {
  File file = new File(mediaPath);
  if (!file.isFile() || !file.exists()) {
   throw new IOException("file is not exist");
  }
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setDoInput(true);
  con.setDoOutput(true);
  con.setUseCaches(false);
  con.setRequestMethod(SystemConfig.POST_METHOD);
  // 设置请求头信息
  con.setRequestProperty("Connection", "Keep-Alive");
  con.setRequestProperty("Charset", SystemConfig.DEFAULT_CHARACTER_ENCODING);
  // 设置边界
  String boundary = "----------" + System.currentTimeMillis();
  con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
  // 请求正文信息
  // 第一部分
  output = new DataOutputStream(con.getOutputStream());
  IOUtils.write(("--" + boundary + "\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  IOUtils.write(("Content-Disposition: form-data;name=\"media\"; filename=\"" + file.getName() + "\"\r\n")
    .getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  IOUtils.write(
    "Content-Type:application/octet-stream\r\n\r\n".getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING),
    output);
  // IOUtils.write(("Content-Type: "+ fileExt + "\r\n\r\n").getBytes(), output);
  // 文件正文部分
  // 把文件已流文件的方式 推入到url中
  inputStream = new DataInputStream(new FileInputStream(file));
  IOUtils.copy(inputStream, output);
  // 结尾部分
  IOUtils.write(("\r\n--" + boundary + "--\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  output.flush();
  result = inputStreamToString(con.getInputStream());
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (ProtocolException e) {
  e.printStackTrace();
 } catch (IOException e) {
  throw new IOException("read data error");
 } finally {
  IOUtils.closeQuietly(output);
  IOUtils.closeQuietly(inputStream);
 }
 return result;
} 

/**
 * 上传媒体文件(不能本地)
 *
 * @param method
 *   请求方法 GET/POST
 * @param path
 *   api的路径
 * @param param
 *   api参数
 * @param mediaPath
 *   待上传的image/music 的path
 * @param connTime
 *   连接时间 默认为5000
 * @param readTime
 *   读取时间 默认为5000
 * @return
 * @throws Exception
 */
public static String HttpsUploadMedia(String method, String path, Map<String, String> param, String mediaPath,
  int connTime, int readTime) throws Exception {
 String result = "";
 URL url = new URL(setParmas(param, path, ""));
 OutputStream output = null;
 BufferedInputStream inputStream = null;
 try {
  String boundary = "----";
  HttpURLConnection conn = getConnection(method, url);
  conn.setConnectTimeout(connTime == 0 ? DEFAULT_CONNTIME : connTime);
  conn.setReadTimeout(readTime == 0 ? DEFAULT_UPLOAD_READTIME : readTime);
  conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
  output = conn.getOutputStream();
  URL mediaUrl = new URL(mediaPath);
  if (mediaUrl != null) {
   HttpURLConnection mediaConn = (HttpURLConnection) mediaUrl.openConnection();
   mediaConn.setDoOutput(true);
   mediaConn.setUseCaches(false);
   mediaConn.setRequestMethod(SystemConfig.GET_METHOD);
   mediaConn.setConnectTimeout(connTime == 0 ? DEFAULT_CONNTIME : connTime);
   mediaConn.setReadTimeout(readTime == 0 ? DEFAULT_UPLOAD_READTIME : readTime);
   String connType = mediaConn.getContentType();
   // 获得文件扩展
   String fileExt = getFileExt(connType);
   IOUtils.write(("--" + boundary + "\r\n").getBytes(), output);
   IOUtils.write(("Content-Disposition: form-data; name=\"media\"; filename=\"" + getFileName(mediaPath)
     + "\"\r\n").getBytes(), output);
   IOUtils.write(("Content-Type: " + fileExt + "\r\n\r\n").getBytes(), output);
   inputStream = new BufferedInputStream(mediaConn.getInputStream());
   IOUtils.copy(inputStream, output);
   IOUtils.write(("\r\n----" + boundary + "--\r\n").getBytes(), output);
   mediaConn.disconnect();
   // 获取输入流
   result = inputStreamToString(conn.getInputStream());
  }
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (ProtocolException e) {
  e.printStackTrace();
 } catch (IOException e) {
  e.printStackTrace();
 } finally {
  IOUtils.closeQuietly(output);
  IOUtils.closeQuietly(inputStream);
 }
 return result;
} 

/**
 * 上传Video媒体文件(本地)
 *
 * @param method
 *   请求方法 GET/POST
 * @param path
 *   api的路径
 * @param param
 *   api参数
 * @param mediaPath
 *   待上传的voide 的path
 * @param title
 *   视频标题
 * @param introduction
 *   视频描述
 * @return
 * @throws Exception
 */
public static String HttpsUploadVideoMediaFile(String method, String path, Map<String, String> param,
  String mediaPath, String title, String introduction) throws Exception {
 String result = null;
 URL url = new URL(setParmas(param, path, ""));
 OutputStream output = null;
 DataInputStream inputStream = null;
 try {
  File file = new File(mediaPath);
  if (!file.isFile() || !file.exists()) {
   throw new IOException("file is not exist");
  }
  HttpURLConnection con = (HttpURLConnection) url.openConnection();
  con.setDoInput(true);
  con.setDoOutput(true);
  con.setUseCaches(false);
  con.setRequestMethod(SystemConfig.POST_METHOD);
  // 设置请求头信息
  con.setRequestProperty("Connection", "Keep-Alive");
  con.setRequestProperty("Charset", SystemConfig.DEFAULT_CHARACTER_ENCODING);
  // 设置边界
  String boundary = "----------" + System.currentTimeMillis();
  con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
  // 请求正文信息
  // 第一部分
  output = new DataOutputStream(con.getOutputStream());
  IOUtils.write(("--" + boundary + "\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  IOUtils.write(("Content-Disposition: form-data;name=\"media\"; filename=\"" + file.getName() + "\"\r\n")
    .getBytes(), output);
  IOUtils.write("Content-Type: video/mp4 \r\n\r\n".getBytes(), output);
  // 文件正文部分
  // 把文件已流文件的方式 推入到url中
  inputStream = new DataInputStream(new FileInputStream(file));
  IOUtils.copy(inputStream, output);
  // 结尾部分
  IOUtils.write(("--" + boundary + "\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  IOUtils.write("Content-Disposition: form-data; name=\"description\";\r\n\r\n"
    .getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  IOUtils.write(("{\"title\":\"" + title + "\",\"introduction\":\"" + introduction + "\"}")
    .getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
  IOUtils.write(("\r\n--" + boundary + "--\r\n\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING),
    output);
  output.flush();
  result = inputStreamToString(con.getInputStream());
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (ProtocolException e) {
  e.printStackTrace();
 } catch (IOException e) {
  throw new IOException("read data error");
 } finally {
  IOUtils.closeQuietly(output);
  IOUtils.closeQuietly(inputStream);
 }
 return result;
} 

/**
 * 上传Video媒体文件(网络)
 *
 * @param method
 *   请求方法 GET/POST
 * @param path
 *   api的路径
 * @param param
 *   api参数
 * @param mediaPath
 *   待上传的voide 的path
 * @param title
 *   视频标题
 * @param introduction
 *   视频描述
 * @param connTime
 *   连接时间 默认为5000
 * @param readTime
 *   读取时间 默认为5000
 * @return
 * @throws Exception
 */
public static String HttpsUploadVideoMedia(String method, String path, Map<String, String> param, String mediaPath,
  String title, String introduction, int connTime, int readTime) throws Exception {
 String result = null;
 URL url = new URL(setParmas(param, path, ""));
 OutputStream output = null;
 BufferedInputStream inputStream = null;
 try {
  String boundary = "----";
  HttpURLConnection conn = getConnection(method, url);
  conn.setConnectTimeout(connTime == 0 ? DEFAULT_CONNTIME : connTime);
  conn.setReadTimeout(readTime == 0 ? DEFAULT_UPLOAD_READTIME : readTime);
  conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
  output = conn.getOutputStream();
  URL mediaUrl = new URL(mediaPath);
  if (mediaUrl != null) {
   HttpURLConnection mediaConn = (HttpURLConnection) mediaUrl.openConnection();
   mediaConn.setDoOutput(true);
   mediaConn.setUseCaches(false);
   mediaConn.setRequestMethod(SystemConfig.GET_METHOD);
   mediaConn.setConnectTimeout(connTime == 0 ? DEFAULT_CONNTIME : connTime);
   mediaConn.setReadTimeout(readTime == 0 ? DEFAULT_UPLOAD_READTIME : readTime);
   IOUtils.write(("--" + boundary + "\r\n").getBytes(), output);
   IOUtils.write(("Content-Disposition: form-data; name=\"media\"; filename=\"" + getFileName(mediaPath)
     + "\"\r\n").getBytes(), output);
   IOUtils.write("Content-Type: video/mp4 \r\n\r\n".getBytes(), output);
   inputStream = new BufferedInputStream(mediaConn.getInputStream());
   IOUtils.copy(inputStream, output);
   // 结尾部分
   IOUtils.write(("--" + boundary + "\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
   IOUtils.write("Content-Disposition: form-data; name=\"description\";\r\n\r\n"
     .getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
   IOUtils.write(("{\"title\":\"" + title + "\",\"introduction\":\"" + introduction + "\"}")
     .getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING), output);
   IOUtils.write(("\r\n--" + boundary + "--\r\n\r\n").getBytes(SystemConfig.DEFAULT_CHARACTER_ENCODING),
     output);
   mediaConn.disconnect();
   // 获取输入流
   result = inputStreamToString(conn.getInputStream());
  }
 } catch (MalformedURLException e) {
  e.printStackTrace();
 } catch (ProtocolException e) {
  e.printStackTrace();
 } catch (IOException e) {
  throw new IOException("read data error");
 } finally {
  IOUtils.closeQuietly(output);
  IOUtils.closeQuietly(inputStream);
 }
 return result;
}

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

您可能感兴趣的文章:

  • Java微信公众平台开发(15) 微信JSSDK的使用
  • Java微信公众平台开发(14) 微信web开发者工具使用
  • Java微信公众平台开发(12) 微信用户信息的获取
  • Java微信公众平台开发(10) 微信自定义菜单的创建实现
  • Java微信公众平台开发(9) 关键字回复以及客服接口实现
  • Java微信公众平台开发(8) 多媒体消息回复
  • Java微信公众平台开发(7) 公众平台测试帐号的申请
  • Java微信公众平台开发(5) 文本及图文消息回复的实现
  • Java微信公众平台之获取地理位置
  • Java微信公众平台之群发接口(高级群发)
(0)

相关推荐

  • Java微信公众平台开发(5) 文本及图文消息回复的实现

    上篇我们说到回复消息可以根据是否需要上传文件到微信服务器可划分为[普通消息]和[多媒体消息],这里我们来讲述普通消息的回复实现,在消息回复中存在一个关键字段[openid],它是微信用户对于公众号的唯一标识,这里不做过多解释后面将给出时间专门来讲解微信生态中的关键字! (一)回复文本消息 在前面我们已经完成了对消息的分类和回复消息实体的建立,这里回复文本消息需要用到的就是我们的TextMessage,我们把回复文本消息在[文本消息]类型中给出回复!在我们做消息回复的时候需要设置消息的接收人ToU

  • Java微信公众平台之获取地理位置

    本部分需要用到微信的JS-SDK,微信JS-SDK是微信公众平台面向网页开发者提供的基于微信内的网页开发工具包. 通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照.选图.语音.位置等手机系统的能力,同时可以直接使用微信分享.扫一扫.卡券.支付等微信特有的能力,为微信用户提供更优质的网页体验. 官方文档 一.JS-SDK引入 1.先登录微信公众平台进入"公众号设置"的"功能设置"里填写"JS接口安全域名",和网页授权一样只是个域名. 2

  • Java微信公众平台开发(12) 微信用户信息的获取

    前面的文章有讲到微信的一系列开发文章,包括token获取.菜单创建等,在这一篇将讲述在微信公众平台开发中如何获取微信用户的信息,在上一篇我们有说道微信用户和微信公众账号之间的联系可以通过Openid关联,所以在这里我们就采用openid去获取用户微信信息,并实现一个简单场景应用:当微信新用户关注我们的微信公众平台的时候我们自动回复一篇图文消息,然后在图文消息中标题为:[尊敬的:XXX,你好!],而且在图文消息中的图片就是用户的微信头像,如下图: 有关获取微信用户信息的文档我们可以参照:http:

  • Java微信公众平台开发(8) 多媒体消息回复

    之前我们在做消息回复的时候我们对回复的消息简单做了分类,前面也有讲述如何回复[普通消息类型消息],这里将讲述多媒体消息的回复方法,[多媒体消息]包含回复图片消息/回复语音消息/回复视频消息/回复音乐消息,这里以图片消息的回复为例进行讲解! 还记得之前将消息分类的标准就是一种是不需要上传多媒体资源到腾讯服务器的而另外一种是需要的,所以在这里我们所需要做的第一步就是上传资源到腾讯服务器,这里我们调用[素材管理]接口(后面将会有专门的章节讲述)进行图片的上传,同样的这个接口可以提供我们对语音.视频.音

  • Java微信公众平台开发(7) 公众平台测试帐号的申请

    前面几篇一直都在写一些比较基础接口的使用,在这个过程中一直使用的都是我个人微博认证的一个个人账号,原本准备这篇是写[多媒体消息回复]的,后来主要到我个人账号的接口权限不够,所以在这里插入一篇[公众平台测试帐号的申请]的文章,同时也提醒各位开发者一定要注意在开发过程中需要注意接口权限,以防想当然的写完代码才发现接口不能使用,但是同样的我们也可以先预演接口的功能然后再将其应用到实际中! ①登入到微信公众平台,我们到[开发]-->[开发者工具]-->[公众平台测试账号]--进入: 首次进入可能会需要

  • Java微信公众平台开发(14) 微信web开发者工具使用

    为帮助开发者更方便.更安全地开发和调试基于微信的网页,微信推出了 web 开发者工具.它是一个桌面应用,通过模拟微信客户端的表现,使得开发者可以使用这个工具方便地在 PC 或者 Mac 上进行开发和调试工作.你可以: 使用自己的微信号来调试微信网页授权 调试.检验页面的 JS-SDK 相关功能与权限,模拟大部分 SDK 的输入和输出 使用基于 weinre 的移动调试功能 利用集成的 Chrome DevTools 协助开发 该工具界面主要由几大部分组成,如下图所示: 顶部菜单栏是刷新.后退.选

  • Java微信公众平台开发(9) 关键字回复以及客服接口实现

    我们在微信公众号的后台可以发现微信给我们制定了两种模式,一种是开发者模式(也就是我们一直在做的开发),还有一种模式是编辑模式,然而很蛋疼的是有些功能一旦我们切换到开发者模式下就无法使用了,比较典型的就是关键字回复以及服务器无响应的时候返回的[服务器无法响应]等问题 ,这里我给出的解决方案是:①对关键字给出关键字回复的代码实现:②[服务器5s无响应]解决方案是接入多客服,以方便我们的消息处理! (一)关键字自动回复 在前面的文章中我们已经完成对消息回复的分类以及实现,这里说的关键字回复只是对消息回

  • Java微信公众平台之群发接口(高级群发)

    再次吐槽下,微信素材管理和群发这块文档对Java很不友好,此文需要结合我前文和官方文档. 测试号调试群发只需看是否群发消息是否能组装成功,不需要看结果如何(反正不会发送成功的),因为微信还没开放这个功能(估计也不会开放的). 一.群发说明 在公众平台网站上,为订阅号提供了每天一条的群发权限,为服务号提供每月(自然月)4条的群发权限. 1.对于认证订阅号,群发接口每天可成功调用1次,此次群发可选择发送给全部用户或某个标签: 2.对于认证服务号虽然开发者使用高级群发接口的每日调用限制为100次,但是

  • Java微信公众平台开发(10) 微信自定义菜单的创建实现

    自定义菜单这个功能在我们普通的编辑模式下是可以直接在后台编辑的,但是一旦我们进入开发模式之后我们的自定义菜单就需要自己用代码实现,所以对于刚开始接触的人来说可能存在一定的疑惑,这里我说下平时我们在开发模式下常用的两种自定义菜单的实现方式:①不用写实现代码,直接用网页测试工具Post json字符串生成菜单:②就是在我们的开发中用代码实现菜单生成!(参考文档:http://mp.weixin.qq.com/wiki/10/0234e39a2025342c17a7d23595c6b40a.html 

  • Java微信公众平台开发(15) 微信JSSDK的使用

    在前面的文章中有介绍到我们在微信web开发过程中常常用到的 [微信JSSDK中Config配置] ,但是我们在真正的使用中我们不仅仅只是为了配置Config而已,而是要在我们的项目中真正去使用微信JS-SDK给我们带来便捷,那么这里我们就简述如何在微信web开发中使用必要的方法!微信的JS-SDk中为我们提供的方法很多,这里我有一个简单截图如下: 在上图的提供的所有口中我们可以按照接口实现的难易程度分成两个部分: 较易实现:基础接口.分享接口.设备信息接口.地理位置接口.界面操作接口.微信扫一扫

随机推荐