第一部分:开通短信服务
阿里云的短信服务(Short Message Service)是广大企业客户快速触达手机用户所优选使用的通信能力。调用API或用群发助手,即可发送验证码、通知和推广短信;国内验证短信秒级触达,到达率最高可达99%;国际/港澳台短信覆盖200多个国家和地区,安全稳定,广受海外企业选用。
第一步:登录阿里云官网 控制台中找到短信服务然后开通;
第二步:获取AccessKey;
将鼠标置于页面右上方的账号图标,然后单击accesskeys。
注意:若开通编程访问,请及时保存AccessKey 信息,页面关闭后将无法再次获取信息。
然后给短信服务配置权限
至此,短信开通完成;
第二部分:创建签名和模板
短信签名:是短信内容的一部分,可以根据业务需求编辑短信签名。
短信模板:是短信内容的一部分,国内消息可以发送验证码、短信通知、推广短信类内容,国际/港澳台消息支持所有类型内容。
注意:不支持个人用户申请未上线业务,若产品未上线建议先 升级企业账号
提交之后等待审核通过即可添加模板注意事项:
格式:
1、限制为1~500个字(含变量)。
2、为避免与签名混淆,在模板内容任意位置均不能使用【】,在模板内容首尾不能使用[]。
3、不支持特殊符号例如# 『』「」〖〗 m² • ①★※→等。
内容:需明确表述短信发送的实际内容
1、禁止发送金融相关的所有内容。
2、地产、留学、招聘、交友、游戏等行业仅支持发送验证码。
3、不支持发送未经许可的信息,主要指邀请注册、邀请成为会员的商业性信息。
4、不支持内容中含有直接或间接访问应用内测分发平台的行为。
5、禁止发送涉及:色情、赌博、毒品、党政、法律维权、众筹等信息。
不同短信类别的变量规范和内容规范:
类别 |
变量规范 |
变量规范 |
验证码 |
1、在模板中仅支持一个变量。 2、验证码模板变量的实际内容仅支持数字或英文字母。 |
1、国内短信模板必须包含“验证码、注册码、校验码、动态码(动态密码)”中的任意一个;国际/港澳台短信模板必须包含“code”。 2、模板必须体现和说明“使用平台、用途、失效时间”中的任意一种。 3、模板无须说明退订方式相关内容。 4、模板不支持包含与验证码无关的内容,如电话号码、链接、通知内容等。 |
短信通知 |
1、同一个变量在模板中仅可出现一次。不支持的模板示例:您家宝贝${name}已经到达${name}现场! 2、可以添加链接,但不支持设置变量链接,如:www.${site}.cn,也不支持短链接与变量直接组合的格式,如:t.cn${code},t.cn为短链接,${code}为变量。 允许设置的格式为官网链接与变量拼接,如:www.aliyun.com${code}。请注意,对于具体的url,审核专员会进行审核,审核通过才可以使用。 |
1、除公共规范外,另不支持在短信通知中发送营销内容。 2、模板无须说明退订方式相关内容。 |
推广短信 |
不支持变量。 |
1、模板结尾处必须说明退订方式,仅支持设置回复“TD、T、N”中的任意一种退订短信,回复其他内容无效。 2、除公共规范外,另不支持向非会员用户发送营销内容。 3、营销内容需体现在模板内,禁止发送加微信送礼品等营销内容不清晰的内容。 |
添加模板步骤:国内短信 --> 模板管理 --> 添加模板 -->提交审核 --> 审核通过。
至此,签名、模板创建完成;
第三部分:数据库模板配置
申请短信模板并通过之后,会生成以SMS开头的短信模板的code如下图所示,我们需要给模板code配置到我们数据库中。
数据库表:
字段说明:
Language:可以区分是国内短信和国外短信。
exhibition_id:可以根据活动ID进行短信模板数据隔离。
out_template_code:短信模板审核通过后的code。
msg_send_type:发送短信的场景。
第四部分:短信代码示例
配置类:短信签名、短信的accessKeyId、短信的accessKeySecret、短信的RegionId、短信发送域名等。
异步发送信息:
public Boolean sendAsyncMessageNew(MessageSendParam param) { String msg = JSONObject.toJSONString(param, SerializerFeature.WriteMapNullValue,SerializerFeature.DisableCircularReferenceDetect); return sendMqMessage(msg, MqMessageTagConstants.TAG_SEND_NEW_MSG); }
发送rocketMq消息,将需要发送短息的记录发送到mq,代码读取mq信息实现短信发送:
private Boolean sendMqMessage(String msg, String tag){ Message message = new Message(mqConfig.getSendMessageTopic(), tag, msg.getBytes()); try{ SendResult sendResult = producer.send(message); if(null != sendResult){ valueOperations.set(sendResult.getMessageId(), 1); log.info("系统消息异步发送成功,MQ消息ID:{}", sendResult.getMessageId()); return true; } }catch (Exception e){ e.printStackTrace(); } return false; }
发送国内短信:
public Boolean sendDomesticSms(String phone, String templateId, String params) { if(StringUtils.isBlank(phone)){ throw new ConventionException(MSG_RECEIVER_PHONE_IS_NULL); } return sendSms(templateId, phone, params, MessageConfig.DOMESTIC_SIGN_NAME); }
发送国外短信:
public Boolean sendAbroadSms(String phone, String templateId, String params) { if(StringUtils.isBlank(phone)){ throw new ConventionException(MSG_RECEIVER_PHONE_IS_NULL); } return sendSms(templateId, phone, params, MessageConfig.ABROAD_SIGN_NAME); }
调用阿里云消息平台发送短信实现:
private Boolean sendSms(String templateCode, String toNumber, String params, String signName){ String action = "SendSms"; CommonRequest request = getSmsCommonRequest(action); request.putQueryParameter("PhoneNumbers", toNumber); request.putQueryParameter("SignName", signName); //阿里云的消息模板ID request.putQueryParameter("TemplateCode", templateCode); if(StringUtils.isNotBlank(params)){ JSONObject jsonObject = JSON.parseObject(params); //截取参数长度 不超过20 Set<String> keys = jsonObject.keySet(); if(CollectionUtils.isNotEmpty(keys)){ keys.stream().forEach(item -> { String value = jsonObject.getString(item); if (StringUtils.length(value) > 20){ jsonObject.put(item, value.substring(0, 20)); } }); params = jsonObject.toJSONString(); } request.putQueryParameter("TemplateParam", params); }else{ request.putQueryParameter("TemplateParam", "{}"); } log.info("发送短信, 阿里云模板ID:{}, 发送内容:{}", templateCode, params); return null != executeSmsCommonResponse(request, action); }
第五部分:问题排查定位
我们可以创建数据库表,将发送的短信结果存入数据库表中,方便排查哪些短信发送失败;
同时可以去阿里云控制台 --> 短信服务 --> 业务统计 --> 发送记录查询,查看短信是否发送成功;
数据库表排查:
阿里云控制台排查:
失败记录查询:
导出失败记录: