消息推送之微信模板消息

微服務(wù)中消息推送模塊脯颜,一般消息推送分為微信模板消息、阿里云短信贩据、APP消息推送栋操,APP消息推送選擇個(gè)推,本文主要介紹微信消息模板

  • 引入maven(具體版本具體引入)
    <dependency>
        <groupId>com.github.binarywang</groupId>
        <artifactId>weixin-java-mp</artifactId>
        <version>3.3.0</version>
    </dependency>
  • yml配置文件配置微信賬號(hào)基本信息
#微信參數(shù)設(shè)置
wx:
  msg:
    #參數(shù)配置
    appid: wx1cXXXXad983
    secret: 4269XXXX9e3df3c6af03833
    AESKey: JykXXXX4+=@
  • 創(chuàng)建模板實(shí)體類
    WxTemplate.java
/**
 * 實(shí)體類
 *
 * @author myn
 * @since 2021-10-12
 */
@Data
@TableName("message_wx_template")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "WxTemplate對(duì)象", description = "WxTemplate對(duì)象")
public class WxTemplate extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /**
    * 主鍵
    */
        @ApiModelProperty(value = "主鍵")
        private Long id;
    /**
    * 模板id
    */
        @ApiModelProperty(value = "模板id")
        private String tid;
    /**
    * 關(guān)鍵字列表,最多支持5個(gè)乐设,最少2個(gè)
    */
        @ApiModelProperty(value = "關(guān)鍵字列表,最多支持5個(gè)讼庇,最少2個(gè)")
        private String kidList;
    /**
    * 服務(wù)場(chǎng)景描述,15個(gè)字以內(nèi)
    */
        @ApiModelProperty(value = "服務(wù)場(chǎng)景描述近尚,15個(gè)字以內(nèi)")
        private String sceneDesc;
    /**
    * 審核結(jié)果蠕啄。0--未通過(guò),1--通過(guò)
    */
        @ApiModelProperty(value = "審核結(jié)果。0--未通過(guò)歼跟,1--通過(guò)")
        private String reviewStatus;
    /**
    * 生成的模板id
    */
        @ApiModelProperty(value = "生成的模板id")
        private String templateId;
    /**
    * 模板類型和媳。0--一次性訂閱,1--永久性推送
    */
        @ApiModelProperty(value = "模板類型哈街。0--一次性訂閱留瞳,1--永久性推送")
        private String type;
    /**
    * 模板標(biāo)題
    */
        @ApiModelProperty(value = "模板標(biāo)題")
        private String title;
    /**
    * 模板類目id
    */
        @ApiModelProperty(value = "模板類目id")
        private Integer categoryId;
    /**
    * 模板類目名稱
    */
        @ApiModelProperty(value = "模板類目名稱")
        private String categoryName;
    /**
    * 租戶標(biāo)識(shí)
    */
        @ApiModelProperty(value = "租戶標(biāo)識(shí)")
        private String tenant;
    /**
    * 排序
    */
        @ApiModelProperty(value = "排序")
        private Integer sort;


}

WxTemplateData.java

/**
 * 實(shí)體類
 *
 * @author myn
 * @since 2021-10-13
 */
@Data
@TableName("message_wx_template_data")
@EqualsAndHashCode(callSuper = true)
@ApiModel(value = "WxTemplateData對(duì)象", description = "WxTemplateData對(duì)象")
public class WxTemplateData extends BaseEntity {

    private static final long serialVersionUID = 1L;

