我正在尝试使用 OVH 的短信服务发送短信,遵循 此文档。
当我测试 URL 的 send with post 方法时https://eu.api.ovh.com/1.0/sms/sms-zj16668-1/jobs
我得到一个
错误代码:INVALID_SIGNATURE
签名计算如下:
String signature = "$1$" + HashSHA1(AS + "+" + CK + "+" + METHOD + "+" + QUERY + "+" + BODY + "+" + TSTAMP);
使用 GET 方法(无正文)我得到了成功的结果,但是当我更改为使用带有正文的 POST 方法时,会触发上述错误。
这是我传递给签名的正文:
string BODY = @"{ ""receivers"": [ ""+33601020304"" ], ""message"": ""Test SMS OVH"", ""senderForResponse"": true}";
我做错了什么?
我在 OVH 社区中发现了类似的问题以及使用 TLS1.2 协议的解决方案,但是即使在添加了这行建议的代码之后:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | (SecurityProtocolType)768 | (SecurityProtocolType)3072;
我仍然遇到同样的错误。
我知道已经有一段时间了,但我遇到了同样的问题,现在它正在工作,所以我将分享我的代码。 (如果代码的某些部分很奇怪,请提前抱歉,我是初学者。)
首先,我创建了一个类,它将成为签名中使用的主体:
public class MessageBody
{
public string charset { get; set; }
public List<string> receivers { get; set; }
public string message { get; set; }
public string priority { get; set; }
public bool senderForResponse { get; set; }
public string sender { get; set; }
public MessageBody() { }
public MessageBody(string _charset, List<string> _receivers, string _message, string _priority, bool _senderForResponse, string _sender)
{
charset = _charset;
receivers = _receivers;
message = _message;
priority = _priority;
senderForResponse = _senderForResponse;
sender = _sender;
}
}
定义查询后,我初始化新对象并将其转换为 JSON 字符串:
MessageBody body = new MessageBody
{
charset = "UTF-8",
receivers = numbersToSendTextTo,
message = text,
priority = "high",
senderForResponse = true,
sender = "anything you want"
};
// This line require the Newtonsoft NuGet package
string bodyJson = JsonConvert.SerializeObject(body);
注意:Visual Studio 告诉我属性名称的第一个字母应该大写,但这样做会使 JSON 无法使用。
我没有更改时间戳中的任何内容,但我确实更改了签名的书写方式:
string signature = "$1$" + HashSHA1($"{AS}+{CK}+{method}+{query}+{bodyJson}+{timeStamp}");
我没有放置你提到的代码,这会改变安全协议。
我真的不知道为什么会这样,我唯一的提示是关于空格字符,它使签名对 OVH 无效。我希望它会有所帮助!