微信开放平台第三方授权(第四篇)-wechat发送客服消息

 

1.发送客服消息

上一张介绍了发送消息需要用到的authorizer_access_token,和发送消息的接口结合使用,上面直接上代码。

  •  重写WechatMpService 获取token,这个发消息会用到
package com.test.wechat.service;import com.test.wechat.config.WechatMpConfigStorage;
import com.test.wechat.util.ServletUtil;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.api.impl.WxMpServiceImpl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import javax.annotation.PostConstruct;/*** @author Binary Wang*/
@Service
public class WechatMpService extends WxMpServiceImpl {private final Logger logger = LoggerFactory.getLogger(this.getClass());@AutowiredWechatMpConfigStorage wechatConfigStorage;@PostConstructpublic void init() {super.setWxMpConfigStorage(wechatConfigStorage);}@AutowiredWechatOpenService wechatOpenService;/*** 重写token获取方法*/@Overridepublic String getAccessToken(boolean forceRefresh) throws WxErrorException {logger.info("getAccessToken getKey:{}",ServletUtil.getKey());return wechatOpenService.getAccessToken(ServletUtil.getKey(),forceRefresh);}
}
  •  发出消息用到的的接口
package com.test.controller;import com.test.wechat.service.WechatMpService;
import com.test.wechat.service.WechatOpenService;
import com.test.wechat.service.WechatService;
import me.chanjar.weixin.common.error.WxErrorException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;import com.test.sdk.exception.ImErrorException;
import com.test.sdk.model.result.ApiResponse;
import com.test.sdk.model.result.ApiResponseCode;
import com.test.sdk.model.result.ApiResponseUtil;
import com.test.sdk.service.impl.ImServiceImpl;
import com.test.wechat.util.ServletUtil;@Controller
@RequestMapping("/Im/portal")
public class ImController {private final Logger logger = LoggerFactory.getLogger(this.getClass());@AutowiredImServiceImpl Imservice;//@Autowired//WechatService wechatService;@AutowiredWechatMpService wechatService;@AutowiredWechatOpenService wechatOpenService;/*** Im推送消息的入口*/@ResponseBody@PostMapping(value = "/{key}", produces = "application/json; charset=UTF-8")public ApiResponse post(@PathVariable(name = "key") String key, @RequestBody String requestBody) {this.logger.info("\n接收到来自Im的请求:[{}, {}]", key, requestBody);//在ThreadLocal中保持keytry {ServletUtil.setKey(key);Object route = Imservice.route(requestBody);return ApiResponseUtil.success(route);} catch (ImErrorException e) {ApiResponseCode error = e.getError();Integer statusCode = error.getStatusCode();logger.info("错误状态码 is {},开始强制刷新微信官方token....",statusCode);if (statusCode== 10010) {try {wechatOpenService.getAccessToken(key,true);} catch (WxErrorException e1) {logger.error("40001 42001 40014情况下强制刷新token失败 失败异常信息 为 {}",e1);}}ServletUtil.setKey(key);Object route = Imservice.route(requestBody);return ApiResponseUtil.success(route);} catch (Exception e) {logger.error("catch a Exception ",e);return ApiResponseUtil.error(ApiResponseCode.ERROR, e.getMessage());}}@ResponseBody@GetMapping("/test")public String test() {return "success";}
}
  •  消息处理发送