    /**
    * id
    */
        @ApiModelProperty(value = "id")
        private Long id;
    /**
    * 生成的模板id,如TbZwosLXXXXXXfTP27E
    */
        @ApiModelProperty(value = "生成的模板id骚秦,如TbZwosLXXXXXXfTP27E")
        private String templateId;
    /**
    * 模板id她倘,如“2269”
    */
        @ApiModelProperty(value = "模板id,如“2269”")
        private String tid;
    /**
     * 用戶ID
     */
    @ApiModelProperty(value = "用戶ID")
    private String openId;
    /**
     * 跳轉(zhuǎn)頁(yè)面
     */
    @ApiModelProperty(value = "跳轉(zhuǎn)頁(yè)面")
    private String page;
    /**
     * 跳轉(zhuǎn)小程序類型:developer為開(kāi)發(fā)版作箍;trial為體驗(yàn)版硬梁;formal為正式版;默認(rèn)為正式版
     */
    @ApiModelProperty(value = "跳轉(zhuǎn)小程序類型:developer為開(kāi)發(fā)版胞得;trial為體驗(yàn)版荧止;formal為正式版;默認(rèn)為正式版")
    private String miniprogramState;
    /**
     * 進(jìn)入小程序查看”的語(yǔ)言類型阶剑,支持zh_CN(簡(jiǎn)體中文)跃巡、en_US(英文)、zh_HK(繁體中文)牧愁、zh_TW(繁體中文)素邪,默認(rèn)為zh_CN
     返回值
     */
    @ApiModelProperty(value = "進(jìn)入小程序查看”的語(yǔ)言類型,支持zh_CN(簡(jiǎn)體中文)递宅、en_US(英文)娘香、zh_HK(繁體中文)、zh_TW(繁體中文)办龄,默認(rèn)為zh_CN 返回值")
    private String lang;
    /**
    * 關(guān)鍵字id烘绽,如 1
    */
        @ApiModelProperty(value = "關(guān)鍵字id,如 1 ")
        private String kid1;
    /**
    * 關(guān)鍵字名稱俐填,如“商品名稱”
    */
        @ApiModelProperty(value = "關(guān)鍵字名稱安接,如“商品名稱”")
        private String kidName1;
    /**
    * 關(guān)鍵字的key。如”thing1“英融,微信后臺(tái)獲取
    */
        @ApiModelProperty(value = "關(guān)鍵字的key盏檐。如”thing1“,微信后臺(tái)獲取")
        private String kidDataKey1;
    /**
     * 關(guān)鍵字發(fā)送的內(nèi)容
     */
    @ApiModelProperty(value = "關(guān)鍵字發(fā)送的內(nèi)容")
    private String kidData1;
    /**
    * 關(guān)鍵字id驶悟,如 1
    */
        @ApiModelProperty(value = "關(guān)鍵字id胡野,如 1 ")
        private String kid2;
    /**
    * 關(guān)鍵字名稱,如“商品名稱”
    */
        @ApiModelProperty(value = "關(guān)鍵字名稱痕鳍,如“商品名稱”")
        private String kidName2;
    /**
    * 關(guān)鍵字的key硫豆。如”thing1“龙巨,微信后臺(tái)獲取
    */
        @ApiModelProperty(value = "關(guān)鍵字的key。如”thing1“熊响,微信后臺(tái)獲取")
        private String kidDataKey2;
    /**
     * 關(guān)鍵字發(fā)送的內(nèi)容
     */
    @ApiModelProperty(value = "關(guān)鍵字發(fā)送的內(nèi)容")
    private String kidData2;
    /**
    * 關(guān)鍵字id旨别,如 1
    */
        @ApiModelProperty(value = "關(guān)鍵字id,如 1 ")
        private String kid3;
    /**
    * 關(guān)鍵字名稱汗茄,如“商品名稱”
    */
        @ApiModelProperty(value = "關(guān)鍵字名稱秸弛,如“商品名稱”")
        private String kidName3;
    /**
    * 關(guān)鍵字的key。如”thing1“洪碳,微信后臺(tái)獲取
    */
        @ApiModelProperty(value = "關(guān)鍵字的key递览。如”thing1“,微信后臺(tái)獲取")
        private String kidDataKey3;
    /**
     * 關(guān)鍵字發(fā)送的內(nèi)容
     */
    @ApiModelProperty(value = "關(guān)鍵字發(fā)送的內(nèi)容")
    private String kidData3;
    /**
    * 關(guān)鍵字id瞳腌,如 1
    */
        @ApiModelProperty(value = "關(guān)鍵字id非迹,如 1 ")
        private String kid4;
    /**
    * 關(guān)鍵字名稱,如“商品名稱”
    */
        @ApiModelProperty(value = "關(guān)鍵字名稱纯趋,如“商品名稱”")
        private String kidName4;
    /**
    * 關(guān)鍵字的key。如”thing1“冷离,微信后臺(tái)獲取
    */
        @ApiModelProperty(value = "關(guān)鍵字的key吵冒。如”thing1“,微信后臺(tái)獲取")
        private String kidDataKey4;
    /**
     * 關(guān)鍵字發(fā)送的內(nèi)容
     */
    @ApiModelProperty(value = "關(guān)鍵字發(fā)送的內(nèi)容")
    private String kidData4;
    /**
    * 關(guān)鍵字id西剥,如 1
    */
        @ApiModelProperty(value = "關(guān)鍵字id痹栖,如 1 ")
        private String kid5;
    /**
    * 關(guān)鍵字名稱绣硝,如“商品名稱”
    */
        @ApiModelProperty(value = "關(guān)鍵字名稱路幸,如“商品名稱”")
        private String kidName5;
    /**
    * 關(guān)鍵字的key爽待。如”thing1“鸯旁,微信后臺(tái)獲取
    */
        @ApiModelProperty(value = "關(guān)鍵字的key袖迎。如”thing1“松邪,微信后臺(tái)獲取")
        private String kidDataKey5;
    /**
     * 關(guān)鍵字發(fā)送的內(nèi)容
     */
    @ApiModelProperty(value = "關(guān)鍵字發(fā)送的內(nèi)容")
    private String kidData5;
    /**
     * 租戶標(biāo)識(shí)
     */
    @ApiModelProperty(value = "租戶標(biāo)識(shí)")
    private String tenant;


}
  • service實(shí)現(xiàn)類携狭,主要實(shí)現(xiàn)微信模板的增刪改查
