使用C++编写阿里云平台短信验证码demo (三)——阿里短信验证码请求字符串

本文详细介绍了如何使用C++编写阿里云短信验证码请求字符串,包括配置开发环境后的核心代码步骤,涉及HMAC_SHA1、SHA1、URL编码等关键函数实现,以及 SendMessage 头文件和源文件的内容。
摘要由CSDN通过智能技术生成

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 &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

print_out

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值