package com.test.sdk.service;import com.test.sdk.api.AccessTokenApi;
import com.test.sdk.api.MessageApi;
import com.test.sdk.controller.ApiController;
import com.test.sdk.model.msg.*;
import com.test.sdk.model.msg.event.in.*;
import com.test.sdk.model.msg.in.ImMassOpenIdsMessage;
import com.test.sdk.model.msg.in.ImNewsMsg;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;import java.util.List;public interface ImService extends ApiController {/*** 全媒体网管服务器调用唯一入口,即在开发者中心输入的 URL 必须调用此方法*/default Object route(String requestBody) {//TODO  ImMassOpenIdsMessage 需要继承 ImMsg 规范代码if (requestBody.contains("toUsers") && requestBody.contains("mediaId")) {ImMassOpenIdsMessage msg = ImMassOpenIdsMessage.fromjson(requestBody);return processMassOpenIdsMessage(msg, msg.getMsgType(), null);}if (requestBody != null) {ImMsg msg = ImMsg.fromjson(requestBody);if (msg instanceof ImTextMsg) {return processInTextMsg((ImTextMsg) msg);} else if (msg instanceof ImImageMsg) {return processInImageMsg((ImImageMsg) msg);} else if (msg instanceof ImMusicMsg) {return processInMusicMsg((ImMusicMsg) msg);} else if (msg instanceof ImNewsMsg) {return processInNewsMsg((ImNewsMsg) msg);} else if (msg instanceof ImVideoMsg) {return processInVideoMsg((ImVideoMsg) msg);} else if (msg instanceof ImVoiceMsg) {return processInVoiceMsg((ImVoiceMsg) msg);} else if (msg instanceof ImFileMsg) {return processInFileMsg((ImFileMsg) msg);} else if (msg instanceof ImRefreshMenuEvent) {return processInImCreateMenuEvent((ImRefreshMenuEvent) msg);} else if (msg instanceof ImTemplateMsg) {return processInTemplateMsg((ImTemplateMsg) msg);} else if (msg instanceof ImGetUserInfoEvent) {return processGetUserInfoEvent((ImGetUserInfoEvent) msg);} else if (msg instanceof ImBatchGetUserInfoEvent) {return processBatchGetUserInfoEvent((ImBatchGetUserInfoEvent) msg);} else if (msg instanceof ImUserGetEvent) {return processUserGetEvent((ImUserGetEvent) msg);} else if (msg instanceof ImSetIndustryEvent) {return processSetIndustryEvent((ImSetIndustryEvent) msg);} else if (msg instanceof ImGetIndustryEvent) {return processGetIndustryEvent((ImGetIndustryEvent) msg);} else if (msg instanceof ImGetAllTemplateEvent) {return processGetAllTemplateEvent((ImGetAllTemplateEvent) msg);} else if (msg instanceof ImAddTemplateEvent) {return processAddTemplateEvent((ImAddTemplateEvent) msg);} else if (msg instanceof ImDelTemplateEvent) {return processDelTemplateEvent((ImDelTemplateEvent) msg);} else if (msg instanceof NotDefinedEvent) {return processIsNotDefinedEvent((NotDefinedEvent) msg);} else {return processIsNotDefinedMsg(requestBody);}}return null;// 解析消息并根据消息类型分发到相应的处理方法}Object processInFileMsg(ImFileMsg msg);Object processDelTemplateEvent(ImDelTemplateEvent msg);Object processAddTemplateEvent(ImAddTemplateEvent msg);Object processGetAllTemplateEvent(ImGetAllTemplateEvent msg);Object processGetIndustryEvent(ImGetIndustryEvent msg);Object processSetIndustryEvent(ImSetIndustryEvent msg);Object processBatchGetUserInfoEvent(ImBatchGetUserInfoEvent msg);Object processGetUserInfoEvent(ImGetUserInfoEvent msg);Object processUserGetEvent(ImUserGetEvent msg);ImMsg processInNewsMsg(ImNewsMsg msg);// 处理接收到的文本消息ImMsg processInTextMsg(ImTextMsg inTextMsg);ImMsg processInImageMsg(ImImageMsg inTextMsg);ImMsg processInMusicMsg(ImMusicMsg inTextMsg);ImMsg processInVideoMsg(ImVideoMsg inTextMsg);ImMsg processInVoiceMsg(ImVoiceMsg inTextMsg);ImMsg processInImCreateMenuEvent(ImRefreshMenuEvent msg);ImMsg processIsNotDefinedMsg(String requestBody);ImMsg processIsNotDefinedEvent(NotDefinedEvent msg);// 发送文本消息// 群发文本消息AccessTokenApi getAccessTokenApi();MessageApi getMessageApi();//   ImApiConfig getApiConfig();ImMsg processInTemplateMsg(ImTemplateMsg inTemplateMsg);ImMsg processMassOpenIdsMessage(ImMassOpenIdsMessage ImMassOpenIdsMessage, String msgType, String content);/*** <pre>* 设置所属行业* 官方文档中暂未告知响应内容* 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN* </pre>** @return 是否成功*/boolean setIndustry(ImSetIndustryEvent wxMpIndustry) throws WxErrorException;/**** <pre>* 获取设置的行业信息* 详情请见:http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN* </pre>** @return wxMpIndustry*/WxMpTemplateIndustry getIndustry() throws WxErrorException;/*** <pre>* 发送模板消息* 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN* </pre>** @return 消息Id*/String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException;/*** <pre>* 获得模板ID* 从行业模板库选择模板到帐号后台,获得模板ID的过程可在MP中完成* 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN* 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/api_add_template?access_token=ACCESS_TOKEN* </pre>** @param shortTemplateId 模板库中模板的编号,有“TM**”和“OPENTMTM**”等形式* @return templateId 模板Id*/String addTemplate(String shortTemplateId) throws WxErrorException;/*** <pre>* 获取模板列表* 获取已添加至帐号下所有模板列表,可在MP中查看模板列表信息,为方便第三方开发者,提供通过接口调用的方式来获取帐号下所有模板信息* 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN* 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/get_all_private_template?access_token=ACCESS_TOKEN* </pre>** @return templateId 模板Id*/List<WxMpTemplate> getAllPrivateTemplate() throws WxErrorException;/*** <pre>* 删除模板* 删除模板可在MP中完成,为方便第三方开发者,提供通过接口调用的方式来删除某帐号下的模板* 详情请见: http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1433751277&token=&lang=zh_CN* 接口地址格式:https://api.weixin.qq.com/cgi-bin/template/del_private_template?access_token=ACCESS_TOKEN* </pre>** @param templateId 模板Id*/boolean delPrivateTemplate(String templateId) throws WxErrorException;}
  •  ImServiceImpl 实现,参考wx-java-mp代码发送消息部分,下面是核心部分。

 boolean bl = wechatservice.getKefuService().sendKefuMessage(
                    WxMpKefuMessage.TEXT().toUser(inTextMsg.getToUser()).content(
                            inTextMsg.getText().getContent()).build()); 

package com.test.sdk.service.impl;import com.test.sdk.api.AccessTokenApi;
import com.test.sdk.api.MessageApi;
import com.test.sdk.builder.ImGsonBuilder;
import com.test.sdk.config.ImApiConfig;
import com.test.sdk.exception.ImErrorException;
import com.test.sdk.feign.ImStorageClient;
import com.test.sdk.model.msg.*;
import com.test.sdk.model.msg.event.in.*;
import com.test.sdk.model.msg.event.in.Menu.Butten;
import com.test.sdk.model.msg.in.ImMassOpenIdsMessage;
import com.test.sdk.model.msg.in.ImNewsMsg;
import com.test.sdk.model.msg.in.News;
import com.test.sdk.model.result.ApiResponseCode;
import com.test.sdk.service.ImService;
import com.test.wechat.config.ImConfig;
import com.test.wechat.config.ImRedisAccessTokenCache;
import com.test.wechat.service.FileStorageService;
import com.test.wechat.service.WechatMpService;
import com.test.wechat.service.WechatOpenService;
import com.test.wechat.service.WechatService;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.menu.WxMenu;
import me.chanjar.weixin.common.bean.menu.WxMenuButton;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.bean.WxMpMassOpenIdsMessage;
import me.chanjar.weixin.mp.bean.kefu.WxMpKefuMessage;
import me.chanjar.weixin.mp.bean.result.WxMpMassSendResult;
import me.chanjar.weixin.mp.bean.result.WxMpUser;
import me.chanjar.weixin.mp.bean.template.WxMpTemplate;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateData;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateIndustry.Industry;
import me.chanjar.weixin.mp.bean.template.WxMpTemplateMessage;
import me.chanjar.weixin.mp.builder.kefu.NewsBuilder;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.json.JsonParserFactory;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Service;import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;@Service
public class ImServiceImpl implements ImService {private final Logger logger = LoggerFactory.getLogger(this.getClass());public final static String WECHATSERVICEROOT = "WECHATSERVICEROOT:";// @Autowired// private WechatService wechatservice;@Autowiredprivate ValueOperations<String, Object> valOps;@Autowired@Lazyprivate AccessTokenApi accesstokenapi;@Autowired@Lazyprivate MessageApi messageapi;@Autowiredprivate FileStorageService fileStorageService;@Autowiredprivate ImConfig ImConfig;@Autowiredprivate ImStorageClient ImStorageClient;@Autowiredprivate WechatMpService wechatservice;@Overridepublic ImMsg processInTextMsg(ImTextMsg inTextMsg) {try {boolean bl = wechatservice.getKefuService().sendKefuMessage(WxMpKefuMessage.TEXT().toUser(inTextMsg.getToUser()).content(inTextMsg.getText().getContent()).build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e.getError().toString());}return null;}@Overridepublic ImApiConfig getApiConfig() {return this.ImConfig;}public void processWhenDownloadFileFail(ImMsg inMsg) {try {boolean bl = wechatservice.getKefuService().sendKefuMessage(WxMpKefuMessage.TEXT().toUser(inMsg.getToUser()).content("文件下载失败").build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic ImMsg processInImageMsg(ImImageMsg inTextMsg) {try {//File file = getMediaapi().downloadFile(inTextMsg.getImage().getMediaId(),inTextMsg.getImage().getMediaId() + ".jpg");File file = fileStorageService.downloadFile(inTextMsg.getImage().getMediaId(), WxConsts.MediaFileType.IMAGE,inTextMsg.getImage().getMediaId());if (file == null) {processWhenDownloadFileFail(inTextMsg);return null;}WxMediaUploadResult result = wechatservice.getMaterialService().mediaUpload(WxConsts.MediaFileType.IMAGE,file);file.delete();boolean bl = wechatservice.getKefuService().sendKefuMessage(WxMpKefuMessage.IMAGE().toUser(inTextMsg.getToUser()).mediaId(result.getMediaId()).build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}return null;}@Overridepublic ImMsg processInMusicMsg(ImMusicMsg inTextMsg) {// TODO Auto-generated method stubreturn null;}@Overridepublic ImMsg processInVideoMsg(ImVideoMsg inTextMsg) {try {//File file = getMediaapi().downloadFile(inTextMsg.getVideo().getMediaId(), inTextMsg.getVideo().getMediaId() + ".mp4");File file = fileStorageService.downloadFile(inTextMsg.getVideo().getMediaId(), WxConsts.MediaFileType.VIDEO,inTextMsg.getVideo().getMediaId());if (file == null) {processWhenDownloadFileFail(inTextMsg);return null;}WxMediaUploadResult result = wechatservice.getMaterialService().mediaUpload(WxConsts.MediaFileType.VIDEO,file);file.delete();boolean bl = wechatservice.getKefuService().sendKefuMessage(WxMpKefuMessage.VIDEO().toUser(inTextMsg.getToUser()).mediaId(result.getMediaId()).build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}return null;}@Overridepublic Object processInFileMsg(ImFileMsg msg) {try {String content = msg.getFile().getTitle() + "\r\n点击下载:" + ImStorageClient.getImStorageDownloadUrl() + msg.getFile().getMediaId();boolean bl = wechatservice.getKefuService().sendKefuMessage(WxMpKefuMessage.TEXT().toUser(msg.getToUser()).content(content).build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e.getError().toString());}return null;}@Overridepublic ImMsg processInVoiceMsg(ImVoiceMsg inTextMsg) {try {//File file = getMediaapi().downloadFile(inTextMsg.getVoice().getMediaId(), inTextMsg.getVoice().getMediaId() + ".mp3");File file = fileStorageService.downloadFile(inTextMsg.getVoice().getMediaId(), WxConsts.MediaFileType.VOICE,inTextMsg.getVoice().getMediaId());if (file == null) {processWhenDownloadFileFail(inTextMsg);return null;}WxMediaUploadResult result = wechatservice.getMaterialService().mediaUpload(WxConsts.MediaFileType.VOICE,file);file.delete();boolean bl = wechatservice.getKefuService().sendKefuMessage(WxMpKefuMessage.VOICE().toUser(inTextMsg.getToUser()).mediaId(result.getMediaId()).build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}return null;}@Overridepublic ImMsg processIsNotDefinedMsg(String requestBody) {// TODO Auto-generated method stubreturn null;}@Overridepublic ImMsg processIsNotDefinedEvent(NotDefinedEvent msg) {return null;}@Overridepublic AccessTokenApi getAccessTokenApi() {return accesstokenapi;}@Overridepublic MessageApi getMessageApi() {return messageapi;}@AutowiredImRedisAccessTokenCache Imredisaccesstokencache;@AutowiredImConfig Imconfig;private void ImMenuToWxMenu(List<Butten> butten, List<WxMenuButton> buttons) {for (Butten bt : butten) {WxMenuButton wxbt = new WxMenuButton();wxbt.setName(bt.getName());if (bt.getSubbutten() == null || bt.getSubbutten().size() == 0) {wxbt.setType(bt.getType());wxbt.setKey(bt.getKey());wxbt.setUrl(bt.getUrl());if ("miniprogram".equals(bt.getType())) {wxbt.setAppId(bt.getAppid());wxbt.setPagePath(bt.getPagepath());}} else {ImMenuToWxMenu(bt.getSubbutten(), wxbt.getSubButtons());}buttons.add(wxbt);}}@Overridepublic ImMsg processInImCreateMenuEvent(ImRefreshMenuEvent msg) {List<Butten> menu = msg.getMenu().getButten();List<WxMenuButton> buttons = new ArrayList<WxMenuButton>();ImMenuToWxMenu(menu, buttons);WxMenu wxmenu = new WxMenu();wxmenu.setButtons(buttons);try {wechatservice.getMenuService().menuCreate(wxmenu);} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}return null;}@Overridepublic ImMsg processInNewsMsg(ImNewsMsg msg) {//TODO 图文重新做,不要暴露Imservertry {NewsBuilder builder = WxMpKefuMessage.NEWS().toUser(msg.getToUser());List<News.Article> imarticles = msg.getNews().getArticles();for (int i = 0; i < imarticles.size(); i++) {News.Article imarticle = imarticles.get(i);WxMpKefuMessage.WxArticle article = new WxMpKefuMessage.WxArticle();article.setDescription(imarticle.getDescription());//Imconfigarticle.setPicUrl(imarticle.getThumbMediaUrl());article.setTitle(imarticle.getTitle());article.setUrl(imarticle.getArticleUrl());builder.addArticle(article);}boolean bl = wechatservice.getKefuService().sendKefuMessage(builder.build());if (!bl) {throw new ImErrorException(ApiResponseCode.DriverError);}} catch (WxErrorException e) {new ImErrorException(ApiResponseCode.DriverError, e);}return null;}@Overridepublic ImMsg processInTemplateMsg(ImTemplateMsg inTemplateMsg) {logger.info("模板消息接收的参数:" + inTemplateMsg.tojson());WxMpTemplateMessage wxMpTemplateMessage = new WxMpTemplateMessage();wxMpTemplateMessage.setToUser(inTemplateMsg.getToUser());wxMpTemplateMessage.setTemplateId(inTemplateMsg.getTemplateMessage().getTemplateId());wxMpTemplateMessage.setUrl(inTemplateMsg.getTemplateMessage().getUrl());List<TemplateData> templateDataList = inTemplateMsg.getTemplateMessage().getData();List<WxMpTemplateData> dataList = new ArrayList<WxMpTemplateData>();TemplateData templateData = null;for (int i = 0; i < templateDataList.size(); i++) {templateData = templateDataList.get(i);WxMpTemplateData wxMpTemplateData = new WxMpTemplateData();wxMpTemplateData.setColor(templateData.getColor());wxMpTemplateData.setName(templateData.getName());wxMpTemplateData.setValue(templateData.getValue());dataList.add(wxMpTemplateData);}wxMpTemplateMessage.setData(dataList);try {wechatservice.getTemplateMsgService().sendTemplateMsg(wxMpTemplateMessage);} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}return null;}//    @Override
//    public ImMsg processMassOpenIdsMessage(ImMassOpenIdsMessage ImMassOpenIdsMessage) {
//        return null;
//    }@Overridepublic ImMsg processMassOpenIdsMessage(ImMassOpenIdsMessage massOpenIdsMessage, String msgType, String content) {final String url = "https://api.weixin.qq.com/cgi-bin/message/mass/send";try {WxMpMassOpenIdsMessage wxMpMassOpenIdsMessage = new WxMpMassOpenIdsMessage();wxMpMassOpenIdsMessage.setMediaId(massOpenIdsMessage.getMediaId());wxMpMassOpenIdsMessage.setMsgType(msgType);wxMpMassOpenIdsMessage.setContent(content);wxMpMassOpenIdsMessage.setToUsers(massOpenIdsMessage.getToUsers());wxMpMassOpenIdsMessage.setSendIgnoreReprint(false);WxMpMassSendResult massResult = this.wechatservice.getMassMessageService().massOpenIdsMessageSend(wxMpMassOpenIdsMessage);logger.info(massResult.toString());} catch (WxErrorException e) {e.printStackTrace();}return null;}@Overridepublic Object processGetUserInfoEvent(ImGetUserInfoEvent msg) {try {WxMpUser wxMpUser = wechatservice.getUserService().userInfo(msg.getOpenid());return wxMpUser;} catch (WxErrorException e) {logger.error("can not get user info, openid:{}", msg.getOpenid(), e);throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic Object processBatchGetUserInfoEvent(ImBatchGetUserInfoEvent msg) {try {String url = "https://api.weixin.qq.com/cgi-bin/user/info/batchget";Map<String, Object> map = new HashMap<>();map.put("user_list", msg.getUserList());String responseContent = wechatservice.post(url, ImGsonBuilder.create().toJson(map));return JsonParserFactory.getJsonParser().parseMap(responseContent);} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic Object processUserGetEvent(ImUserGetEvent msg) {try {String url = "https://api.weixin.qq.com/cgi-bin/user/get";String responseContent = wechatservice.get(url, "next_openid=" + msg.getNextOpenid());return JsonParserFactory.getJsonParser().parseMap(responseContent);} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic boolean setIndustry(ImSetIndustryEvent msg) throws WxErrorException {wechatservice.getTemplateMsgService().setIndustry(new WxMpTemplateIndustry(new Industry(msg.getPrimaryIndustry().getId(), msg.getPrimaryIndustry().getFirstClass(),msg.getPrimaryIndustry().getSecondClass()),new Industry(msg.getSecondIndustry().getId(), msg.getSecondIndustry().getFirstClass(),msg.getSecondIndustry().getSecondClass())));return false;}@Overridepublic WxMpTemplateIndustry getIndustry() throws WxErrorException {return wechatservice.getTemplateMsgService().getIndustry();}@Overridepublic String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException {// TODO Auto-generated method stubreturn null;}@Overridepublic String addTemplate(String shortTemplateId) throws WxErrorException {wechatservice.getTemplateMsgService().addTemplate(shortTemplateId);return null;}@Overridepublic List<WxMpTemplate> getAllPrivateTemplate() throws WxErrorException {// TODO Auto-generated method stubreturn null;}@Overridepublic boolean delPrivateTemplate(String templateId) throws WxErrorException {// TODO Auto-generated method stubreturn false;}@Overridepublic Object processGetIndustryEvent(ImGetIndustryEvent msg) {try {WxMpTemplateIndustry industry = wechatservice.getTemplateMsgService().getIndustry();Industry primaryIndustry = industry.getPrimaryIndustry();Industry secondIndustry = industry.getSecondIndustry();TemplateIndustry templateIndustry = new TemplateIndustry();templateIndustry.setPrimaryIndustry(new TemplateIndustry.Industry(primaryIndustry.getId(), primaryIndustry.getFirstClass(),primaryIndustry.getSecondClass()));templateIndustry.setSecondIndustry(new TemplateIndustry.Industry(secondIndustry.getId(), secondIndustry.getFirstClass(),secondIndustry.getSecondClass()));return templateIndustry;} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic Object processSetIndustryEvent(ImSetIndustryEvent msg) {WxMpTemplateIndustry industry = new WxMpTemplateIndustry();industry.setPrimaryIndustry(new Industry(msg.getPrimaryIndustry().getId()));industry.setSecondIndustry(new Industry(msg.getSecondIndustry().getId()));try {boolean b = wechatservice.getTemplateMsgService().setIndustry(industry);if (!b) {throw new ImErrorException(ApiResponseCode.DriverError);}return null;} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic Object processGetAllTemplateEvent(ImGetAllTemplateEvent msg) {try {List<WxMpTemplate> industry = wechatservice.getTemplateMsgService().getAllPrivateTemplate();return industry;} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic Object processAddTemplateEvent(ImAddTemplateEvent msg) {try {String templateId = wechatservice.getTemplateMsgService().addTemplate(msg.getTemplateIdShort());return templateId;} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}@Overridepublic Object processDelTemplateEvent(ImDelTemplateEvent msg) {try {boolean b = wechatservice.getTemplateMsgService().delPrivateTemplate(msg.getTemplateId());if (!b) {throw new ImErrorException(ApiResponseCode.DriverError);}return null;} catch (WxErrorException e) {throw new ImErrorException(ApiResponseCode.DriverError, e);}}}

2.总结

例子提供思路,不能直接复制使用,因为有些类缺少,但是微信集成wx-java-mp发消息是全的,看核心代码即可 。

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/443274.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【百度Apollo】探索创新之路:深入了解Apollo开放平台

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下…

VueFire:一个一流的 Vue 和 Firebase 体验,包括对 Nuxt 的支持,现在已经稳定了

VueFire&#xff0c;一个一流的 Vue 和 Firebase 体验 — 包括对 Nuxt 的支持&#xff0c;现在已经稳定了。 Vue 和 Firebase 现在比以往任何时候都更好了。 构建更好的VueFire 去年&#xff0c;我们宣布与 Eduardo San Martin Morote 合作&#xff0c;构建一个成熟的 Vue 和…

【INTEL(ALTERA)】带有浮点单元 (FPU) Nios® V/g 处理器在 英特尔® Cyclone10 GX 设备中执行不正确的浮点运算

说明 由于 英特尔 Quartus Prime Pro Edition 软件版本 23.3 存在一个问题&#xff0c;当使用 Nios V/g 处理器并在 英特尔 Cyclone 10 GX 设备中启用 FPU 时&#xff0c;浮点运算无法按预期进行。 Nios V/g 处理器 – 启用浮点单元 解决方法 请勿在 英特尔 CycloneNios 10 G…

消息中间件之RocketMQ源码分析(三)

RocketMQ中的Consumer启动流程 RocketMQ客户端中有两个独立的消费者实现类分别为DefaultMQPullConsumer和DefaultMQPushConsumer&#xff0c; DefaultMQPullConsumer DefaultMQPullConsumer,该消费者使用时需要用户主动从Broker中Pull消息和消费消息&#xff0c;提交消费位点…

【C/C++】深入理解--函数重载(什么是函数重载?为什么要有函数重载?)

目录 一、前言 二、 函数重载 &#x1f34e;什么是函数重载 &#x1f350;函数重载的条件 &#x1f347;函数重载的注意点 &#x1f349;为什么要有函数重载 &#x1f353;为何C语言不支持函数重载&#xff0c;反倒C可以&#xff1f; &#x1f4a6; Linux环境下演示函数重…

Linux--redhat9创建软件仓库

1.插入光盘&#xff0c;挂载镜像 模拟插入光盘: 点击:虚拟机-可移动设备-CD/DVD 设备状态全选&#xff0c;使用ISO影响文件选择当前版本镜像&#xff0c;点击确认。 2.输入: df -h 可以显示&#xff0c;默认/dev/sr0文件为光盘文件&#xff0c;挂载点为/run/media/root/镜像…

【数据结构 03】循环队列

一、原理 循环队列从功能角度具有队列的性质&#xff0c;即遵从先进先出原则&#xff0c;但是其存储方式是顺序存储。 循环队列的存储空间大小通常都是固定的&#xff0c;通过前指针和尾指针的移动控制循环队列数据的增删。 特征&#xff1a;顺序存储、先进先出、容量有限&a…

CISAW和CISP-PTE证书选择指南

&#x1f4e3;在信息安全领域&#xff0c;选择合适的证书可以为你的职业生涯增添光彩。很多从事信息渗透行业的朋友经常讨论CISP-PTE和CISAW之间的选择问题。今天就从4个方面带你详细了解这两张证书&#xff0c;帮你做出明智的选择&#xff01; 1️⃣证书的行业前景 &#x1f4…

科技云报道:新趋势下,国产数据库或“春山可望”

科技云报道原创。 从540亿元到1286亿元——这是中国通信标准化协会大数据技术标准推进委员会针对中国数据库行业给出的一份预测报告。 报告指出&#xff0c;未来五年&#xff0c;中国数据库行业将从百亿级市场跨越成为千亿级市场。 最近两年&#xff0c;中国的数据库行业似乎…

找企业找客户的小众宝藏网站!私密收藏!

作为一个销售新人&#xff0c;你是否有个疑问&#xff1a;为什么身边的同事&#xff0c;明明都是刚刚进来&#xff0c;觉得和自己差不多&#xff0c;但每天都可以和客户打电话沟通&#xff01;而且打的还不是无效电话&#xff0c;成交量比自己多得多了。 明明自己也去企XX&…

计算机软件能力认证考试CCF-202312-1 仓库规划

#自己跑的测试没问题&#xff0c;不知道为啥就是不能满分 原理比较绕&#xff0c;就是让数组中一行不断地与其他行进行比较&#xff0c;最终得到各自的索引 #include <iostream> using namespace std; int main() {int n;int m;cin>>n>>m; int array[n][m];…

双非本科准备秋招(12.2)—— 力扣栈与队列

复习一下栈和队列的基础知识&#xff0c;刷几道题上上手。 1、102. 二叉树的层序遍历 广度优先遍历嘛&#xff0c;每次拓展一个新结点&#xff0c;就把新结点加入队列&#xff0c;这样遍历完队列中的元素&#xff0c;顺序就是层序遍历。 class Solution {public List<Lis…