/**
 * 服務(wù)實(shí)現(xiàn)類
 *
 * @author myn
 * @since 2021-10-12
 */
@Service
public class WxTemplateServiceImpl extends BaseServiceImpl<WxTemplateMapper, WxTemplate> implements IWxTemplateService {
    
    @Autowired
    private PlatformTransactionManager platformTransactionManager;
    @Autowired
    private TransactionDefinition transactionDefinition;

    @Override
    public IPage<WxTemplateVO> selectWxTemplatePage(IPage<WxTemplateVO> page, WxTemplateVO wxTemplate) {
        return page.setRecords(baseMapper.selectWxTemplatePage(page, wxTemplate));
    }

    @Override
    public JSONObject addWxTemplate(WxTemplate wxTemplate) {

        String accessToken = GetAccessToken.getAccessToken();
        String tid = wxTemplate.getTid();
        char[] kidList = wxTemplate.getKidList().toCharArray();
        String sceneDesc = wxTemplate.getSceneDesc();

        String url = "https://api.weixin.qq.com/wxaapi/newtmpl/addtemplate?access_token="
                + accessToken;
        wxTemplate.setReviewStatus("0");
        Map<String, String> map = new HashMap<>();
        map.put("tid", tid);
        map.put("kidList", Arrays.toString(kidList));
        map.put("sceneDesc", sceneDesc);
        //租戶標(biāo)識(shí)
        wxTemplate.setTenant("");
        JSONObject object = null;
        R<Object> resp = R.status(this.save(wxTemplate));
        if (resp.getCode() == 200) {
            String result = HttpUtil.sendPost(url, map);
            object = JSON.parseObject(result);
            if (object.get("errcode") == "0") {
                String tempid = object.get("priTmplId").toString();
                wxTemplate.setTemplateId(tempid);
                wxTemplate.setReviewStatus("1");
                R.status(this.updateById(wxTemplate));
            } else {
                return object;
            }
        } else {
            return JSONObject.parseObject(String.valueOf(resp));
        }
        return object;
    }

    @Override
    public JSONObject delWxTemplate(String id, String templateId) {
        String accessToken = GetAccessToken.getAccessToken();
        TransactionStatus transaction = platformTransactionManager.getTransaction(transactionDefinition);

        String url = "https://api.weixin.qq.com/wxaapi/newtmpl/deltemplate?access_token="
                + accessToken;
        JSONObject object = null;
        Map<String, String> map = new HashMap<>();
        map.put("priTmplId", templateId);
        try {
            R<Object> resp = R.status(this.deleteLogic(Func.toLongList(id)));
            if (resp.getCode() == 200) {
                String result = HttpUtil.sendPost(url, map);
                object = JSON.parseObject(result);
                if (object.get("errcode") == "0") {
                    platformTransactionManager.commit(transaction);
                    return object;
                } else {
                    return object;
                }
            } else {
                return JSONObject.parseObject(String.valueOf(resp));
            }
        } catch (Exception e) {
            platformTransactionManager.rollback(transaction);
            e.printStackTrace();
        }
        assert object != null;
        return object;
    }

