我们正在使用AWS SNS发送短信。在测试中,它适用于除了我们的一个没有接收消息的开发人员之外的所有开发人员,日志显示以下内容:
Invalid parameter: PhoneNumber Reason: +1207XXXXXXX 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 DB中手动更新用户的电话号码来解决这个问题。不确定它是否是字符编码问题或类似问题,但我认为它一定是。如果我确定确切的原因,我会回复。
更新:这肯定是由编码问题引起的,将下面的代码粘贴到jsfiddle中,然后鼠标悬停以查看第一个加号上的警告:
This character may get silently deleted by one or more browsers
var x = '+1207XXXXXXX'
var y = '+1207XXXXXXX'
您还可以尝试在有问题的字符串(var x)中删除/退回+
或1
。一些奇怪的结果。
这些数据最初是通过使用Chrome on Mac的Prisma Playground的GraphQL变异输入MySQL数据库的。
如果我将上面的两个字符串转换为十六进制来检查,你会发现它们确实不同:
2b31202c32303758585858585858
(坏)
2b3132303758585858585858
(好)
另请注意,并非所有AWS区域都支持发送SMS,您会看到同样的错误“InvalidParameter:Invalid parameter:PhoneNumber Reason:+614 #####无效发布”,当发送消息到没有'的区域时支持它(在我的例子中是us-west-1)。
有关支持发送SMS的区域列表,请参阅the sns amazon docs on supported regions。
感谢用户RichPeaua in this comment of the AWS forums。