【问题标题】:sending sms from java web app using aws sns使用 aws sns 从 Java Web 应用程序发送短信
【发布时间】:2022-04-23 02:29:21
【问题描述】:

用户将在我的网络应用程序上创建一个帐户。该应用程序需要通过向用户提供的手机号码发送短信来验证用户身份。短信是一个简短的唯一代码,用户需要在网络浏览器中输入该代码,以便应用程序对用户进行身份验证。

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

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

可以为此用例配置 Amazon AWS SNS 吗?如果有,怎么做?

我正在使用 Java。

【问题讨论】:

  • 您不应该向 AWS 支持寻求支持的用例吗?它们有那么糟糕,你必须回退到 stackoverflow。
  • @sureshkoya AWS 支持每月收费 100 美元。所以用户依赖堆栈溢出。

标签: amazon-web-services amazon-sns


【解决方案1】:

仅当您需要向多个手机号码发送 SMS 消息时才需要 SNS 主题。如果您想向单个号码发送 SMS 消息,可以使用 Amazon AWS 开发工具包。

文档可通过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_IDYOUR_Client_secret 替换为您创建的用户凭据。

【讨论】:

  • 能否请您告诉我您用于上述代码的确切 jar 版本..?
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    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 Customer Engagement Service Amazon Pinpoint。它允许使用营销活动和分析工具发送短信、电子邮件和推送通知:

    Amazon Pinpoint Developer Guide

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

    Setting Up an SMS Registration System Using Amazon Pinpoint

    根据您的描述,虽然可以使用 SNS 和适用于 Java 的 AWS 开发工具包来完成,但 Pinpoint 旨在与应用程序用户交互,因此它可能是更好的选择

    【讨论】:

      【解决方案4】:

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

      如果您需要向任意电话号码发送适当的 SMS/MMS 短信,则需要转向其他平台,例如 TwilioBandwidth

      【讨论】:

      • 不同意。 AWS SNS 完全支持发送针对单个电话号码的交易短信。
      • @ShubhamA。 AWS SNS 在 2015 年不支持此功能。直到最近,他们才支持将跨国 SMS 消息发送到电话号码而不是主题。然而,Otávio Garcia 提供了一种现在就可以做到这一点的方法。
      • AWS SNS 仍然不支持彩信。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-23
      • 2013-02-18
      • 2022-01-17
      • 1970-01-01
      • 2016-07-03
      • 2015-07-05
      相关资源
      最近更新 更多