    @Override
    public JSONObject getCategory() {
        String accessToken = GetAccessToken.getAccessToken();

        String url = "https://api.weixin.qq.com/wxaapi/newtmpl/getcategory?access_token="
                + accessToken;
        String result = HttpUtil.sendGet(url);
        return JSON.parseObject(result);
    }

    @Override
    public JSONObject getPubTemplateKeyWordsById(String tid) {
        String accessToken = GetAccessToken.getAccessToken();

        String url = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatekeywords?access_token="
                + accessToken
                + "&tid="
                + tid;
        String result = HttpUtil.sendGet(url);
        return JSON.parseObject(result);
    }

    @Override
    public JSONObject getPubTemplateTitleList(String ids, int start, int limit) {
        String accessToken = GetAccessToken.getAccessToken();

        String url = "https://api.weixin.qq.com/wxaapi/newtmpl/getpubtemplatetitles?access_token="
                + accessToken
                + "&ids="
                + ids
                + "&start="
                + start
                + "&limit="
                + limit;
        String result = HttpUtil.sendGet(url);
        return JSON.parseObject(result);
    }

    @Override
    public JSONObject getTemplateList() {
        String accessToken = GetAccessToken.getAccessToken();

        String url = "https://api.weixin.qq.com/wxaapi/newtmpl/gettemplate?access_token="
                + accessToken;
        String result = HttpUtil.sendGet(url);
        return JSON.parseObject(result);
    }

    @Override
    public Map<String,String> getTemplateId(){
        JSONArray js = (JSONArray) getTemplateList().get("data");
        Map<String,String> map = new HashMap<>();
        for (int i=0;i<js.size();i++){
            map.put(js.getJSONObject(i).get("priTmplId").toString(),js.getJSONObject(i).get("title").toString());
        }
        return map;
    }
}

微信消息的服務(wù)實(shí)現(xiàn)類

/**
 * 服務(wù)實(shí)現(xiàn)類
 *
 * @author myn
 * @since 2021-10-13
 */
@Service
public class WxTemplateDataServiceImpl extends BaseServiceImpl<WxTemplateDataMapper, WxTemplateData> implements IWxTemplateDataService {

    @Autowired
    private IWxAcceptsingleService wxAcceptsingleService;

    private WxMaMsgService msgService;


    public WxTemplateDataServiceImpl() {
    }

    Log log = LogFactory.get();

    @Override
    public IPage<WxTemplateDataVO> selectWxTemplateDataPage(IPage<WxTemplateDataVO> page, WxTemplateDataVO wxTemplateData) {
        return page.setRecords(baseMapper.selectWxTemplateDataPage(page, wxTemplateData));
    }

    /**
     * 獲取需要填寫(xiě)的關(guān)鍵字列表
     *
     * @param templateId
     * @return 關(guān)鍵字的鍵值對(duì)
     * @author huan
     */
    @Override
    public Map<String, String> getDataList(String templateId) {
        WxTemplateData wxTemplateData = baseMapper.selectWxTemplateDataParam(templateId);
        Map<String, String> map = new HashMap<>();
        map.put(wxTemplateData.getKidName1(), wxTemplateData.getKidDataKey1());
        map.put(wxTemplateData.getKidName2(), wxTemplateData.getKidDataKey2());
        map.put(wxTemplateData.getKidName3(), wxTemplateData.getKidDataKey3());
        map.put(wxTemplateData.getKidName4(), wxTemplateData.getKidDataKey4());
        map.put(wxTemplateData.getKidName5(), wxTemplateData.getKidDataKey5());
        //去掉空的KEY和Value缸兔,返回有數(shù)值的map
        MapRemoveNullUtil.removeNullEntry(map);
        System.out.println(map);
        return map;
    }

