微信小程序java後端開發記錄(三):模板消息推送

·模板消息推送

1.1推送參數dto:

按照文檔逐層次封裝請求參數。

這些參數

/**
 * @author hanyy
 * @Description: 微信小程序模板消息推送參數
 * @date 2019/8/18 10:52
 */
public class WechatAppletTemplateDTO {
    private String touser;
    private String template_id;
    private String page; // 跳轉小程序頁面
    private String form_id; //表單提交場景下爲formid,支付場景下爲prepay_id
    private Map<String, WechatAppletTemplateItemDTO> data;
    private String emphasis_keyword; // 需要放大的關鍵字,如:keyword1.DATA
}

1.2小程序模板數據內容: 

這裏data參數沒有使單獨對象一層層封裝,使用了map集合key/value形式。

/**
 * @author hanyy
 * @Description: 公衆號模板數據內容   
 * @date 2019/8/8 10:25
 */
@Data
public class WechatAppletTemplateItemDTO {
    private String value;
}

2.推送方法:

根據模板封裝通用模板消息發送方法

 注意:每次調用推送方法,都需要去拿access_token。

//小程序收到挪車請求通知模板消息
public ResultVO<?> receivedNoticeTemplateSend(WechatTemplateKeyWordDTO dto) {
	//獲取AccessToken
	ResultVO<?> myAccessToken = getAppletAccessToken();
	String templateSendaccessToken = (String) myAccessToken.getData();
	// 填充模板數據
	WechatAppletTemplateDTO wechatTemplate = new WechatAppletTemplateDTO();
	//被推送用戶
	wechatTemplate.setTouser(dto.getTouser());
	//模板id
	wechatTemplate.setTemplate_id(receivedNotice);
	// 表單提交場景下爲formid,支付場景下爲prepay_id(前端傳)
	wechatTemplate.setForm_id(dto.getFormId());
	// 跳轉頁面
	//.setPage("pages/index")
	/**
	 * 車牌 {{keyword1.DATA}}
	 * 發送時間 {{keyword2.DATA}}
	 * -> {"keyword1": {"value":"xxx"}, "keyword2": ...}
	 */
	wechatTemplate.setData(MapUtil.newHashMap(//
			"keyword1", new WechatAppletTemplateItemDTO(dto.getPaltNo()),//
			"keyword2", new WechatAppletTemplateItemDTO(dto.getRequestDate())//
	));
	log.info("#receivedNoticeTemplateSend:{}", wechatTemplate.toString());
	WechatApiUtil.wechatAppletTemplateSend(templateSendaccessToken, wechatTemplate);
	return ResultVOUtil.returnSuccess();
}

3.業務層調用推送方法:

根據推送方法進行傳參即可。

注: 小程序的推送是必須要依賴formid,必須是一對一回執,而一次挪車申請表單提交只能產生一次formid,
並且只能使用一次,不可重複使用。所以前端只能提供一個formid給後臺,後臺只能推送一次小程序通知。

//微信小程序通知申請人被回覆
WechatTemplateKeyWordDTO wechatTemplate = new WechatTemplateKeyWordDTO();
//openid/formid表中查
wechatTemplate.setTouser(result.getOpenid());
//唯一formid,一次表單提交僅可使用一次
wechatTemplate.setFormId(result.getFormId());
wechatTemplate.setPaltNo(result.getPlatNo());
wechatTemplate.setContent(dto.getContent());
wechatTemplate.setRequestDate(DateUtil.getTime());
log.info("#申請人被回覆小程序通知: openid:{},車牌號:{}", wechatTemplate.getTouser(), wechatTemplate.getPaltNo());
iWxAppletService.replyNoticeTemplateSend(wechatTemplate);

附:封裝hutool的MapUtil :

public class MapUtil extends cn.hutool.core.map.MapUtil {
    public static HashMap newHashMap(Object... keyValues) {
        return newMap(HashMap.class, keyValues);
    }

    public static ConcurrentMap newConcurrentMap(Object... keyValues) {
        return newMap(ConcurrentMap.class, keyValues);
    }

    public static TreeMap newTreeMap(Object... keyValues) {
        return newMap(TreeMap.class, keyValues);
    }

    public static LinkedHashMap newLinkedHashMap(Object... keyValues) {
        return newMap(LinkedHashMap.class, keyValues);
    }

    public static IdentityHashMap newIdentityHashMap(Object... keyValues) {
        return newMap(IdentityHashMap.class, keyValues);
    }

    private static <R extends Map> R newMap(Class<? extends Map> type, Object... keyValues) {
        if (null == keyValues) {
            log.warn("MapUtil#newMap() keyValues is null.");
            return null;
        }

        int length = keyValues.length;
        if (length % 2 != 0) {
            throw new IllegalArgumentException("參數不符合預期, 可變數組應該成對出現。");
        }
        Map resultMap;
        if (type == HashMap.class) {
            resultMap = Maps.newHashMap();
        } else if (type == ConcurrentMap.class) {
            resultMap = Maps.newConcurrentMap();
        } else if (type == TreeMap.class) {
            resultMap = Maps.newTreeMap();
        } else if (type == LinkedHashMap.class) {
            resultMap = Maps.newLinkedHashMap();
        } else if (type == IdentityHashMap.class) {
            resultMap = Maps.newIdentityHashMap();
        } else {
            throw new IllegalArgumentException("MapUtil#newMap() type = " + type.getSimpleName() + " 不支持。");
        }
        for (int i = 0; i < length; i = i + 2) {
            resultMap.put(keyValues[i], keyValues[i + 1]);
        }
        return (R) resultMap;
    }
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章