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

1.发送客服消息

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

  • 发消息需要用到的pom依赖

 

<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-open</artifactId>
    <version>3.3.0</version>
</dependency>
<dependency>
    <groupId>com.github.binarywang</groupId>
    <artifactId>weixin-java-mp</artifactId>
    <version>3.3.0</version>
</dependency>
  •  重写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());

    @Autowired
    WechatMpConfigStorage wechatConfigStorage;
    @PostConstruct
    public void init() {
        super.setWxMpConfigStorage(wechatConfigStorage);
    }
    @Autowired
    WechatOpenService wechatOpenService;
    /**
     * 重写token获取方法
     */
    @Override
    public 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());
    @Autowired
    ImServiceImpl Imservice;
    //@Autowired
    //WechatService wechatService;
    @Autowired
    WechatMpService wechatService;
    @Autowired
    WechatOpenService 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中保持key
        try {
            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;
    @Autowired
    private ValueOperations<String, Object> valOps;
    @Autowired
    @Lazy
    private AccessTokenApi accesstokenapi;
    @Autowired
    @Lazy
    private MessageApi messageapi;
    @Autowired
    private FileStorageService fileStorageService;
    @Autowired
    private ImConfig ImConfig;
    @Autowired
    private ImStorageClient ImStorageClient;
    @Autowired
    private WechatMpService wechatservice;


    @Override
    public 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;
    }


    @Override
    public 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);
        }
    }

    @Override
    public 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;
    }

    @Override
    public ImMsg processInMusicMsg(ImMusicMsg inTextMsg) {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public 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;
    }

    @Override
    public 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;
    }

    @Override
    public 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;
    }


    @Override
    public ImMsg processIsNotDefinedMsg(String requestBody) {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public ImMsg processIsNotDefinedEvent(NotDefinedEvent msg) {

        return null;
    }


    @Override
    public AccessTokenApi getAccessTokenApi() {
        return accesstokenapi;
    }


    @Override
    public MessageApi getMessageApi() {
        return messageapi;
    }

    @Autowired
    ImRedisAccessTokenCache Imredisaccesstokencache;
    @Autowired
    ImConfig 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);
        }
    }

    @Override
    public 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;
    }


    @Override
    public ImMsg processInNewsMsg(ImNewsMsg msg) {
        //TODO 图文重新做,不要暴露Imserver
        try {
            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());//Imconfig
                article.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;
    }


    @Override
    public 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;
//    }


    @Override
    public 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;
    }

    @Override
    public 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);
        }

    }

    @Override
    public 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);
        }
    }

    @Override
    public 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);
        }
    }

    @Override
    public 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;
    }


    @Override
    public WxMpTemplateIndustry getIndustry() throws WxErrorException {
        return wechatservice.getTemplateMsgService().getIndustry();
    }


    @Override
    public String sendTemplateMsg(WxMpTemplateMessage templateMessage) throws WxErrorException {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public String addTemplate(String shortTemplateId) throws WxErrorException {
        wechatservice.getTemplateMsgService().addTemplate(shortTemplateId);
        return null;
    }


    @Override
    public List<WxMpTemplate> getAllPrivateTemplate() throws WxErrorException {
        // TODO Auto-generated method stub
        return null;
    }


    @Override
    public boolean delPrivateTemplate(String templateId) throws WxErrorException {
        // TODO Auto-generated method stub
        return false;
    }


    @Override
    public 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);
        }


    }


    @Override
    public 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);
        }

    }


    @Override
    public Object processGetAllTemplateEvent(ImGetAllTemplateEvent msg) {
        try {
            List<WxMpTemplate> industry = wechatservice.getTemplateMsgService().getAllPrivateTemplate();
            return industry;
        } catch (WxErrorException e) {
            throw new ImErrorException(ApiResponseCode.DriverError, e);
        }
    }


    @Override
    public Object processAddTemplateEvent(ImAddTemplateEvent msg) {
        try {
            String templateId = wechatservice.getTemplateMsgService().addTemplate(msg.getTemplateIdShort());
            return templateId;
        } catch (WxErrorException e) {
            throw new ImErrorException(ApiResponseCode.DriverError, e);
        }
    }


    @Override
    public 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发消息是全的,看核心代码即可 。

  • 6
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值