    /**
     * 發(fā)送消息
     *
     * @param wxTemplateData
     * @return 返回信息的String
     * @throws Exception
     * @author huan
     */
    @Override
    public String sendMsg(WxTemplateData wxTemplateData) throws Exception {
        Map<String, String> map = new HashMap<>();
        map.put(wxTemplateData.getKidDataKey1(), wxTemplateData.getKidData1());
        map.put(wxTemplateData.getKidDataKey2(), wxTemplateData.getKidData2());
        map.put(wxTemplateData.getKidDataKey3(), wxTemplateData.getKidData3());
        map.put(wxTemplateData.getKidDataKey4(), wxTemplateData.getKidData4());
        map.put(wxTemplateData.getKidDataKey5(), wxTemplateData.getKidData5());
        //去掉空的鍵值對(duì)
        MapRemoveNullUtil.removeNullEntry(map);
        List<Map<String, String>> data = new ArrayList<>();
        data.add(map);
        //根據(jù),分割傳進(jìn)來(lái)的多個(gè)openid
        String[] templateId = wxTemplateData.getTemplateId().split(",");
        net.sf.json.JSONObject jsonResult = new JSONObject();
        //foreach發(fā)送
        for (String id : templateId) {
            Template template = new Template();
            template.setTemplate_id(id);
            template.setTouser(wxTemplateData.getOpenId());
            template.setPage(wxTemplateData.getPage());
            List<TemplateParam> paras = new ArrayList<>(data.size());
            //轉(zhuǎn)換成{things:{value:"things"}}形式
            for (Map<String, String> m : data) {
                for (String k : m.keySet()) {
                    paras.add(new TemplateParam(k, m.get(k)));
                }
            }
            template.setTemplateParamList(paras);
            //拼接鏈接
            String requestUrl = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=ACCESS_TOKEN";
            requestUrl = requestUrl.replace("ACCESS_TOKEN", GetAccessToken.getAccessToken());
            log.info("鏈接地址:{}", template.toJSON());
            //獲取返回信息
            jsonResult = CommonUtil.httpsRequest(requestUrl, "POST", template.toJSON());
            log.info("返回消息:{}", jsonResult);
            int errorCode = jsonResult.getInt("errcode");
            String errorMessage = jsonResult.getString("errmsg");
            if (errorCode == 0) {
                //發(fā)送成功
                log.info("給{}發(fā)送的消息成功,返回消息:{}", id, jsonResult.toString());
                //記錄存庫(kù)
                WxAcceptsingle wxAcceptsingle = new WxAcceptsingle();
                wxAcceptsingle.setData(data.toString());
                wxAcceptsingle.setLang(WxMaConstants.MiniprogramLang.ZH_CN);
                wxAcceptsingle.setMiniprogramState(WxMaConstants.MiniprogramState.FORMAL);
                wxAcceptsingle.setAccessToken(GetAccessToken.getAccessToken());
                wxAcceptsingle.setPage(wxTemplateData.getPage());
                wxAcceptsingle.setSendStatus("1");
                wxAcceptsingle.setTouser(wxTemplateData.getOpenId());
                wxAcceptsingle.setTenant(AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId()));
                R.status(this.wxAcceptsingleService.save(wxAcceptsingle));
            } else {
                //發(fā)送失敗旧找,不進(jìn)行終止溺健,日志記錄后繼續(xù)發(fā)送下一個(gè)
                log.warn("訂閱消息發(fā)送失敗" + errorCode + "," + errorMessage);
            }
        }
        return jsonResult.toString();
    }

    /**
     * 利用租戶字段進(jìn)行增刪改查測(cè)試
     * 查詢測(cè)試
     *
     * @return
     */
    @Override
    public List<WxTemplateData> selectList() {
        QueryWrapper<WxTemplateData> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("tenant", AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId()));
        String a = AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId());
        System.out.println(a);

        return baseMapper.selectList(queryWrapper);
    }

    /**
     * 利用租戶字段進(jìn)行增刪改查測(cè)試
     * 刪除測(cè)試
     * @author huan
     * @return 1為刪除成功,0為刪除失敗
     */
    @Override
    public int deleteByEntity(String id) {
        QueryWrapper<WxTemplateData> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("tenant", AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId()))
            .eq("id", id);
        String a = AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId());
        System.out.println(a);
        return baseMapper.delete(queryWrapper);
    }
}
  • 控制器
    這個(gè)就很簡(jiǎn)單了钮蛛,中間建立接口實(shí)現(xiàn)調(diào)用
    WxTemplateController.java
/**
 * 控制器
 *
 * @author myn
 * @since 2021-10-12
 */
