参考了高文杰先生的代码,结合自己的学习增添了最新TC3-HMAC-SHA256 v3版本的接口。

腾讯云的TC3 v3鉴权比较复杂,当然这是相对于Delphi下而言,其实在Python下直接使用SDK要省事儿的多。本文的源代码就不贴了,需要的可以去原文下载。

一、TC3鉴权单元

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

{
2021-02-15
广西南宁
张旭州
腾讯云 TC3-HMAC-SHA256 生成鉴权数据
}unit TC3_Authorization;interfaceusesSystem.SysUtils, System.hash, System.NetEncoding, System.DateUtils;{ -------------------------------------------------------------------------------过程名:    genTC3Auth作者:      张旭州日期:      2021.02.15参数:      SecretKey, SecretId, sDomain, bodyJSON, Service: string参数说明: AccessKeyID,AccessKeySecret,域名, 待发送的数据主体JSON, 服务ocr, cvm返回值:    string参数参考如下:SecretKey := '您的腾讯云SecretKey';SecretId := '您的腾讯云SecretId';Service := 'sms'  //发送短信sDomain := 'sms.tencentcloudapi.com'   //短信发送的域名------------------------------------------------------------------------------- }
function genTC3Auth(SecretKey, SecretId, sDomain, bodyJSON, Service: string): string;implementationfunction DateTimeToUnix(const AValue: TDateTime): Int64;
// 日期转Unix时间戳
beginResult := System.DateUtils.DateTimeToUnix(AValue) - 8 * 60 * 60;
end;//腾讯云TC3 V3签名鉴权
function genTC3Auth(SecretKey, SecretId, sDomain, bodyJSON, Service: string): string;
varhttpRequestMethod: string; // = "POST";canonicalUri: string; //= "/";canonicalQueryString: string; //= "";canonicalHeaders: string; // = "content-type:application/json; charset=utf-8\n" + "host:" + host + "\n";signedHeaders: string; //= "content-type;host";SecretDate, SecretService, SecretSigning, Signature: TBytes;StringToSign, payload, CanonicalRequest, HashedRequestPayload, HashedCanonicalRequest: string;sDate,timestamp : string;Authorization, CredentialScope : string;
beginsDate := FormatDateTime('YYYY-MM-DD', now());timestamp := DateTimeToUnix(now).ToString;httpRequestMethod := 'POST';canonicalUri := '/';canonicalQueryString := '';canonicalHeaders := 'content-type:application/json' + #10+ 'host:' + sDomain + #10;signedHeaders := 'content-type;host';payload := bodyJSON;//待发送的数据的哈希值:HashedRequestPayload := THashSHA2.GetHashString(payload);//拼接规范请求串CanonicalRequest := httpRequestMethod + #10+ canonicalUri + #10+ canonicalQueryString + #10+ canonicalHeaders + #10+ signedHeaders + #10+ HashedRequestPayload;//计算派生签名密钥SecretDate := THashSHA2.GetHMACAsBytes(sDate, TEncoding.utf8.GetBytes('TC3' + SecretKey));SecretService := THashSHA2.GetHMACAsBytes(Service, SecretDate);SecretSigning := THashSHA2.GetHMACAsBytes('tc3_request', SecretService);//规范请求串的哈希值HashedCanonicalRequest := THashSHA2.GetHashString(CanonicalRequest);//组装待签名字符串StringToSign := 'TC3-HMAC-SHA256' + #10+ timestamp + #10+ sDate + '/' + Service + '/tc3_request' + #10+ HashedCanonicalRequest;//计算签名Signature := THashSHA2.GetHMACAsBytes(Bytesof(StringToSign), SecretSigning);
//  Application.MessageBox(PChar(THash.DigestAsString(Signature)),
//      '提示', MB_OK + MB_ICONINFORMATION + MB_TOPMOST);CredentialScope := sDate + '/' + Service + '/tc3_request';//拼接 AuthorizationAuthorization :='TC3-HMAC-SHA256' + ' ' +'Credential=' + SecretId + '/' + CredentialScope + ', ' +'SignedHeaders=' + SignedHeaders + ', ' +'Signature=' + StringReplace(PChar(THash.DigestAsString(Signature)), Chr(13) + Chr(10), '',[rfReplaceAll]);Result := Authorization;
end;end.

二、短信发送模块

在implementation下 uses
 Unit2, TC3_Authorization;

procedure TForm1.btn_tc3_sendClick(Sender: TObject);
varstrMobile, SecretKey, SecretId,sdkappid,sign, params, tpl_id, strjson:string;tc3 : string;url : string;http : TIdHTTP;jsonToSend : TStringStream;Aresult:string;//申明变量Root:TJSONObject;    //uses System.JSON;jsonArray: TJSONArray; // JSON数组变量list : TStringList;i : Integer;phoneSet : string;beginlist := TStringList.Create;list.CommaText := edt_strMobile.Text;for i := 0 to list.Count -1  dobeginphoneSet := phoneSet + '"86' + list[i] + '",'end;strMobile := phoneSet.Remove(Length(phoneSet)-1);list.Free;SecretKey := '您的Key';SecretId := '您的ID';sdkappid := edt_sdkappid.Text;sign := edt_sign.Text;params := edt_params.Text;tpl_id := edt_tpl_id.Text;strjson := '{'+ '"PhoneNumberSet":['+ strMobile+ '],'+ '"TemplateParamSet":' + params+ ','+ '"TemplateID":"'+ tpl_id+ '",'+ '"SmsSdkAppid":"'+ sdkappid+ '",'+ '"Sign":"'+ sign+'"}';tc3 := TC3_Authorization.genTC3Auth(SecretKey, SecretId, 'sms.tencentcloudapi.com',strjson, 'sms');url := 'https://sms.tencentcloudapi.com/';http := TIdHttp.Create(nil);http.HandleRedirects := True;http.ReadTimeout := 3000;http.Request.ContentType := 'application/json';//设置内容类型为jsonjsonToSend := TStringStream.Create(strjson, TEncoding.UTF8);jsonToSend.Position := 0;//将流位置置为0http.Request.CustomHeaders.Clear;http.Request.CustomHeaders.AddValue('Authorization', ' ' + tc3);http.Request.CustomHeaders.AddValue('Content-Type', ' application/json');http.Request.CustomHeaders.AddValue('Host', ' sms.tencentcloudapi.com');http.Request.CustomHeaders.AddValue('X-TC-Action', ' SendSms');http.Request.CustomHeaders.AddValue('X-TC-Timestamp', ' ' + gwj_DateTimeToUnix(now).ToString);http.Request.CustomHeaders.AddValue('X-TC-Version', ' 2019-07-11');http.Request.AcceptCharSet := 'UTF-8';http.Request.AcceptEncoding := 'UTF-8';http.Request.AcceptLanguage := 'UTF-8';http.Request.CharSet := 'UTF-8';
//  http.HTTPOptions := IdHTTP.HTTPOptions + [hoKeepOrigProtocol];Aresult := http.Post(url, jsonToSend);//用MEMO控件接收POST后的数据返回Aresult := UnicodeToChinese(Aresult);Memo1.Text := Aresult;jsonToSend.free;http.free;//发送成功的示例//{"Response":{"SendStatusSet":[{"SerialNo":"2019:2892974270720676287","PhoneNumber":"+8613377131696","Fee":1,"SessionContext":"","Code":"Ok","Message":"send success","IsoCode":"CN"}],"RequestId":"b2e1fdcb-e877-4bbe-89cc-e7cae7cb567d"}}Root:= TJSONObject.ParseJSONValue(Trim(Aresult)) as TJSONObject;   //uses System.JSON;Root := Root.GetValue('Response') as TJSONObject;jsonArray := Root.GetValue('SendStatusSet') as TJSONArray ;Root := jsonArray.Get(0) as TJSONObject; //第一个号码结果edt_result.Text := Root.GetValue('Code').Value;edt_errmsg.Text := Root.GetValue('Message').Value;edt_ext.Text := Root.GetValue('SessionContext').Value;
end;

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

  1. delphi 调用 腾讯云短信

    { 腾讯云短信demo berlin _20190626_012152 作者:高文杰 QQ:46140262 Tel: 13165191728 公司:山东易桥智能科技有限公司 完整源码下载地址  ht ...

  2. 阿里云发送短信功能(环境搭建篇)

    前言 1.阿里云的开发文档写的很详细,仔细阅读文档就可以啦. 步骤 (1)第一步,需要注册阿里云账号,并且完成实名注册,发送短信验证功能需要充值.这个不仔细展开讲 (2)第二步,点击开通短信功能 并且 ...

  3. 短信发送:webservice调用第三方接口发送短信

    1 原博客地址:http://blog.csdn.net/sxdtzhaoxinguo/article/details/34437591 2 demo地址:http://download.csdn.n ...

  4. delphi腾讯云短信(签名方法v3(TC3-HMAC-SHA256))

    作者QQ:(648437169) 下载链接:https://download.csdn.net/download/liushenglin123/15482757 [delphi腾讯云短信]使用腾讯云最 ...

  5. 普歌-腾讯云短信+使用node发送短信(3种方法API、SDK)、封装工具、搭建web服务、写接口、调用接口发送短信、时效性判断、验证验证码的正确性(下)

    普歌-结合腾讯云短信服务+node搭建一个简单的发送短信web小项目 涉及技术: 腾讯云服务 后端服务:node+express 前端搭建:html+js 前言:本来这篇博客应该很早就发了,中间有一些 ...

  6. C# 使用GET和POST(v1签名方式)以及SDK的方式调用腾讯云人像动漫化接口,包含设置代理

    声明:此内容仅供学习交流使用,不用于商业用途,如果涉及侵权,联系作者删除. 最近在调用腾讯云的人像动漫化接口,感觉挺好玩的,自己去看文档写了一下,遇到了各种问题,最后都解决了 ,遇到最多的就是签名错误 ...

  7. 详解-java调用腾讯云的短信接口(从申请到测试完成)

    首先我们去注册或登录腾讯云 可以白嫖200条短信(反正也是自己玩玩,足够了) 在产品那里找到短信 进入之后,看应用列表里面有没有创建过(如果没有就创建)这里有一个SDKAppID会要用到 创建之后呢, ...

  8. 【SpringBoot深入浅出系列】SpringBoot之调用腾讯云短信接口发送短信

    目录 一.开发前准备 1.创建签名 2.创建正文模板管理 3.创建应用 4.创建secretId和secretKey 二.开发 1.创建 Spring Initializr 项目 tengxunsms ...

  9. java调用腾讯云的短信接口

    首先导入maven依赖 <dependency><groupId>com.tencentcloudapi</groupId><artifactId>te ...

最新文章

  1. TRzCheckTree的使用
  2. 常见的加密和解密算法—MD5
  3. 全国计算机网络自学考试,2008年1月全国自考“计算机网络基本原理”试题
  4. java如何实现乌龟爬行_乌龟是怎样爬行的
  5. kotlin学习之对象(九)
  6. 关于最近公司裁员和加班的思考
  7. String到底是值类型还是引用类型(C#)
  8. dos 改某个目录下所有文件的时间_go语言入门学习笔记(2)-DOS操作及go语言变量学习...
  9. Linux常用命令 创建文本 清屏操作
  10. mysql 开启binlog
  11. Intellij IDEA 发布后的项目在哪里
  12. WebSql用法(自我记录)
  13. java 弹弹堂源码_弹弹堂s应用宝版下载
  14. 干货来袭!几行代码实现pdf添加水印和去除水印
  15. mysql休假管理系统_课内资源 - 基于JSP和MYSQL数据库实现的请假管理系统
  16. NLP实验一:形式语言和自动机
  17. sd卡分区工具PM9.0汉化版
  18. Python3语言详解
  19. html中省略号怎么打,Web中的省略号
  20. sql注入进阶/user-agent/基于报错的注入/保姆级教程/一看就会/

热门文章

  1. java中bufferendwriter_Writer append(CharSequence csq, int start, int end)
  2. Oracle 12c创建公共用户查询DBA_PBS或V$PDBS视图结果为空处理方法
  3. DS1302时钟芯片使用介绍
  4. 让MBD助你的设计腾飞
  5. Coursera | Applied Plotting, Charting Data Representation in Python(UMich)| Assignment2
  6. Proxifier使用HTTP全局代理配置教程
  7. webshell之简单版本jsp
  8. db2数据库备份与恢复命令
  9. Neo4j数据库删除数据
  10. 3D视频质量评价PQM(Perceptual Quality Metric)算法