大发时时彩玩法—大发快3彩票平台

阿里云短信服务接口的c++实现

时间:2020-02-16 12:49:47 出处:大发时时彩玩法—大发快3彩票平台

   //访问类型为Get

    header.set_method(acl::HTTP_METHOD_GET);

 *阿里云短信接口参数的时间格式要求:

2)参考阿里云的“HTTP协议及签名”(https://help.aliyun.com/document_detail/56189.html?spm=a2c4g.11186623.6.581.fy2faU)描述文档,先做不用 必要的准备:

   //base64算法调用,前面签名算法结果作为输入参数,得到最终签名

    header.add_param("Version", myArgHttp.Version.c_str());

最近在调用阿里云短信服务接口发现并这麼c++的资料,网上查询发现也是零星描述,不可能 自身项目基础主次了C++的不用 ,我想要掺杂不用 语言,就自行实现c++的阿里云短信接口,其难点就在于签名而已,希望能给我们 提供参考。

//TemplateParam,类式于,"{\"customer\":\"test\"}",

    acl::http_header& header = req.request_header();

    sortQueryStringTmp.append("&").append(UrlEncode(urlcode));

   bool rc = req.request(NULL, 0);//http请求

    // 将 build_request 放满去 req.request 上方,是不可能

    // req.request 外部不可能 会修改请求头中的字段

    acl::string hdr;

    header.build_request(hdr);

   printf("request header:\r\n%s\r\n", hdr.c_str());

    if (rc == false)

   printf( "HmacSHA1算法+Base64:\r\n%s\r\n", hmac.c_str());

开通短信服务后,在你账户头像下AccessKeys选项进入用户信息管理界面,获取到你的AccessKeyId和AccessKeySecret,具体请参考阿里云短信服务的资料完成操作

//进行传输短信的变量与你阿里短信服务模版的变量一致,(如都所处”customer“变量)

//不可能 模版变量个数在 TemplateParam这麼全含括或任意字段不匹配,都无法正常短信发送

   // 取出 HTTP 响应头的 Content-Type 字段  

    const char* p = req.header_value("Content-Type");

   //不用 参数加入,注意中文字段UTF-8表述

*UUID的生成实现函数:

    printf( "待签名的请求字符串UrlEncode:\r\n%s\r\n", sortQueryStringTmp.c_str());

    hmac = ZBase64::Encode((const unsigned char*)hmac.c_str(), static_cast<int>(hmac.length()));

    //签名内容缓存

    std::string sortQueryStringTmp = "";

    sortQueryStringTmp.append("GET&").append(UrlEncode("/"));

    //签名内容项,参数key的字符串排序

    std::string  bufNonce = getUUID();

    std::string Timestamp = getCurentTimeDesc();

4)最终呈现效果

    header.add_param("Action", myArgHttp.Action.c_str());

    header.add_param("Format", myArgHttp.Format.c_str());

    header.add_param("OutId", myArgHttp.OutId.c_str());

    header.add_param("PhoneNumbers", myArgHttp.PhoneNumbers.c_str());

    header.add_param("RegionId", myArgHttp.RegionId.c_str());

    header.add_param("SignName", ASCII2UTF_8(myArgHttp.SignName).c_str());

    header.add_param("SignatureMethod", myArgHttp.SignatureMethod.c_str());

    header.add_param("SignatureNonce", bufNonce.c_str());

    header.add_param("SignatureVersion", myArgHttp.SignatureVersion.c_str());

    header.add_param("TemplateCode", myArgHttp.TemplateCode.c_str());

    header.add_param("TemplateParam", myArgHttp.TemplateParam.c_str());

    header.add_param("Timestamp", Timestamp.c_str());

    header.set_keep_alive(false);//

    header.add_param("Signature", hmac.c_str());

    printf("send request ok!\r\n");

   //url

    header.set_url(aclurl);

    //host

    if (header.get_host() == NULL)

    {

        header.set_host(myArgHttp.addr_.c_str());

        printf(">>>set host: %s\r\n", myArgHttp.addr_.c_str());

    }

    else

        printf(">>>host: %s\r\n", header.get_host());

 *重点一,签名算法实现,来源网上公开的不用 资料,经过实践实用c语言函数