@RestController
@AllArgsConstructor
@RequestMapping("/wxtemplate")
@Api(value = "", tags = "接口")
public class WxTemplateController extends BladeController {

    private IWxTemplateService wxTemplateService;

    /**
     * 詳情
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "詳情", notes = "傳入wxTemplate")
    public R<WxTemplateVO> detail(WxTemplate wxTemplate) {
        WxTemplate detail = wxTemplateService.getOne(Condition.getQueryWrapper(wxTemplate));
        return R.data(WxTemplateWrapper.build().entityVO(detail));
    }

    /**
     * 分頁(yè)
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分頁(yè)", notes = "傳入wxTemplate")
    public R<IPage<WxTemplateVO>> list(WxTemplate wxTemplate, Query query) {
        IPage<WxTemplate> pages = wxTemplateService.page(Condition.getPage(query), Condition.getQueryWrapper(wxTemplate));
        return R.data(WxTemplateWrapper.build().pageVO(pages));
    }


    /**
     * 自定義分頁(yè)
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分頁(yè)", notes = "傳入wxTemplate")
    public R<IPage<WxTemplateVO>> page(WxTemplateVO wxTemplate, Query query) {
        IPage<WxTemplateVO> pages = wxTemplateService.selectWxTemplatePage(Condition.getPage(query), wxTemplate);
        return R.data(pages);
    }

    /**
     * 新增
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "傳入wxTemplate")
    public R save(@Valid @RequestBody WxTemplate wxTemplate) {
        return R.status(wxTemplateService.save(wxTemplate));
    }

    /**
     * 修改
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "傳入wxTemplate")
    public R update(@Valid @RequestBody WxTemplate wxTemplate) {
        return R.status(wxTemplateService.updateById(wxTemplate));
    }

    /**
     * 新增或修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "傳入wxTemplate")
    public R submit(@Valid @RequestBody WxTemplate wxTemplate) {
        return R.status(wxTemplateService.saveOrUpdate(wxTemplate));
    }


    /**
     * 刪除
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "邏輯刪除", notes = "傳入ids")
    public R remove(@ApiParam(value = "主鍵集合", required = true) @RequestParam String ids) {
        return R.status(wxTemplateService.deleteLogic(Func.toLongList(ids)));
    }


    /**
     * 添加模板
     *
     * @return
     */
    @PostMapping("/addTem")
    @ApiOperationSupport(order = 8)
    @ApiOperation(value = "添加", notes = "傳入wxTemplate")
    public JSONObject addTem(@Valid @RequestBody WxTemplate wxTemplate) {
        return wxTemplateService.addWxTemplate(wxTemplate);
    }

    /**
     * 刪除模板
     *
     * @return
     */
    @PostMapping("/removeTem")
    @ApiOperationSupport(order = 9)
    @ApiOperation(value = "邏輯刪除", notes = "傳入id和模板id")
    public JSONObject removeTem(@ApiParam(value = "主鍵集合", required = true) @RequestParam String id, @RequestParam String templateId) {
        return wxTemplateService.delWxTemplate(id, templateId);
    }

    /**
     * 獲取小程序賬號(hào)的類目
     *
     * @return
     */
    @GetMapping("/getCategory")
    @ApiOperationSupport(order = 10)
    @ApiOperation(value = "查詢類目")
    public JSONObject getCategory() {
        return wxTemplateService.getCategory();
    }

    /**
     * 獲取模板標(biāo)題下的關(guān)鍵詞列表
     *
     * @return
     */
    @GetMapping("/getPubTemplateKeyWordsById")
    @ApiOperationSupport(order = 11)
    @ApiOperation(value = "獲取模板標(biāo)題下的關(guān)鍵詞列表")
    public JSONObject getPubTemplateKeyWordsById(@ApiParam(value = "關(guān)鍵詞id", required = true) @RequestParam String tid) {
        return wxTemplateService.getPubTemplateKeyWordsById(tid);
    }

    /**
     * 獲取帳號(hào)所屬類目下的公共模板標(biāo)題
     *
     * @return
     */
    @GetMapping("/getPubTemplateTitleList")
    @ApiOperationSupport(order = 12)
    @ApiOperation(value = "獲取帳號(hào)所屬類目下的公共模板標(biāo)題")
    public JSONObject getPubTemplateTitleList(@ApiParam(value = "關(guān)鍵詞集合", required = true) @RequestParam String ids, @RequestParam int start, @RequestParam int limit) {
        return wxTemplateService.getPubTemplateTitleList(ids, start, limit);
    }

