AWS SNS - 无效参数 - Phone 号码无法发布到。仅限特定 phone 号码

AWS SNS - Invalid Parameter - Phone Number is not valid to publish to. On specific phone number only

我们正在使用 AWS SNS 发送 SMS 消息。在测试中,它适用于除一位未收到消息的开发人员以外的所有人,日志显示如下:

Invalid parameter: PhoneNumber Reason: +1‬207XXXXXXX is not valid to publish to

我留下了他的区号以备不时之需。同样,这是我们遇到的唯一问题,它是 iPhone。它适用于我们尝试过的所有其他数字。我也可以毫无问题地通过 AWS SNS 控制台成功地向该号码发送短信。

我应该注意,我们只发送 6 个字符的字符串(用于 2 因素身份验证)。

我们正在使用 Lambda 执行此操作。这是代码的相关部分:

export function sendSNS(PhoneNumber, Message) {
  return new Promise<boolean>((resolve, reject) => {
    const sns = new AWS.SNS({ region: 'us-east-1' })
    const params = {
      MessageStructure: 'String',
      Message,
      PhoneNumber
    }
    sns.setSMSAttributes({
      attributes: {
        DefaultSenderID: 'mycompany',
        DefaultSMSType: 'Transactional'
      }
    })

    sns.publish(params, function(err, data) {
      if (err) {
        console.log(err)
        reject(false)
      } else {
        console.log(`Sent this SMS via Amazon: ${Message} to ${PhoneNumber}`)
        console.log(data)
        resolve(true)
      }
    })
  })
}

我可以通过直接在我们的 MySQL 数据库中手动更新用户的 phone 号码来解决这个问题。不确定这是字符编码问题还是类似问题,但我假设一定是。如果我确定确切原因,我会 post 回来。

更新: 这肯定是由编码问题引起的,将下面的代码粘贴到 jsfiddle 中,然后将鼠标悬停在第一个加号上看到警告,上面写着:

This character may get silently deleted by one or more browsers

var x = '+1‬207XXXXXXX'
var y = '+1207XXXXXXX'

您也可以在有问题的字符串 (var x) 中尝试 deleting/backspacing +1。一些奇怪的结果。

此数据最初是在 Mac 上使用 Chrome 通过来自 Prisma Playground 的 GraphQL 突变输入到 MySQL 数据库中的。

如果我将上面的两个字符串都转换成十六进制来检查,你会发现它们确实不同:

2b31202c32303758585858585858(差)

2b3132303758585858585858(好)

另请注意,并非所有 AWS 区域都支持发送短信,当向不支持的区域发送消息时,您会看到同样的错误 "InvalidParameter: Invalid parameter: PhoneNumber Reason: +614##### is not valid to publish"它(在我的例子中是 us-west-1)。

有关支持发送 SMS 的区域列表,请参阅 the sns amazon docs on supported regions

归功于用户 RichPeaua in this comment of the AWS forums