• Delphi调用腾讯云最新签名方法v3 TC3-HMAC-SHA256发送短信


    相关资料:

    https://blog.csdn.net/hsuzo1/article/details/113823621

    一、TC3鉴权单元

    为了方便复用,写了一个TC3鉴权单元文件:TC3_Authorization.pas

      1 {
      2 2021-02-15
      3 广西南宁
      4 张旭州
      5 腾讯云 TC3-HMAC-SHA256 生成鉴权数据
      6 }
      7  
      8 unit TC3_Authorization;
      9  
     10 interface
     11  
     12 uses
     13   System.SysUtils, System.hash, System.NetEncoding, System.DateUtils;
     14  
     15 { -------------------------------------------------------------------------------
     16   过程名:    genTC3Auth
     17   作者:      张旭州
     18   日期:      2021.02.15
     19   参数:      SecretKey, SecretId, sDomain, bodyJSON, Service: string
     20   参数说明: AccessKeyID,AccessKeySecret,域名, 待发送的数据主体JSON, 服务ocr, cvm
     21   返回值:    string
     22   
     23   参数参考如下:
     24     SecretKey := '您的腾讯云SecretKey';
     25     SecretId := '您的腾讯云SecretId';
     26     Service := 'sms'  //发送短信
     27     sDomain := 'sms.tencentcloudapi.com'   //短信发送的域名
     28   ------------------------------------------------------------------------------- }
     29 function genTC3Auth(SecretKey, SecretId, sDomain, bodyJSON, Service: string): string;
     30  
     31 implementation
     32  
     33  
     34 function DateTimeToUnix(const AValue: TDateTime): Int64;
     35 // 日期转Unix时间戳
     36 begin
     37   Result := System.DateUtils.DateTimeToUnix(AValue) - 8 * 60 * 60;
     38 end;
     39  
     40 //腾讯云TC3 V3签名鉴权
     41 function genTC3Auth(SecretKey, SecretId, sDomain, bodyJSON, Service: string): string;
     42 var
     43   httpRequestMethod: string; // = "POST";
     44   canonicalUri: string; //= "/";
     45   canonicalQueryString: string; //= "";
     46   canonicalHeaders: string; // = "content-type:application/json; charset=utf-8
    " + "host:" + host + "
    ";
     47   signedHeaders: string; //= "content-type;host";
     48   SecretDate, SecretService, SecretSigning, Signature: TBytes;
     49   StringToSign, payload, CanonicalRequest, HashedRequestPayload, HashedCanonicalRequest: string;
     50   sDate,timestamp : string;
     51   Authorization, CredentialScope : string;
     52 begin
     53   sDate := FormatDateTime('YYYY-MM-DD', now());
     54   timestamp := DateTimeToUnix(now).ToString;
     55   httpRequestMethod := 'POST';
     56   canonicalUri := '/';
     57   canonicalQueryString := '';
     58   canonicalHeaders := 'content-type:application/json' + #10
     59       + 'host:' + sDomain + #10;
     60   signedHeaders := 'content-type;host';
     61  
     62   payload := bodyJSON;
     63   //待发送的数据的哈希值:
     64   HashedRequestPayload := THashSHA2.GetHashString(payload);
     65  
     66   //拼接规范请求串
     67   CanonicalRequest := httpRequestMethod + #10
     68       + canonicalUri + #10
     69       + canonicalQueryString + #10
     70       + canonicalHeaders + #10
     71       + signedHeaders + #10
     72       + HashedRequestPayload;
     73  
     74   //计算派生签名密钥
     75   SecretDate := THashSHA2.GetHMACAsBytes(sDate, TEncoding.utf8.GetBytes('TC3' + SecretKey));
     76   SecretService := THashSHA2.GetHMACAsBytes(Service, SecretDate);
     77   SecretSigning := THashSHA2.GetHMACAsBytes('tc3_request', SecretService);
     78  
     79   //规范请求串的哈希值
     80   HashedCanonicalRequest := THashSHA2.GetHashString(CanonicalRequest);
     81   //组装待签名字符串
     82   StringToSign := 'TC3-HMAC-SHA256' + #10
     83       + timestamp + #10
     84       + sDate + '/' + Service + '/tc3_request' + #10
     85       + HashedCanonicalRequest;
     86   //计算签名
     87   Signature := THashSHA2.GetHMACAsBytes(Bytesof(StringToSign), SecretSigning);
     88 //  Application.MessageBox(PChar(THash.DigestAsString(Signature)),
     89 //      '提示', MB_OK + MB_ICONINFORMATION + MB_TOPMOST);
     90  
     91   CredentialScope := sDate + '/' + Service + '/tc3_request';
     92   //拼接 Authorization
     93   Authorization :=
     94     'TC3-HMAC-SHA256' + ' ' +
     95     'Credential=' + SecretId + '/' + CredentialScope + ', ' +
     96     'SignedHeaders=' + SignedHeaders + ', ' +
     97     'Signature=' + StringReplace(PChar(THash.DigestAsString(Signature)), Chr(13) + Chr(10), '',
     98     [rfReplaceAll]);
     99  
    100   Result := Authorization;
    101 end;
    102  
    103 end.

    二、短信发送模块

    在implementation下 uses
     Unit2, TC3_Authorization;

     1 procedure TForm1.btn_tc3_sendClick(Sender: TObject);
     2 var
     3   strMobile, SecretKey, SecretId,sdkappid,sign, params, tpl_id, strjson:string;
     4   tc3 : string;
     5   url : string;
     6   http : TIdHTTP;
     7   jsonToSend : TStringStream;
     8   Aresult:string;
     9   //申明变量
    10   Root:TJSONObject;    //uses System.JSON;
    11   jsonArray: TJSONArray; // JSON数组变量
    12   list : TStringList;
    13   i : Integer;
    14   phoneSet : string;
    15  
    16 begin
    17   list := TStringList.Create;
    18   list.CommaText := edt_strMobile.Text;
    19   for i := 0 to list.Count -1  do
    20   begin
    21     phoneSet := phoneSet + '"86' + list[i] + '",'
    22   end;
    23  
    24   strMobile := phoneSet.Remove(Length(phoneSet)-1);
    25   list.Free;
    26  
    27   SecretKey := '您的Key';
    28   SecretId := '您的ID';
    29   sdkappid := edt_sdkappid.Text;
    30   sign := edt_sign.Text;
    31   params := edt_params.Text;
    32   tpl_id := edt_tpl_id.Text;
    33  
    34   strjson := '{'
    35   + '"PhoneNumberSet":['
    36   + strMobile
    37   + '],'
    38   + '"TemplateParamSet":' + params
    39   + ','
    40   + '"TemplateID":"'
    41   + tpl_id
    42   + '",'
    43   + '"SmsSdkAppid":"'
    44   + sdkappid
    45   + '",'
    46   + '"Sign":"'
    47   + sign
    48   +'"}';
    49  
    50   tc3 := TC3_Authorization.genTC3Auth(SecretKey, SecretId, 'sms.tencentcloudapi.com',
    51      strjson, 'sms');
    52   url := 'https://sms.tencentcloudapi.com/';
    53   http := TIdHttp.Create(nil);
    54   http.HandleRedirects := True;
    55   http.ReadTimeout := 3000;
    56   http.Request.ContentType := 'application/json';//设置内容类型为json
    57  
    58   jsonToSend := TStringStream.Create(strjson, TEncoding.UTF8);
    59   jsonToSend.Position := 0;//将流位置置为0
    60   http.Request.CustomHeaders.Clear;
    61   http.Request.CustomHeaders.AddValue('Authorization', ' ' + tc3);
    62   http.Request.CustomHeaders.AddValue('Content-Type', ' application/json');
    63   http.Request.CustomHeaders.AddValue('Host', ' sms.tencentcloudapi.com');
    64   http.Request.CustomHeaders.AddValue('X-TC-Action', ' SendSms');
    65   http.Request.CustomHeaders.AddValue('X-TC-Timestamp', ' ' + gwj_DateTimeToUnix(now).ToString);
    66   http.Request.CustomHeaders.AddValue('X-TC-Version', ' 2019-07-11');
    67  
    68   http.Request.AcceptCharSet := 'UTF-8';
    69   http.Request.AcceptEncoding := 'UTF-8';
    70   http.Request.AcceptLanguage := 'UTF-8';
    71   http.Request.CharSet := 'UTF-8';
    72 //  http.HTTPOptions := IdHTTP.HTTPOptions + [hoKeepOrigProtocol];
    73  
    74   Aresult := http.Post(url, jsonToSend);//用MEMO控件接收POST后的数据返回
    75   Aresult := UnicodeToChinese(Aresult);
    76   Memo1.Text := Aresult;
    77   jsonToSend.free;
    78   http.free;
    79  
    80   //发送成功的示例
    81   //{"Response":{"SendStatusSet":[{"SerialNo":"2019:2892974270720676287","PhoneNumber":"+8613377131696","Fee":1,"SessionContext":"","Code":"Ok","Message":"send success","IsoCode":"CN"}],"RequestId":"b2e1fdcb-e877-4bbe-89cc-e7cae7cb567d"}}
    82  
    83   Root:= TJSONObject.ParseJSONValue(Trim(Aresult)) as TJSONObject;   //uses System.JSON;
    84   Root := Root.GetValue('Response') as TJSONObject;
    85   jsonArray := Root.GetValue('SendStatusSet') as TJSONArray ;
    86  
    87   Root := jsonArray.Get(0) as TJSONObject; //第一个号码结果
    88  
    89   edt_result.Text := Root.GetValue('Code').Value;
    90   edt_errmsg.Text := Root.GetValue('Message').Value;
    91   edt_ext.Text := Root.GetValue('SessionContext').Value;
    92 end;
    作者:疯狂Delphi
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.

    欢迎关注我,一起进步!扫描下方二维码即可加我

  • 相关阅读:
    JS中的一些遍历方法
    JS中关于引用类型数据及函数的参数传递
    JS中关于数组的操作
    CSS中的一些伪类
    JS中的回调函数
    JS中关于构造函数、原型链、prototype、constructor、instanceof、__proto__属性
    JDK的安装及环境变量配置
    JS中的this指针
    JS中的数据类型
    Word中页码及目录、参考文献的制做方法
  • 原文地址:https://www.cnblogs.com/FKdelphi/p/14592585.html
Copyright © 2020-2023  润新知