    /**
     * 獲取當(dāng)前帳號(hào)下的個(gè)人模板列表
     *
     * @return
     */
    @GetMapping("/getTemplateList")
    @ApiOperationSupport(order = 13)
    @ApiOperation(value = "獲取帳號(hào)所屬類目下的公共模板標(biāo)題")
    public JSONObject getTemplateList() {
        return wxTemplateService.getTemplateList();
    }

    /**
     * 獲取當(dāng)前帳號(hào)下的個(gè)人模板列表
     *
     * @return
     */
    @GetMapping("/getTemplateListIdAndName")
    @ApiOperationSupport(order = 14)
    @ApiOperation(value = "獲取帳號(hào)所屬類目下的公共模板標(biāo)題和ID")
    public Map<String, String> getTemplateListIdAndName() {
        return wxTemplateService.getTemplateId();
    }
}

WxTemplateDataController.java

/**
 *  控制器
 *
 * @author myn
 * @since 2021-10-13
 */
@RestController
@AllArgsConstructor
@RequestMapping("/wxtemplatedata")
@Api(value = "", tags = "接口")
public class WxTemplateDataController extends BladeController {

    private IWxTemplateDataService wxTemplateDataService;

    /**
     * 詳情
     */
    @GetMapping("/detail")
    @ApiOperationSupport(order = 1)
    @ApiOperation(value = "詳情", notes = "傳入wxTemplateData")
    public R<WxTemplateDataVO> detail(WxTemplateData wxTemplateData) {
        WxTemplateData detail = wxTemplateDataService.getOne(Condition.getQueryWrapper(wxTemplateData));
        return R.data(WxTemplateDataWrapper.build().entityVO(detail));
    }

    /**
     * 分頁(yè)
     */
    @GetMapping("/list")
    @ApiOperationSupport(order = 2)
    @ApiOperation(value = "分頁(yè)", notes = "傳入wxTemplateData")
    public R<IPage<WxTemplateDataVO>> list(WxTemplateData wxTemplateData, Query query) {
        QueryWrapper<WxTemplateData> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq("tenant", AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId()));
        String a=AESUtils.aesEncode(WxAppConfig.getAesKey(), WxAppConfig.getAppId());
        System.out.println(a);
        IPage<WxTemplateData> pages = wxTemplateDataService.page(Condition.getPage(query), queryWrapper);
        return R.data(WxTemplateDataWrapper.build().pageVO(pages));
    }


    /**
     * 自定義分頁(yè)
     */
    @GetMapping("/page")
    @ApiOperationSupport(order = 3)
    @ApiOperation(value = "分頁(yè)", notes = "傳入wxTemplateData")
    public R<IPage<WxTemplateDataVO>> page(WxTemplateDataVO wxTemplateData, Query query) {
        IPage<WxTemplateDataVO> pages = wxTemplateDataService.selectWxTemplateDataPage(Condition.getPage(query), wxTemplateData);
        return R.data(pages);
    }

    /**
     * 新增
     */
    @PostMapping("/save")
    @ApiOperationSupport(order = 4)
    @ApiOperation(value = "新增", notes = "傳入wxTemplateData")
    public R save(@Valid @RequestBody WxTemplateData wxTemplateData) {
        return R.status(wxTemplateDataService.save(wxTemplateData));
    }

    /**
     * 修改
     */
    @PostMapping("/update")
    @ApiOperationSupport(order = 5)
    @ApiOperation(value = "修改", notes = "傳入wxTemplateData")
    public R update(@Valid @RequestBody WxTemplateData wxTemplateData) {
        return R.status(wxTemplateDataService.updateById(wxTemplateData));
    }

    /**
     * 新增或修改
     */
    @PostMapping("/submit")
    @ApiOperationSupport(order = 6)
    @ApiOperation(value = "新增或修改", notes = "傳入wxTemplateData")
    public R submit(@Valid @RequestBody WxTemplateData wxTemplateData) {
        return R.status(wxTemplateDataService.saveOrUpdate(wxTemplateData));
    }


    /**
     * 刪除
     */
    @PostMapping("/remove")
    @ApiOperationSupport(order = 7)
    @ApiOperation(value = "邏輯刪除", notes = "傳入ids")
    public R remove(@ApiParam(value = "主鍵集合", required = true) @RequestParam String ids) {
        return R.status(wxTemplateDataService.deleteLogic(Func.toLongList(ids)));
    }

    /**
     * 發(fā)送
     */
    @PostMapping("/send")
    @ApiOperationSupport(order = 8)
    @ApiOperation(value = "發(fā)送", notes = "傳入實(shí)體類")
    public String send(@Valid @RequestBody WxTemplateData wxTemplateData) throws Exception {
        return wxTemplateDataService.sendMsg(wxTemplateData);
    }

    /**
     * 獲取需要填寫(xiě)的關(guān)鍵字名稱
     * @return
     */
    @GetMapping("/getKeyWords")
    @ApiOperationSupport(order = 9)
    @ApiOperation(value = "獲取需要填寫(xiě)的關(guān)鍵字名稱", notes = "傳入模板id")
    public Map<String, String> getKeyWords(@ApiParam(value = "模板id", required = true) @RequestParam String templateId) throws Exception {
        return wxTemplateDataService.getDataList(templateId);
    }

    /**
     * 租戶測(cè)試
     * @return
     */
    @GetMapping("/getList")
    @ApiOperationSupport(order = 10)
    @ApiOperation(value = "租戶測(cè)試")
    public List<WxTemplateData> getList(){
        return wxTemplateDataService.selectList();
    }

    /**
     * 租戶刪除測(cè)試
     * @return
     */
    @GetMapping("/deleteByEntity")
    @ApiOperationSupport(order = 10)
    @ApiOperation(value = "租戶測(cè)試")
    public int deleteByEntity(String id){
        return wxTemplateDataService.deleteByEntity(id);
    }
}

