最新版本更新
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;
}