通过 SMS 直接向 phone 号码发送一次性密码

Sending one-time password by SMS directly to a phone number

我使用 AWS SES 通过电子邮件发送一次性密码。我正在使用 AWS SNS 通过 SMS 实现相同的功能。

我创建了一个主题,otp,并手动添加了 phone 号码作为订阅。

以下代码在本地和服务器上都有效:

      var params = {
        // TODO: fix this.
        //PhoneNumber: "+351914...",
        TopicArn: "arn:aws:sns:...:...:otp",
        Message: "Your code is..."
      }
      var publish_text_promise = new AWS.SNS({apiVersion: '2010-03-31', profile_name: "sms"}).publish(params).promise();

      // Handle promise's fulfilled/rejected states
      publish_text_promise.then(
        function(data) {
          console.log("Message sent: %o", params);
          console.log("MessageID is " + data.MessageId);
        }).catch(
          function(err) {
            console.error("Error in sending OTP by SMS");
            console.error(err, err.stack);
          });

我想直接发给phone号码,不需要人工干预,我可以添加其他同主题的用户。当我添加 PhoneNumber 而不是 TopicArn 时,它有时会起作用,有时我会收到此消息:

InvalidParameter: Invalid parameter: PhoneNumber Reason: +351914... is not valid to publish to

phone 号码格式正确:当我在本地测试时,它总是有效。

我在本地和远程拥有相同的代码以及相同的 AWS 凭证文件。

为什么代码在本地工作,有时在远程失败?我怎样才能直接发送到 phone 个号码?

问题是 phone 号码中的一个不可见字符,您可以在 6:

之后看到
InvalidParameter: Invalid parameter: PhoneNumber Reason: +3519...6‬ is not valid to publish to

我在添加到 macOS 上的联系人之前清理了 phone 号码,但联系人似乎到处添加这些字符。当我删除 phone 数字时,字符消失了。因为字符在末尾,所以我选择phone号到copy-and-paste时漏掉了。

根据评论,调试此问题的一种解决方案是尝试使用 AWS SNS 控制台。

因此,此帖与密切相关:

This was definitely caused by an encoding issue, paste the code below into jsfiddle, and mouseover to see the warning on the first plus sign which reads:

This character may get silently deleted by one or more browsers