Me gustaría quejarme nuevamente de que la gestión de materiales de WeChat y la publicación de masas no son amigables con Java, y este artículo debe combinarse con mi artículo anterior y documentos oficiales.
Al depurar los números de prueba de envío masivo, solo necesita ver si el mensaje de envío de masas se puede ensamblar con éxito, y no necesita ver el resultado (no se enviará de todos modos), porque WeChat aún no ha abierto esta función (probablemente tampoco esté abierto).
1. Declaración de masa
En el sitio web de la plataforma pública, las cuentas de suscripción se proporcionan un permiso de envío masivo de uno por día, y las cuentas de servicio se proporcionan con cuatro permisos de envío masivo por mes (mes natural).
1. Para las cuentas de suscripción autenticadas, la interfaz de envío de masas se puede llamar con éxito una vez al día. Este envío de masa se puede seleccionar para enviar a todos los usuarios o una determinada etiqueta;
2. Aunque las llamadas diarias del desarrollador que usan la interfaz de envío de masa avanzada se limitan a 100 veces para cuentas de servicio de autenticación, los usuarios solo pueden recibir 4 mensajes por mes. Ya sea en sitios web de plataformas públicas o utilizando interfaces de envío masivo, los usuarios solo pueden recibir 4 mensajes por mes. Más de 4 envíos de masas no se enviarán al usuario;
3. Los desarrolladores pueden establecer activamente ClientMSGID para evitar empuje repetidos.
4. La interfaz de masa limita 60 solicitudes por minuto, y las solicitudes que exceden el límite serán denegadas.
5. La capacidad de insertar su propia cuenta y otras cuentas públicas en los enlaces de texto y mensajes de texto que se han publicado en un artículo de masa.
2. El proceso de envío masivo de mensajes de texto
1. Primero, use la interfaz de imagen en la imagen de carga y el mensaje de texto para cargarla con éxito y obtener la URL de la imagen; Consulte el texto anterior para cargar la imagen y el mensaje de texto para obtener el método de URL
2. Al cargar materiales gráficos y mensajes de texto, utilice la URL de la imagen obtenida en el paso anterior;
3. Use el envío masivo a las etiquetas de usuario o el envío masivo de listas de OpenID para enviar el texto y los mensajes de texto. Durante el envío de masa, WeChat realizará verificación original y devolverá los resultados de la operación de envío de masas;
4. En el proceso anterior, si es necesario, también puede obtener una vista previa de los mensajes gráficos y de texto, consultar el estado de envío de masa o eliminar los mensajes de envío de masa, etc.
3. El proceso de enviar otros tipos de mensajes, como imágenes de masa y textos.
1. Si se trata de un mensaje de texto masivo, simplemente envíelo directamente de acuerdo con las siguientes instrucciones de la interfaz;
2. Si está enviando mensajes como imágenes masivas, videos, etc., debe preparar MediaID con anticipación a través de la interfaz de administración de materiales.
IV. IS_TO_All Descripción
Utilizado para establecer si se enviará a todos los usuarios, el valor es verdadero o falso, seleccione Verdadero, el mensaje se envía a todos los usuarios en el grupo y seleccione Falso para enviar a los usuarios en el grupo especificado de acuerdo con TAG_ID.
5. Dos tipos de métodos de envío de masa
Envío de masa De acuerdo con la etiqueta, el número de suscripción y el número de servicio deben ser autenticados
Interfaz: https://api.weixin.qq.com/cgi-bin/message/mass/sendall?access_token=access_token
El envío masivo de acuerdo con la lista de OpenID solo se aplica a los números de servicio certificados
Interfaz: https://api.weixin.qq.com/cgi-bin/message/mass/send?access_token=access_token
Los datos de la publicación pueden ser mensajes gráficos, texto, voz/audio, imagen, video y mensajes de cupón de tarjeta (todos los lugares donde se usan Media_ID, ahora puede usar el material permanente Media_ID en la gestión de materiales)
1. El Media_ID en la publicación de datos del mensaje de texto debe obtenerse a través de la interfaz de material de texto de carga (https://api.weixin.qq.com/cgi-bin/media/uploadnews?access_token=access_token)
Esto es lo mismo que los datos post de la nueva interfaz de material gráfico permanente en la administración de materiales, pero la interfaz es diferente, y el JSON devuelto tiene un tipo adicional y creó_AT. Consulte el método para agregar material gráfico permanente en mi artículo anterior
2. Media_id en la voz/audio y los datos de la publicación de imágenes deben obtenerse mediante la carga y descarga de la interfaz de archivos multimedia. Consulte el nuevo método de material temporal/permanente en mi artículo anterior
3. Media_id en los datos de la publicación de video es el más problemático. Primero debe obtener Media_ID a través de la interfaz de archivo de carga y descargar multimedia (después de las pruebas, el indicador de error del siguiente paso permanente no es válido Media_ID), y luego obtener un Media_ID a través de la interfaz especial. Este es el Media_ID requerido para el envío de masas.
6. Controlador de muestra a granel
@RequestMapping ("/SendByOpenID") public MassMSMSGresult SendByOpenID () lanza la excepción {// Enviar un mensaje de texto masivo de acuerdo con la lista de OpenID String MediaPath1 = "c: /users/phil/pictures/image/8538572f61d7a94cf0b9fe0f290cdb28.jpgg"; "; UploadMediasResult result1 = httprequtil.uploadtempmedia ("phil_token", "imagen", mediapath1); String MediaPath2 = "c: /users/phil/pictures/image/685977abgw1f8xqp46dgyj20qo0zktfi.jpg"; UploadMediasResult result2 = httprequtil.uploadtempmedia ("phil_token", "imagen", mediapath2); Lista <PloadNewsMedia> array = new ArrayList <> (); UploadNewsMedia entity1 = new uploadNewsMedia (); entity1.setAuthor ("Phil"); Entity1.setContent ("La única experiencia puede entender la vida, solo saber cómo apreciarla, solo saber cómo entenderlo, en su vida, siempre habrá alguien que te haga reír más dulce, y siempre habrá alguien que te haga sentir el más profundo, olvidado, tratándote amablemente"); entity1.setContent_source_url ("http://blog.csdn.net/phil_jing"); // entity1.setDigest ("digest"); entity1.setshow_conver_pic (1); entity1.setthumb_media_id (resultado1.getMedia_id ()); entidad1.Settitle ("Soul Chicken Soup"); array.add (entidad1); UploadNewsMedia entity2 = new uploadNewsMedia (); entity2.setAuthor ("Phil"); Entity2.setContent ("¿Qué es la felicidad? La felicidad es un estado psicológico feliz y un sentimiento de uno mismo. Solo aquellos que pueden hacerse felices en todo momento y en todo son las personas más felices. Las personas más felices son las personas más felices. Las personas que sonríen a menudo son las personas más felices"); entity2.setContent_source_url ("http://www.qq.com"); // entity2.setDigest ("digest"); entity2.setshow_conver_pic (0); entity2.setthumb_media_id (result2.getMedia_id ()); entity2.settitle ("citas clásicas"); array.add (entidad2); UploadMediasResult ur = httprequtil.uploadnewsmedia ("phil_token", matriz); List <String> OpenIds = new ArrayList <> (); OpenIds.Add ("OvHQ5V9-ZSHUCAX_NTCQWIP-SBCG"); OpenIds.Add ("OvHQ5V6CW3INKWUSCL3OLODIF0CC"); MassMSMSGresult result_news = weChatmsgService.sendMpNeWStoopenID ("Phil_Token", OpenIDs, Ur.getMedia_id ()); logger.debug ("Enviar por OpenID Msg {}", result_news.getErrmsg ()); // Enviar un mensaje de texto basado en la lista de OpenID MassmsGresult result_text = weChatmsgService.sendTextToopenid ("Phil_Token", OpenIDs, "¿Qué es la felicidad? La felicidad es un estado psicológico feliz y un sentimiento de uno mismo. Aquellos que pueden hacerse felices en todos los tiempos y en todo son las personas más felices. Las personas más felices son las personas más felices que son las personas que son una sonrisa más feliz"); logger.debug ("Enviar por OpenID msg {}", result_text.getErrmsg ()); regresar nulo; }7. Algunas de las clases y métodos utilizados
Método de envío de masas
/ *** Enviar mensajes de texto basados en la etiqueta* @param AccessToken Token autorizado* @param Entity Mensaje gráfico Objeto* @return*/ public MassMsGresult SendTextToTag (String AccessToken, int Tagid, String Content) {MassMSGresult result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> filterParams = new HashMap <> (); filterparams.put ("is_to_all", falso); filterparams.put ("tag_id", tagid); Map <string, object> textParams = new HashMap <> (); textParams.put ("contenido", contenido); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Filtro", FilterParams); dataparams.put ("text", textParams); dataparams.put ("msgtype", "texto"); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_all_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Mensajes de texto en masa basados en etiquetas * @param accesstoken autorizar token * @param etiqueta tagid * @param mediasid uploadMedia método obtiene * @return * / public MassMSMSGresult sendmpnewstotag (string accessToken, int tagid, string) {MassMsGresulul Result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> filterParams = new HashMap <> (); filterparams.put ("is_to_all", falso); filterparams.put ("tag_id", tagid); Map <string, object> mpnewsparams = new HashMap <> (); mpnewsparams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Filtro", FilterParams); dataparams.put ("mpnews", mpnewsparams); dataparams.put ("msgtype", "mpnews"); dataparams.put ("send_ignore_reprint", 0); // string data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_all_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Imágenes a granel basadas en etiquetas * @param Accesstoken Token autorizado * @param etiqueta tagid * @param mediasID uploadMedia El método obtiene * @return * / public MassMsGresult sendIMageToTag (String AccessToken, int Tagid, String MediaId) {MassMSGresult Result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> filterParams = new HashMap <> (); filterparams.put ("is_to_all", falso); filterparams.put ("tag_id", tagid); Map <string, object> imageParams = new HashMap <> (); ImageParams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Filtro", FilterParams); dataparams.put ("Image", ImageParams); dataparams.put ("msgtype", "imagen"); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_all_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; }/** * Voz en masa/audio basado en la etiqueta * @param accesstoken token autorizado * @param etiqueta tagid * @param mediasid uploadMedia el método obtiene * @return */public MassmsGresult sendvoicetotag (string accessToken, int tagid, string) {MassMsGresulto Result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> filterParams = new HashMap <> (); filterparams.put ("is_to_all", falso); filterparams.put ("tag_id", tagid); Map <string, object> voiceParams = new HashMap <> (); VoiceParams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Filtro", FilterParams); dataparams.put ("Voice", VoiceParams); dataparams.put ("msgtype", "voz"); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_all_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Videos a granel basados en etiquetas * @param accesstoken token autorizado * @param etiqueta tagid * @param mediasid uploadMedia el método obtiene * @return * / public MassmsGresult sendVideOtTag (String AccessToken, int Tagid, String MediaID) {MassMSGresulto resultado = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> filterParams = new HashMap <> (); filterparams.put ("is_to_all", falso); filterparams.put ("tag_id", tagid); Map <string, object> mpVideOparams = new HashMap <> (); mpVideoParams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Filtro", FilterParams); dataparams.put ("mpvideo", mpvideoparams); dataparams.put ("msgtype", "mpvideo"); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_all_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * cupones de tarjeta a granel basados en etiquetas * @param accesstoken token autorizado * @param etiqueta tagid * @param card_id * @return * / public MassmsGresult sendwxCardToTag (string accesstoken, int tagid, string cardid) {massmsgresult result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> filterParams = new HashMap <> (); filterparams.put ("is_to_all", falso); filterparams.put ("tag_id", tagid); Map <string, object> wxCardParams = new HashMap <> (); wxCardParams.put ("Card_id", Cardid); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Filtro", FilterParams); dataparams.put ("wxcard", wxCardParams); dataparams.put ("msgtype", "wxcard"); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_all_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Enviar mensajes de texto en masa basados en OpenID * @param Accesstoken Token autorizado * @param etiqueta tagid * @param mediasid uploadMedia El método obtiene * @return * / public MassMSMSGresult sendmpnewstoopenid (String AccessToken, List <String> OpenIds, String MedialId) {Resultado de MassMsGresult = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> mpnewsparams = new Hashmap <> (); mpnewsparams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Touser", OpenIDS); dataparams.put ("mpnews", mpnewsparams); dataparams.put ("msgtype", "mpnews"); dataparams.put ("send_ignore_reprint", 0); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Mensajes de texto a granel basados en OpenID * @param Accesstoken Autorización Token * @param OpenIds OpenID * @param Content * @return * / public MassMsGresult sendTextTtoopeNID (String AccessToken, List <String> OpenIds, String Content) {MassMsGresult Result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> textParams = new HashMap <> (); textParams.put ("contenido", contenido); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Touser", OpenIDS); dataparams.put ("text", textParams); dataparams.put ("msgtype", "texto"); String data = jsonutil.tojSonstring (dataparams); System.out.println (datos); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Enviar mensajes de voz en masa basados en OpenID * @param Accesstoken Autorización Token * @param OpenIds OpenID * @param Mediaid * @return * / public MassMSMSGresult SendVocietoOpenid (String AccessToken, List <String> OpenIds, String Mediaid) {MassMsGreseL Result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> VoiceParams = new HashMap <> (); VoiceParams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Touser", OpenIDS); dataparams.put ("Voice", VoiceParams); dataparams.put ("msgtype", "voz"); String data = jsonutil.tojSonstring (dataparams); System.out.println (datos); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Mensajes de imagen a granel basados en OpenID * @param Accesstoken Token autorizado * @param OpenIDS OpenID * @param Mediaid * @return * / public MassMsGresult sendIMageToopenID (String AccessToken, List <String> OpenIDS, String MediaID) {MassMsGreseululule Result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> imageParams = new HashMap <> (); ImageParams.put ("Media_id", MediaID); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Touser", OpenIDS); dataparams.put ("Image", ImageParams); dataparams.put ("msgtype", "imagen"); String data = jsonutil.tojSonstring (dataparams); System.out.println (datos); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } /** * Bulk video messages based on OpenId* @param accessToken Authorized token * @param openids openid * @param mpVideoMedia uploadMediaVideo method obtains media * @return */ public MassMsgResult sendVideoToOpenid(String accessToken, List<String> openids, MpVideoMedia mpVideoMedia){ MassMsgResult result = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Touser", OpenIDS); dataparams.put ("mpvideo", mpvideomedia); dataparams.put ("msgtype", "mpvideo"); String data = jsonutil.tojSonstring (dataparams); System.out.println (datos); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; } / ** * Mensaje de cupón de tarjeta de masa basado en OpenID * @param Accesstoken Autorización Token * @param OpenIDS OpenID * @param Mediaid * @return * / public MassMSMSGresult sendwxCardtoopenID (String AccessToken, List <String> OpenIds, String Cardid) {Resultado de MassMsGresult = null; Treemap <String, String> Params = new Treemap <> (); params.put ("access_token", accessToken); // Publicar parámetros enviados map <string, object> wxCardParams = new HashMap <> (); wxCardParams.put ("Card_id", Cardid); Treemap <String, Object> DataParams = new Treemap <> (); dataparams.put ("Touser", OpenIDS); dataparams.put ("wxcard", wxCardParams); dataparams.put ("msgtype", "wxcard"); String data = jsonutil.tojSonstring (dataparams); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.send_mass_message_url, params, data); intente {resultado = jsonutil.FromJSonstring (JSON, MassMsGresult.Class); } catch (Exception e) {E.PrintStackTrace (); } resultado de retorno; }Video Post Data Bean
/ ** * Datos de publicación de video Bean * @author Phil * @Date 20 de septiembre de 2017 * */ public class MpVideomedia {private String Media_ID; título de cadena privada; Descripción de la cadena privada; }Obtener Media_ID en la publicación de Video Mass
/ ** * Get Media_id en la publicación del video masivo * * @param accesstoken * @param uploadvideo * @return */ public static uploadMediasresult uploadMediavideo (String AccessToken, Mpvideomedia Mpvideomedia) {Resultado de uploadMediasResult = null; Treemap <String, String> Params = new Treemap <String, String> (); params.put ("access_token", accessToken); // Publicar parámetros enviados string data = jsonutil.tojSonstring (mpvideomedia); String json = httprequtil.httpsdefaultExeCute (SystemConfig.post_method, wechatconfig.upload_video_media_url, params, data); resultado = jsonutil.FromJSonstring (json, uploadMediasResult.class); resultado de retorno; }Resultados devueltos por masa
paquete com.phil.wechat.msg.model.esp; import com.phil.wechat.base.result.resultState; / *** Resultado devuelto por mensajes de masa* Envío a granel de acuerdo con la lista de OpenID* @author Phil* @Date 2 de julio de 2017**/ public class MassMsGresult extiende ResultState {Tipo de cadena privada; // Los tipos de archivos multimedia incluyen imagen (imagen), voz (voz), video (video) y miniatura (pulgar), y el número de veces es noticias, es decir, mensajes gráficos y de texto, cadena privada msg_id; cadena privada msg_data_id; }Clase de configuración
// Enviar masa por grupo de cadena final pública estática send_all_mass_message_url = "https://api.weixin.qq.com/cgi-bin/message/mass/sendall"; // Enviar mensajes de masa de acuerdo con OpenID (al menos 2 OpenID, hasta 10,000 10,000) Public estática Final String send_mass_message_url = "https://api.weixin.qq.com/cgi-bin/message/mass/send"; // Sube un mensaje gráfico y de texto material public static final String upload_news_media_url = "https://api.weixin.qq.com/cgi-bin/media/uploadnews"; // Get Media_id public static final String upload_video_media_url = "https://api.weixin.qq.com/cgi-bin/media/uploadvideo" en la publicación de videos masivos;
Con respecto al código fuente, espero que te ayude
Lo anterior es todo el contenido de este artículo. Espero que sea útil para el aprendizaje de todos y espero que todos apoyen más a Wulin.com.