微信模板的建立可以在微信公眾后臺(tái)手工創(chuàng)建鞭缭,比調(diào)用API簡(jiǎn)單。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末魏颓,一起剝皮案震驚了整個(gè)濱河市岭辣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌甸饱,老刑警劉巖沦童,帶你破解...
    沈念sama閱讀 221,430評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搞动,警方通過(guò)查閱死者的電腦和手機(jī)躏精,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)鹦肿,“玉大人矗烛,你說(shuō)我怎么就攤上這事÷崂#” “怎么了瞭吃?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,834評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)涣旨。 經(jīng)常有香客問(wèn)我歪架,道長(zhǎng),這世上最難降的妖魔是什么霹陡? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,543評(píng)論 1 296
  • 正文 為了忘掉前任和蚪,我火速辦了婚禮,結(jié)果婚禮上烹棉,老公的妹妹穿的比我還像新娘攒霹。我一直安慰自己,他們只是感情好浆洗,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,547評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布催束。 她就那樣靜靜地躺著,像睡著了一般伏社。 火紅的嫁衣襯著肌膚如雪抠刺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,196評(píng)論 1 308
  • 那天摘昌,我揣著相機(jī)與錄音速妖,去河邊找鬼。 笑死聪黎,一個(gè)胖子當(dāng)著我的面吹牛买优,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播挺举,決...
    沈念sama閱讀 40,776評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼杀赢,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了湘纵?” 一聲冷哼從身側(cè)響起脂崔,我...
    開(kāi)封第一講書(shū)人閱讀 39,671評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎梧喷,沒(méi)想到半個(gè)月后砌左,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體脖咐,經(jīng)...
    沈念sama閱讀 46,221評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,303評(píng)論 3 340
  • 正文 我和宋清朗相戀三年汇歹,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了屁擅。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,444評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡产弹,死狀恐怖派歌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情痰哨,我是刑警寧澤胶果,帶...
    沈念sama閱讀 36,134評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站斤斧,受9級(jí)特大地震影響早抠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撬讽,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,810評(píng)論 3 333
  • 文/蒙蒙 一蕊连、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧游昼,春花似錦咪奖、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,285評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)趟佃。三九已至扇谣,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間闲昭,已是汗流浹背罐寨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,399評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留序矩,地道東北人鸯绿。 一個(gè)月前我還...
    沈念sama閱讀 48,837評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像簸淀,于是被迫代替她去往敵國(guó)和親瓶蝴。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,455評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容