5)阿里云短信接口的http实现关键是做好签名,就让 按通用的http访问请求实现即可,另外前要很重注意的是注意阿里上方短信定义要求,类式于变量必须蕴藏限制字符,变量长度必须超过20等等

    myArgHttp.TemplateParam = ASCII2UTF_8(templateParam_);

    std::string hmac = std::string(hmac_buf,strlen(hmac_buf));

    *注册阿里云,有前要的阿里云产品通用代金券的可上可不能否点击下面链接进行领取:

https://promotion.aliyun.com/ntms/yunparter/invite.html?userCode=pfb500n4a

// 分析 HTTP 响应头的数据类型  

    acl::http_ctype content_type;

    content_type.parse(p);

    // 响应头数据类型的子类型  

    acl::url_coder coder;//注意中文字段UTF-8表述

    coder.set("AccessKeyId", myArgHttp.AccessKeyId.c_str());

    coder.set("Action", myArgHttp.Action.c_str());

    coder.set("Format", myArgHttp.Format.c_str());

    coder.set("OutId", myArgHttp.OutId.c_str());

    coder.set("PhoneNumbers", myArgHttp.PhoneNumbers.c_str());

    coder.set("RegionId", myArgHttp.RegionId.c_str());

    coder.set("SignName", ASCII2UTF_8(myArgHttp.SignName).c_str());

    coder.set("SignatureMethod", myArgHttp.SignatureMethod.c_str());

    coder.set("SignatureNonce", bufNonce.c_str());

    coder.set("SignatureVersion", myArgHttp.SignatureVersion.c_str());

    coder.set("TemplateCode", myArgHttp.TemplateCode.c_str());

    coder.set("TemplateParam", myArgHttp.TemplateParam.c_str());

    coder.set("Timestamp", Timestamp.c_str());

    coder.set("Version", myArgHttp.Version.c_str());

    //

   printf( "排序参数集:\r\n%s\r\n", urlcode.c_str());

    acl::http_request req(acladdr);

    //请求构造

1)我的网页调用接口采用acl_master实现的,acl_master是两个多跨平台c/c++库,提供了网络通信库及服务器编程框架,一块儿提供更多的实用功能库及示例。(下载地址:Github: https://github.com/acl-dev/acl),读者可采用不用 库实现。

        ret = do_plain(req);

        printf("read ok!");

    header.add_param("AccessKeyId", myArgHttp.AccessKeyId.c_str());

    }

*url格式转换需求:

//变量的描述字段限制20位,类式于,test必须超过20个字符长度,就让 出错   

*重点二,Base64算法实现

   //将签名加入请求字段

    acl::string aclurl, acladdr;//定义网站、地址

    aclurl.format("http://%s%s", myArgHttp.addr_.c_str(), myArgHttp.path_.c_str());

    acladdr.format("%s:%d", myArgHttp.addr_.c_str(), myArgHttp.port_);

  if (ret == true)

    std::string urlcode = std::string(coder.to_string().c_str());//

    header.accept_gzip(accept_gzip ? true : false);//

   printf( "密钥+HmacSHA1算法:\r\n%s\r\n", hmac.c_str());

3)准备工作完成,刚开始短信申请全过程,自己借助acl-master库实现,用不用 网页访问接口的请斟酌参考

    bool ret;

    *根据"http协议及签名”描述文档,定义了短信请求参数形态学 ,初始化中带*的请自行写入自己实际参数:

图二的签名与图一部一致是不可能 两张图片分别来自两个多请求的截图

    //生成签名,调用签名算法函数,注意阿里的AccessKeySecret+&才是真正的AccessKeySecret

    char hmac_buf[256] = { 0 };

    std::string KeySecret_ali = (myArgHttp.AccessKeySecret + "&");

    hmac_sha((char*)(ASCII2UTF_8(KeySecret_ali)).c_str(), (int)KeySecret_ali.length()

        , (char*)ASCII2UTF_8(sortQueryStringTmp).c_str(), (int)sortQueryStringTmp.length(), hmac_buf, 20);

*用于ascii和utf-8的字符格式转换,不用 不用 的格式转换也一块儿给出,出理 特定前要,主就让 阿里参数中文不可能 前要用到

热门

热门标签