java发图⽂_Java公众平台之发接⼝(⾼级
发)
再次吐槽下,素材管理和发这块⽂档对Java很不友好,此⽂需要结合我前⽂和官⽅⽂档。
测试号调试发只需看是否消息是否能组装成功,不需要看结果如何(反正不会发送成功的),因为还没开放这个功能(估计也不会开放的)。
⼀、发说明
在公众平台⽹站上,为提供了每天⼀条的发权限,为服务号提供每⽉(⾃然⽉)4条的发权限。
1、对于认证,发接⼝每天可成功调⽤1次,此次发可选择发送给全部⽤户或某个标签;
2、对于认证服务号虽然开发者使⽤⾼级发接⼝的每⽇调⽤限制为100次,但是⽤户每⽉只能接收4条,⽆论在公众平台⽹站上,还是使⽤接⼝发,⽤户每⽉只能接收4条发消息,多于4条的发将对该⽤户发送失败;
3、开发者可以主动设置 clientmsgid 来避免重复推送。
4、发接⼝每分钟限制请求60次,超过限制的请求会被拒绝。
5、图⽂消息正⽂中插⼊⾃⼰帐号和其他已发⽂章链接的能⼒。
⼆、发图⽂消息过程
1、⾸先,预先将图⽂消息中需要⽤到的图⽚,使⽤上传图⽂消息内图⽚接⼝,上传成功并获得图⽚ URL;参考前⽂的上传图⽂消息内的图⽚获取URL⽅法
2、上传图⽂消息素材,需要⽤到图⽚时,请使⽤上⼀步获取的图⽚ URL;
3、使⽤对⽤户标签的发,或对 OpenID 列表的发,将图⽂消息发出去,发时会进⾏原创校验,并返回发操作结果;
4、在上述过程中,如果需要,还可以预览图⽂消息、查询发状态,或删除已发的消息等。
三、发图⽚、⽂本等其他消息类型的过程
1、如果是发⽂本消息,则直接根据下⾯的接⼝说明进⾏发即可;
2、如果是发图⽚、视频等消息,则需要预先通过素材管理接⼝准备好 mediaID。
四、is_to_all说明
⽤于设定是否向全部⽤户发送,值为true或false,选择true该消息发给所有⽤户,选择false可根据tag_id发送给指定组的⽤户。
五、两种发⽅式
根据标签进⾏发,与服务号必须通过认证
根据OpenID列表发,只适⽤于认证后的服务号
post数据可以是图⽂消息、⽂本、语⾳/⾳频、图⽚、视频、卡券消息(所有使⽤到media_id的地⽅,现在都可以使⽤素材管理中的永久素材media_id了)
这个跟素材管理⾥的新增永久图⽂素材接⼝post数据⼀样,只是接⼝不⼀样、返回的json多了⼀个type和created_at,参考我前⽂的新增永久图⽂素材⽅法
2、语⾳/⾳频、图⽚post数据中的media_id需要通过上传下载多媒体⽂件接⼝获得,参考我前⽂的新增临时/永久素材⽅法
3、视频post数据中的media_id最⿇烦,先得通过上传下载多媒体⽂件接⼝获取到media_id(经测试,永久的下⼀步报错提⽰⽆效
media_id),然后再通过特别接⼝再获取到⼀个media_id,这才是发所需要的media_id
六、发⽰例Controller
@RequestMapping("/sendByOpenid")
public MassMsgResult sendByOpenid() throws Exception {
// 根据OpenID列表发图⽂消息
String mediaPath1 = "C:/Users/phil/Pictures/image/8538572f61d7a94cf0b9fe0f290cdb28.jpg";
UploadMediasResult result1 = HttpReqUtil.uploadTempMedia("phil_token", "image", mediaPath1);
String mediaPath2 = "C:/Users/phil/Pictures/image/685977abgw1f8xqp46dgyj20qo0zktfi.jpg";
UploadMediasResult result2 = HttpReqUtil.uploadTempMedia("phil_token", "image", mediaPath2);
List array = new ArrayList<>();
UploadNewsMedia entity1 = new UploadNewsMedia();
entity1.setAuthor("phil");
entity1.setContent("⼈⽣只有经历才会懂得,只有懂得才知道珍惜,⼀⽣中,总会有⼀个⼈让你笑得最甜,也总会有⼀个⼈让你痛得最深,忘记,是善待⾃⼰");
entity1.setContent_source_url("blog.csdn/phil_jing");
// entity1.setDigest("digest");
entity1.setShow_conver_pic(1);
entity1.setThumb_media_Media_id());
entity1.setTitle("⼼灵鸡汤");
array.add(entity1);
UploadNewsMedia entity2 = new UploadNewsMedia();
entity2.setAuthor("phil");
entity2.setContent("什么是幸福,幸福就是⾃⼰的⼀种愉快的⼼理状态和感受。时时、事事都能使⾃⼰快乐的⼈才是最幸福的⼈。最快乐的⼈,就是最幸福的⼈。笑⼝常开的⼈,是最幸福的。");
entity2.setContent_source_url("www.qq");
// entity2.setDigest("digest");
entity2.setShow_conver_pic(0);
entity2.setThumb_media_Media_id());
entity2.setTitle(" 经典语录");
array.add(entity2);
UploadMediasResult ur = HttpReqUtil.uploadNewsMedia("phil_token", array);
List openids = new ArrayList<>();
openids.add("ovHQ5v9-ZsHUcax_nTCQwiP-sBcg");
openids.add("ovHQ5v6CW3INkWUsCl3olODif0cc");
MassMsgResult result_news = wechatMsgService.sendMpnewsToOpenid("phil_token", openids,
logger.debug(" send by openid msg {} " ,Errmsg());
// 根据OpenID列表发⽂字消息
MassMsgResult result_text = wechatMsgService.sendTextToOpenid("phil_token", openids,
"什么是幸福,幸福就是⾃⼰的⼀种愉快的⼼理状态和感受。时时、事事都能使⾃⼰快乐的⼈才是最幸福的⼈。最快乐的⼈,就是最幸福的⼈。笑⼝常开的⼈,是最幸福的");
logger.debug(" send by openid msg {} " ,Errmsg());
return null;
}
七、部分⽤到的类和⽅法
发⽅法
/**
* 根据标签进⾏发⽂本消息
* @param accessToken 授权token
* @param entity 图⽂消息对象
* @return
*/
public MassMsgResult sendTextToTag(String accessToken, int tagId, String content){
MassMsgResult result = null;
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
Map filterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
Map textParams = new HashMap<>();
textParams.put("content", content);
TreeMap dataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("text", textParams);
dataParams.put("msgtype", "text");
String data = JsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD,
WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);怎么发信息
} catch (Exception e) {
e.printStackTrace();
return result;
}
/**
* 根据标签进⾏发图⽂消息
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia⽅法获得
* @return
*/
public MassMsgResult sendMpnewsToTag(String accessToken, int tagId, String mediaId){
MassMsgResult result = null;
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
Map filterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
Map mpnewsParams = new HashMap<>();
mpnewsParams.put("media_id", mediaId);
TreeMap dataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("mpnews", mpnewsParams);
dataParams.put("msgtype", "mpnews");
dataParams.put("send_ignore_reprint", 0);//不能省略
String data = JsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
/**
* 根据标签进⾏发图⽚
* @param accessToken 授权token
* @param tagId 标签
* @param mediaId uploadMedia⽅法获得
* @return
*/
public MassMsgResult sendImageToTag(String accessToken, int tagId, String mediaId){
MassMsgResult result = null;
TreeMap params = new TreeMap<>();
params.put("access_token", accessToken);
// post 提交的参数
Map filterParams = new HashMap<>();
filterParams.put("is_to_all", false);
filterParams.put("tag_id", tagId);
Map imageParams = new HashMap<>();
imageParams.put("media_id", mediaId);
TreeMap dataParams = new TreeMap<>();
dataParams.put("filter", filterParams);
dataParams.put("image", imageParams);
dataParams.put("msgtype", "image");
String data = JsonString(dataParams);
String json = HttpReqUtil.HttpsDefaultExecute(SystemConfig.POST_METHOD, WechatConfig.SEND_ALL_MASS_MESSAGE_URL, params, data);
try {
result = JsonUtil.fromJsonString(json, MassMsgResult.class);
} catch (Exception e) {
e.printStackTrace();
}
return result;
}
/**
* 根据标签进⾏发语⾳/⾳频