Java-腾讯云短信模板兼容阿里云短信模板-短信模板参数生成

最新版本更新
https://code.jiangjiesheng.cn/article/362?from=csdn

模板

腾讯云:您好!{}的{},有{}发生{} 阿里云:您好!{orgName}的{monitorName},有{equipName}发生${status}

原腾讯云短信发送的代码兼容阿里云短信模板,前提:参数顺序不变,文案可以变化。

方案:提取阿里云短信模板参数字段,比如上面的,orgName、monitorName、equipName、status,结合腾讯云短信模板入参传的有序List转成key-value Map,最后转成阿里云的需要json字符串。

提取阿里云短信模板中的所有参数字段:

复制代码
	public static final String ALIYUN_PARAM_REGEX = "\\$\\{(.*?)}";
	
	//ReUtil来自hutool:
		<dependency>
			<groupId>cn.hutool</groupId>
			<artifactId>hutool-all</artifactId>
			<version>4.5.6</version>
        </dependency>
        
    //从阿里云模板中提取参数字段
	List<String> aliTempParamKeys = ReUtil.findAllGroup1(ALIYUN_PARAM_REGEX, templateMsg);
	
	//转成和腾讯云一样的模板,用于构建最后的短信content内容,自己保存短信内容。
    //String templateMsg = templateMsg.replaceAll(ALIYUN_PARAM_REGEX, "{}");
    
	//构建阿里云的短信接口入参:
	Map<String,Object> newTemplateParams = buildTemplateParamsMap(templateId,aliTempParamKeys, params);
	
	/**
     * 将参数模板,处理成有序的 KeyValue 数组
     * <p>
     * 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说 <a href="https://cloud.tencent.com/document/product/382/39023">腾讯云</a>
     *
     * @param templateId  短信模板id
     * @param aliTempParamKeys  短信模板中的字段
     * @param paramsValue 提交的入参值
     * @return 处理后的参数 阿里云使用
     */
    Map<String,Object> buildTemplateParamsMap(String templateId, List<String> aliTempParamKeys, String[] paramsValue) {
        Map<String,Object> map = Maps.newHashMap();
        if (CollectionUtils.isEmpty(aliTempParamKeys) || paramsValue == null || paramsValue.length == 0) {
            return map;
        }
        // 防止 templateId: '1875303' ,这种参数对不上的情况,
        // if (aliTempParamKeys.size() != paramsValue.length) {
        //    throw new GnException("短信参数个数和模板不匹配");
        // }
        int maxIdx = paramsValue.length - 1;
        boolean foundBadParams = false;
        for (int i = 0, len = aliTempParamKeys.size(); i < len; i++) {
            String value;
            if (i > maxIdx) {
                value = "-";
                foundBadParams = true;
            } else {
                value = paramsValue[i];
            }
            map.put(aliTempParamKeys.get(i), value);
        }
        if (foundBadParams) {
            log.error("构建阿里云短信出现入参和模板参数个数对不上的情况,templateId:{},aliTempParamKeys:{},paramsValue:{},结果:{}",
                    templateId, JSONUtil.toJsonStr(aliTempParamKeys), JSONUtil.toJsonStr(paramsValue), JSONUtil.toJsonStr(map));
        }
        return map;
    }

最新版本更新
https://code.jiangjiesheng.cn/article/362?from=csdn

相关推荐
.鸣7 小时前
set和map
java·学习
ha_lydms7 小时前
5、Spark函数_s/t
java·大数据·python·spark·数据处理·maxcompute·spark 函数
黄河滴滴8 小时前
java系统变卡变慢的原因是什么?从oom的角度分析
java·开发语言
侠客行03178 小时前
Mybatis二级缓存实现详解
java·mybatis·源码阅读
老华带你飞8 小时前
农产品销售管理|基于java + vue农产品销售管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
Edward111111119 小时前
tomcat_servlet
java·servlet·tomcat
短剑重铸之日9 小时前
SpringBoot声明式事务的源码解析
java·后端·spring·springboot
李白的粉9 小时前
基于springboot的银行客户管理系统(全套)
java·spring boot·毕业设计·课程设计·源代码·银行客户管理系统
JIngJaneIL9 小时前
基于springboot + vue房屋租赁管理系统(源码+数据库+文档)
java·开发语言·前端·数据库·vue.js·spring boot·后端
努力的小南9 小时前
Java字节码文件常量池索引两个问题
java·常量池·字节码文件·黑马jvm字节码文件常量池索引