使用aws sns从java web app发送短信

时间:2015-07-17 01:00:00

标签: amazon-web-services amazon-sns

用户将在我的网络应用上创建一个帐户。应用程序需要通过向用户提供的移动电话号码发送文本消息来对用户进行身份验证。文本消息是一个简短的唯一代码,用户需要输入到Web浏览器,以便应用程序对用户进行身份验证。

如何为此用例配置Amazon AWS SNS?

根据我的阅读,SNS的工作由网站管理员选择topic,然后每个用户订阅该主题。然后,网站管理员将消息广播样式发送给该主题的所有订阅者。这不符合我向每个用户发送唯一消息的要求。或者,为每个电话号码创建单独的topic将太麻烦,更不用说在保护所有电话号码的隐私方面产生安全问题。

是否可以针对此用例配置Amazon AWS SNS?如果是这样,怎么样?

我正在使用Java。

4 个答案:

答案 0 :(得分:1)

当您需要向多个手机号码发送短信时,SNS主题才会存在。如果要将SMS消息发送到单个号码,可以使用Amazon AWS SDK。

文档位于http://docs.aws.amazon.com/sns/latest/dg/sms_publish-to-phone.html#sms_publish_sdk

示例代码:

public static void main(String[] args) {
    AWSCredentials awsCredentials = new BasicAWSCredentials("YOUR_Client_ID", "YOUR_Client_secret");
    final AmazonSNSClient client = new AmazonSNSClient(awsCredentials);
    client.setRegion(Region.getRegion(Regions.REGION_YOU_WANT_TO_USE));

    AmazonSNSClient snsClient = new AmazonSNSClient(awsCredentials);
    String message = "My SMS message";
    String phoneNumber = "+1XXX5550100";
    Map<String, MessageAttributeValue> smsAttributes = 
            new HashMap<String, MessageAttributeValue>();
    //<set SMS attributes>
    sendSMSMessage(snsClient, message, phoneNumber, smsAttributes);
}

public static void sendSMSMessage(AmazonSNSClient snsClient, String message, 
    String phoneNumber, Map<String, MessageAttributeValue> smsAttributes) {
    PublishResult result = snsClient.publish(new PublishRequest()
                    .withMessage(message)
                    .withPhoneNumber(phoneNumber)
                    .withMessageAttributes(smsAttributes));
    System.out.println(result); // Prints the message ID.
}

请记住在IAM控制台上创建用户,添加访问SNS服务的权限。您需要添加 AmazonSNSFullAccess 角色。

YOUR_Client_ID YOUR_Client_secret 替换为您创建的用户凭据。

答案 1 :(得分:1)

AWS SDK中已弃用某些方法。

BasicAWSCredentials awsCredentials = new BasicAWSCredentials("CLIENT-ID", "SECRET-KEY");
AmazonSNS snsClient = AmazonSNSClientBuilder.standard()
                     .withRegion(Regions.fromName("YOUR_REGION"))
     .withCredentials(new AWSStaticCredentialsProvider(awsCredentials)).build();

Map<String, MessageAttributeValue> smsAttributes = new HashMap<String, MessageAttributeValue>();
smsAttributes.put("AWS.SNS.SMS.SenderID",new MessageAttributeValue().withStringValue("SENDER-ID").withDataType("String");
smsAttributes.put("AWS.SNS.SMS.SMSType",new MessageAttributeValue().withStringValue("Transactional").withDataType("String"));

PublishRequest request = new PublishRequest();
request.withMessage("YOUR MESSAGE")
.withPhoneNumber("E.164-PhoneNumber")
.withMessageAttributes(smsAttributes);
PublishResult result=snsClient.publish(request);

答案 2 :(得分:0)

使用适用于Java的AWS开发工具包发送短信:

public static void main(String[] args) {
        AmazonSNSClient snsClient = new AmazonSNSClient();
        String message = "My SMS message";
        String phoneNumber = "+1XXX5550100";
        Map<String, MessageAttributeValue> smsAttributes = 
                new HashMap<String, MessageAttributeValue>();
        //<set SMS attributes>
        sendSMSMessage(snsClient, message, phoneNumber, smsAttributes);
}

public static void sendSMSMessage(AmazonSNSClient snsClient, String message, 
        String phoneNumber, Map<String, MessageAttributeValue> smsAttributes) {
        PublishResult result = snsClient.publish(new PublishRequest()
                        .withMessage(message)
                        .withPhoneNumber(phoneNumber)
                        .withMessageAttributes(smsAttributes));
        System.out.println(result); // Prints the message ID.
}

对于此特定用例,您应该考虑使用AWS客户参与服务 Amazon Pinpoint 。它允许使用营销活动和分析工具发送短信,电子邮件和推送通知:

Amazon Pinpoint Developer Guide

文档包括针对您的特定用例的教程:

Setting Up an SMS Registration System Using Amazon Pinpoint

对于您所描述的,虽然可以将SNS与适用于Java的AWS开发工具包结合使用,但Pinpoint旨在与应用程序用户进行交互,因此它可能是更好的选择

答案 3 :(得分:-1)

单个SMS / MMS消息传递超出了AWS SNS的明显用例。

如果您需要向任意电话号码发送正确的短信/彩信短信,则需要转到其他平台,例如TwilioBandwidth