1、首次开发阿里云平台短信验证码demo,建议仔细阅读相关参数,请求字符串生成规则,文章链接
https://help.aliyun.com/document_detail/101343.html?spm=a2c4g.11186623.2.10.5bf07535Jjz02z
文章参考了
阿里云短信验证码Javademo
阿里云C++短信发送程序:https://blog.csdn.net/u012023606/article/details/80633042
阿里云短信服务接口的c++实现:https://blog.csdn.net/py8105/article/details/80089001
C/C++ Java HmacSha1加密算法 Base64处理 URLencode: https://www.cnblogs.com/Bachelor/archive/2013/01/22/2870180.html
2、前面一、二篇博客中我们已经配置好了相关开发环境,所以就直接描述相关代码,
2.1、先看主程序中代码
`#include "pch.h"
#include "HMAC_SHA1.h"
#include "urlcodeing.h"
#include "SendMessage.h"
#include <ctime>
#include <vector>
using namespace std;
int main() {
//1、设定请求需要的参数值
char AccessKeyId[33] = "XXXXXXX";//阿里短信秘钥id
char Action[33] = "SendSms";
char SignatureMethod[33] = "HMAC-SHA1";
char SignatureVersion[16] = "1.0";
//char SignatureNonce[16] = { 0 };
string SignatureNonce;
char Signature[64] = { 0 };
char Version[16] = "2017-05-25";
char RegionId[16] = "cn-hangzhou";
char PhoneNumbers[16] = "139XXXX"; //需要发送的手机号码
char SignName[32] = "XXXXXX"; //短信签名名称。请在控制台签名管理页面签名名称一列查看。
char TemplateCode[16] = "SMS_XXXX"; //短信模板ID。请在控制台模板管理页面模板CODE一列查看。
char TemplateParam[32] = "{\"code\":\"2222\"}"; //短信模板变量对应的实际值,JSON格式。
char Timestamp[30] = { 0 };
char Url[512];
char TmpUrl[512];
char strUrl[512];
char accessSecret[34] = "XXXXXXXXXXXX&";// **阿里短信密钥(accessSecret)后加“&“符号,记住一定不能忘**
sendmessage sendmessage; //看到这,你就知道要创建头文件
CHMAC_SHA1 chmacsha1; //请参考上面(看到这,你就知道要创建头文件 )
time_t rawTime;
struct tm* timeInfo;
time(&rawTime);
timeInfo = gmtime(&rawTime);
strftime(Timestamp, sizeof(Timestamp), "%Y-%m-%dT%H:%M:%SZ", timeInfo);
cout << "Timestamp: " << Timestamp << endl;
SignatureNonce = sendmessage.getUUID();
strCoding strcoding; //请参考上面(看到这,你就知道要创建头文件 )
string str = sendmessage.specialUrlEncode(strcoding, SignName); //具体方法代码在后面。
cout << "str: " << str << endl;
//2. 根据参数Key排序(顺序)用到的特殊URL编码这个是POP特殊的一种规则,即在一般的URLEncode后再增加三种字符替换:
//加号 (+)替换成 %20、星号 (*)替换成 %2A、 %7E 替换回波浪号 (~)
//2.1 根据参数Key排序,URLEncode编码 ,**注:参数顺序不可以改变,** **啊啊啊啊啊!这么多,眼要看花了**
//注意代码中加粗的那段,一定不要搞错了!!!
snprintf(Url, 512 - 1, "%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s&%s=%s", \
sendmessage.UrlEncode(string("AccessKeyId")).c_str(), sendmessage.UrlEncode(string(AccessKeyId)).c_str(),\
sendmessage.UrlEncode(string("Action")).c_str(), sendmessage.UrlEncode(string(Action)).c_str(),\
sendmessage.UrlEncode(string("PhoneNumbers")).c_str(),sendmessage.UrlEncode(string(PhoneNumbers)).c_str(),\
sendmessage.UrlEncode(string("RegionId")).c_str(), sendmessage.UrlEncode(string(RegionId)).c_str(),\
sendmessage.UrlEncode(string("SignName")).c_str(), **sendmessage.specialUrlEncode(strcoding,string(SignName)).c_str()**, \
sendmessage.UrlEncode(string("SignatureMethod")).c_str(), sendmessage.UrlEncode(string(SignatureMethod)).c_str(),\
sendmessage.UrlEncode(string("SignatureNonce")).c_str(), sendmessage.UrlEncode(string(SignatureNonce)).c_str(), \
sendmessage.UrlEncode(string("SignatureVersion")).c_str(), sendmessage.UrlEncode(string(SignatureVersion)).c_str(), \
sendmessage.UrlEncode(string("TemplateCode")).c_str(), sendmessage.UrlEncode(string(TemplateCode)).c_str(), \
sendmessage.UrlEncode(string("TemplateParam")).c_str(), sendmessage.UrlEncode(string(TemplateParam)).c_str(), \
sendmessage.UrlEncode(string("Timestamp")).c_str(), sendmessage.UrlEncode(string(Timestamp)).c_str(), \
sendmessage.UrlEncode(string("Version")).c_str(), sendmessage.UrlEncode(string(Version)).c_str());
cout << "URL编码参数字符串: " << Url << endl;
string stringToSign = "GET&" + sendmessage.specialUrlEncode(strcoding, string("/")) + "&" + sendmessage.specialUrlEncode1(strcoding, string(Url));
cout << "stringToSign: " << stringToSign << endl;
//3、生成签名
string signature = sendmessage.acceptsignature(stringToSign, accessSecret);
//4、拼接请求字符串
snprintf(TmpUrl, 512 - 1, "http://dysmsapi.aliyuncs.com/?Signature=%s&%s", signature.c_str(), Url);
cout << "请求字符串: " << TmpUrl << endl;
//5、发送请求
if (sendmessage.SendHttpUrl(TmpUrl))
printf("send Sms success!\n");
else
printf("send Sms failed!\n");
return 0;
}`
是不是感觉主代码就五步特简单,请注意,前方高能预警!!!!
2.2、主函数中导入了头文件HMAC_SHA1.h,所以先看头文件HMAC_SHA1.h,代码如下:
#ifndef __HMAC_SHA1_H__
#define __HMAC_SHA1_H__
#include "SHA1.h"
typedef unsigned char BYTE;
class CHMAC_SHA1 : public CSHA1
{
private:
BYTE m_ipad[64];
BYTE m_opad[64];
char * szReport;
char * SHA1_Key;
char * AppendBuf1;
char * AppendBuf2;
public:
enum {
SHA1_DIGEST_LENGTH = 20,
SHA1_BLOCK_SIZE = 64,
HMAC_BUF_LEN = 4096
};
CHMAC_SHA1()
:szReport(new char[HMAC_BUF_LEN]),
AppendBuf1(new char[HMAC_BUF_LEN]),
AppendBuf2(new char[HMAC_BUF_LEN]),
SHA1_Key(new char[HMAC_BUF_LEN])
{}
~CHMAC_SHA1()
{
delete[] szReport;
delete[] AppendBuf1;
delete[] AppendBuf2;
delete[] SHA1_Key;
}
void HMAC_SHA1(BYTE *text, int text_len, BYTE *key, int key_len, BYTE *digest);
};
#endif /* __HMAC_SHA1_H__ */
2.3、再看HMAC_SHA1.cpp,代码如下:
//HMAC_SHA1.CPP code
//******************************************************************************
//* HMAC_SHA1.cpp : Implementation of HMAC SHA1 algorithm
//* Comfort to RFC 2104
//*
//******************************************************************************
#include &#