一、环境搭建
首先在官网注册和登录:https://dysms.console.aliyun.com/overview
然后开通短信服务,并且进行充值购买(也有活动免费送的)
然后跟着下图的指示完成前三个信息填写即可(后两个不需要管其实):
二、控制台发送短信测试
注意需要先按下图指引绑定要测试的手机号,后面发送的时候才能接收到!
三、API 使用测试
先创建 AccessKey:
AccessKey ID 和 AccessKey Secret 是我们访问阿里云 API 的密钥,具有该账户完全的权限,需要我们妥善保管!
创建完毕之后,回到短信服务首页,调用 API 发送短信:
此时跳转到调试代码网页,如下所示,我们选择 c++ sdk:
细节如下所示:
不过在此之前我们要去安装一下 c++ sdk 到我们项目中,才能有头文件供我们使用!
# 安装依赖
sudo apt-get install -y libcurl4-openssl-dev libssl-dev uuid-dev libjsoncpp-dev
# 克隆代码
git clone https://github.com/aliyun/aliyun-openapi-cpp-sdk.git
# 一键编译安装
sudo sh easyinstall.sh core 后面我们直接 copy 网页中的样例代码进行修改即可!
如下所示:
#include <cstdlib>
#include <iostream>
#include <alibabacloud/core/AlibabaCloud.h>
#include <alibabacloud/core/CommonRequest.h>
#include <alibabacloud/core/CommonClient.h>
#include <alibabacloud/core/CommonResponse.h>
using namespace std;
using namespace AlibabaCloud;
int main( int argc, char** argv )
{
AlibabaCloud::InitializeSdk();
AlibabaCloud::ClientConfiguration configuration( "cn-chengdu" ); // 这里需要改成cn-chengdu
configuration.setConnectTimeout(1500);
configuration.setReadTimeout(4000);
// 需要关注两个key:
std::string access_key_id = "LTAI5t9kmjtWSZQ4mvqTaW9g";
std::string access_key_secret = "VYkXgQO679Azxq7EY4n4hNcOQeobqN";
AlibabaCloud::Credentials credential(access_key_id, access_key_secret);
AlibabaCloud::CommonClient client( credential, configuration );
AlibabaCloud::CommonRequest request(AlibabaCloud::CommonRequest::RequestPattern::RpcPattern);
request.setHttpMethod(AlibabaCloud::HttpRequest::Method::Post);
request.setDomain("dysmsapi.aliyuncs.com"); // 这里需要改成dysmsapi.aliyuncs.com
request.setVersion("2017-05-25");
request.setQueryParameter("Action", "SendSms");
request.setQueryParameter("SignName", "利刃大大");
request.setQueryParameter("TemplateCode", "SMS_479250309");
// 然后关注下面的手机号以及验证码即可:
request.setQueryParameter("PhoneNumbers", "18063551124");
request.setQueryParameter("TemplateParam", "{\"code\":\"1234\"}");
auto response = client.commonResponse(request);
if (response.isSuccess()) {
printf("request success.\n");
printf("result: %s\n", response.result().payload().c_str());
} else {
printf("error: %s\n", response.error().errorMessage().c_str());
printf("request id: %s\n", response.error().requestId().c_str());
}
AlibabaCloud::ShutdownSdk();
return 0;
} makefile 文件:
test : test.cc
g++ -std=c++17 $^ -o $@ -lalibabacloud-sdk-core
Ⅱ. 二次封装
#pragma once
#include <cstdlib>
#include <iostream>
#include <memory>
#include <alibabacloud/core/AlibabaCloud.h>
#include <alibabacloud/core/CommonRequest.h>
#include <alibabacloud/core/CommonClient.h>
#include <alibabacloud/core/CommonResponse.h>
#include "logger.hpp"
class DMSClient
{
public:
using ptr = std::shared_ptr<DMSClient>;
public:
DMSClient(const std::string &access_key_id,
const std::string &access_key_secret)
{
AlibabaCloud::InitializeSdk();
AlibabaCloud::ClientConfiguration configuration( "cn-chengdu" );
configuration.setConnectTimeout(1500);
configuration.setReadTimeout(4000);
AlibabaCloud::Credentials credential(access_key_id, access_key_secret);
_client = std::make_unique<AlibabaCloud::CommonClient>(credential, configuration);
}
~DMSClient() { AlibabaCloud::ShutdownSdk(); }
bool send(const std::string &phone, const std::string &code)
{
AlibabaCloud::CommonRequest request(AlibabaCloud::CommonRequest::RequestPattern::RpcPattern);
request.setHttpMethod(AlibabaCloud::HttpRequest::Method::Post);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setQueryParameter("Action", "SendSms");
request.setQueryParameter("SignName", "利刃大大");
request.setQueryParameter("TemplateCode", "SMS_479250309");
// 设置手机和验证码
request.setQueryParameter("PhoneNumbers", phone);
std::string param_code = "{\"code\":\"" + code + "\"}";
request.setQueryParameter("TemplateParam", param_code);
auto response = _client->commonResponse(request);
if (!response.isSuccess()) {
LOG_ERROR("短信验证码请求失败:{}", response.error().errorMessage());
return false;
}
return true;
}
private:
std::unique_ptr<AlibabaCloud::CommonClient> _client;
};测试代码
#include "../../../header/dms.hpp"
#include "gflags/gflags.h"
using namespace liren;
DEFINE_string(key_id, "LTAI5tGrJuae6eAfHmi9jiyg", "平台访问密钥ID");
DEFINE_string(key_secret, "hEdQhNgyEw7io6GvkTtz4y0VRnnnJv", "平台访问密钥");
DEFINE_bool(run_mode, false, "程序的运行模式,false-调试; true-发布;");
DEFINE_string(log_file, "", "发布模式下,用于指定日志的输出文件");
DEFINE_int32(log_level, 0, "发布模式下,用于指定日志输出等级");
int main(int argc, char *argv[])
{
google::ParseCommandLineFlags(&argc, &argv, true);
init_logger(FLAGS_run_mode, FLAGS_log_file, FLAGS_log_level);
DMSClient client(FLAGS_key_id, FLAGS_key_secret);
client.send("18063551124", "1234");
return 0;
} makefile 文件:
test : test.cc
g++ -std=c++17 $^ -o $@ -lalibabacloud-sdk-core -lfmt -lspdlog -lgflags 手机收到短信证明可以了!