wendell,您好:
先说声谢谢,主要怕您没有耐心看到最后,我觉得您能看就很高兴了。
首先吐槽一句,通过腾讯云助手来找到一个人来回答我的疑问,是一件困难的事情,所以在网络上找到相关的文件,然后才找到您,希望您能有空告诉我,在哪出现问题了。第二再吐槽一句,API帮助文档写的,那真的是书呆子写的东西,我是看不懂。
言归正传,我碰到如下问题:
我需要在一个非常古老的系统(vb6.0)里面嵌入腾讯云短信的功能,就是事件触发了,给某个手机发一封短信即可,需求很简单,我仔细看了您们的帮助文档,基本上了解了一个大概,我先说一下我理解的如何使用这个API:
1)获得必要的各种key,id等信息:
这些我已经获得了,我申请的SignName=PlusStock,我已经通过API Exproler成功的,给我的手机发送了测试短信,应该是我已经具备了发短信的条件。
2) 获得签名串
通过HMAC-SHA1算法,对签名串进行转换,我使用的是V3.0 版本一,拼装签名串格式类似于下面的,除了Timestamp和Nonce两个参数需要每次变化外,其它的我把最关键改动了一些:
POSTsms.tencentcloudapi.com/?Action=SendSms&Language=zh-CN&Nonce=2741&PhoneNumberSet.0=+8613901xxxxx&Region=ap-
beijing&SecretId=AKIDZy7yYrte7KGuHMBjzyh9JCpXXXXXXX&SignName=PXXXtock&SmsSdkAppId=14XXXX5445&TemplateId=9XXXX05&TemplateParamSet.0=xxxx&TemplateParamSet.1=yyyy&Timestamp=162XXXX0725&Version=2021-01-11
最后得到类似下面的签名字符串:
P02NbSHN2zA1PeAJhxD04J53rhU=
编码后:
P02NbSHN2zA1PeAJhxD04J53rhU%3D
我在本地生成的签名串,与API Explorer中的对照,一样的,说明我生成签名字符串功能是对的。
3)把签名串,与上面其它的参数拼装,通过post或者get方法,发到主机:https://sms.tencentcloudapi.com/,然后服务器返回给我一个json格式的字符串,告诉我成功,或者不成功。
我现在获得的回复是:{"Response":{"Error":{"Code":"AuthFailure.SignatureFailure","Message":"请求签名验证失败,请检查您的签名计算是否正确。"},"RequestId":"a77c7f83-ad4a-45ef-a109-d90793da58c0"}}
我的疑问: 1)我对如何调用API理解是否有误?是不是在post或者get方法之前,只要把签名串加进去,组装成如下形式的body即可?
Action=SendSms&Language=zh-CN&Nonce=2741&PhoneNumberSet.0=+8613901xxxxx&Region=ap-beijing&SecretId=AKIDZy7yYrte7KGuHMBjzyh9JCpXXXXXXX&SignName=PXXXtock&SmsSdkAppId=14XXXX5445&TemplateId=9XXXX05&TemplateParamSet.0=xxxx&TemplateParamSet.1=yyyy&Timestamp=162XXXX0725&Version=2021-01-11&Signature=ytVhc4K1qnDAxyM51jF7%2F6YXHWs%3D
2)我的源代码可能太老了,可能不认识,我大概说一下就是:
Dim objXML As New MSXML2.XMLHTTP
'打开链接对象信息
objXML.Open "POST", sHost, False //sHost=https://sms.tencentcloudapi.com/
'设置头部
objXML.SetRequestHeader "Content-Type", "application/x-www-form-urlencoded"
'发送请求,此处body,就是上面的1)中的内容,做了utf-8转换,最后结果就是1)中的样子
sBody = StrConv(EncodeToBytes(sQueryString), vbUnicode)
objXML.Send sBody
If objXML.Status <> 200 Then '判断文档是否已经解析完,以做客户端接受返回消息
'失败
sResult = ""
Else
'成功
'返回文本内容的信息
sResult = objXML.ResponseText
End If
'关闭对象
Set objXML = Nothing
'输出结果
debug.print sResult