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

  • 时间:
  • 浏览:2

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

//TemplateParam,累似 ,"{\"customer\":\"test\"}",

    //签名内容缓存

    std::string sortQueryStringTmp = "";

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

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

    std::string  bufNonce = getUUID();

    std::string Timestamp = getCurentTimeDesc();

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

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

    myArgHttp.TemplateParam = ASCII2UTF_8(templateParam_);

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

5)阿里云短信接口的http实现关键是做好签名,已经 按通用的http访问请求实现即可,另外前要有点儿注意的是注意阿里上面短信定义要求,累似 变量不还都还能能 中含限制字符,变量长度不还都还能能 超过20等等

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

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

    bool ret;

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

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

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

   //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());

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

最近在调用阿里云短信服务接口发现并如此c++的资料,网上查询发现也是零星描述,机会自身项目基础累积了C++的越多,愿意掺杂越多语言,就自行实现c++的阿里云短信接口,其难点就在于签名而已,希望能给亲戚亲戚亲们提供参考。

    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());

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

3)准备工作完成,开使英语 短信申请全过程,另一方借助acl-master库实现,用某些网页访问接口的请斟酌参考

   //将签名加入请求字段

  if (ret == true)

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

    }

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

    //生成签名,调用签名算法函数,注意阿里的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);

*UUID的生成实现函数:

*url格式转换需求:

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

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

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

4)最终呈现效果

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

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

*重点二,Base64算法实现

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

//变量的描述字段限制20位,累似 ,test不还都还能能 超过20个字符长度,已经 出错   

    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_);

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

*用于ascii和utf-8的字符格式转换,某些某些的格式转换也共同给出,处理特定前要,主只是阿里参数中文机会前要用到

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

    acl::http_ctype content_type;

    content_type.parse(p);

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

图二的签名与图一部一致是机会两张图片分别来自有4个 多 请求的截图

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

        printf("read ok!");

   //访问类型为Get

    header.set_method(acl::HTTP_METHOD_GET);

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

//机会模版变量个数在 TemplateParam如此全含括或任意字段不匹配,都无法正常短信发送

    header.set_keep_alive(false);//

    acl::http_request req(acladdr);

    //请求构造

    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());

    //

   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)

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

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

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

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

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

        ret = do_plain(req);