记项目的一次发送短信及短信模板配置分享

第一部分:开通短信服务

阿里云的短信服务(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、模板结尾处必须说明退订方式,仅支持设置回复“TDTN”中的任意一种退订短信,回复其他内容无效。

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);
}


第五部分:问题排查定位

我们可以创建数据库表,将发送的短信结果存入数据库表中,方便排查哪些短信发送失败;

    同时可以去阿里云控制台 --> 短信服务 --> 业务统计 --> 发送记录查询,查看短信是否发送成功;

数据库表排查:

记项目的一次发送短信及短信模板配置分享

阿里云控制台排查:

记项目的一次发送短信及短信模板配置分享

失败记录查询:

记项目的一次发送短信及短信模板配置分享

导出失败记录:

记项目的一次发送短信及短信模板配置分享


上一篇:转 Cocos2d-x设计模式--二段构建模式


下一篇:如何执行一套数据推动的云迁移方法