{
腾讯云短信demo berlin _20190626_012152
作者:高文杰
QQ:46140262
Tel: 13165191728
公司:山东易桥智能科技有限公司
完整源码下载地址 http://www.yiqiao.net.cn/dl/TencentSMS.rar
}
unit Unit1;
interface
uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
System.Classes, System.Net.URLClient, System.Net.HttpClient,
System.StrUtils, System.Net.HttpClientComponent, System.Hash, System.Json,
System.DateUtils,
Web.HTTPApp, Soap.EncdDecd, IdCoderMIME, IdGlobal,
Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;
type
TForm1 = class(TForm)
btnSend: TButton;
btnSignTest: TButton;
GroupBox1: TGroupBox;
Label1: TLabel;
edt_strMobile: TEdit;
edt_strAppKey: TEdit;
Label2: TLabel;
edt_sdkappid: TEdit;
Label4: TLabel;
edt_params: TEdit;
Label5: TLabel;
Label3: TLabel;
edt_sign: TEdit;
Label6: TLabel;
edt_tpl_id: TEdit;
Memo1: TMemo;
GroupBox2: TGroupBox;
Label7: TLabel;
Label8: TLabel;
Label9: TLabel;
edt_result: TEdit;
edt_errmsg: TEdit;
edt_ext: TEdit;
procedure btnSendClick(Sender: TObject);
procedure btnSignTestClick(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses
Unit2;
{$R *.dfm}
function gwj_DateTimeToUnix(const AValue: TDateTime): Int64;
//日期转Unix时间戳
begin
Result := System.DateUtils.DateTimeToUnix( AValue )- 8*60*60;
end;
function gwj_UnixToDateTime(const AValue: Int64): TDateTime;
//Unix时间戳转日期
begin
Result := System.DateUtils.UnixToDateTime( AValue + 8*60*60) ;
end;
function URLEncode(const msg: String): String; //xe UrlEncode编码 _20190514_023451
var
I : Integer;
aStr:string;
begin
aStr := Web.HttpApp.HTTPEncode(UTF8Encode(msg)); //use Web.HttpApp;
//转换后 空格 汇报 转换为 + 号 不能正常转换为%20 需要 手工处理一下
aStr := StringReplace (aStr, '+', '%20', [rfReplaceAll, rfIgnoreCase]);
Result := aStr ;
end;
function urlDecode(url: string): string; //xe UrlDecode解码 _20190514_023451
begin
Result := Web.HttpApp.HTTPDecode(url); //use Web.HttpApp;
// Result := UTF8Decode(Web.HttpApp.HTTPDecode(url));; //use Web.HttpApp;
end;
/// <summary>
/// // Unicode转汉字 ,支持自动过滤非 unicode编码,即非 unicode编码不转换
/// 只支持 标准的 类型 \u4e00 这种格式的 转换, 以\u 开头的
/// code by 猿哥哥 2015-2-11
/// </summary>
function UnicodeToChinese(inputstr:string):string;
var
i:Integer;
index:Integer;
temp,top,last:string;
begin
index:=1;
while index>=0 do
begin
index:= inputstr.IndexOf('\u');
if index<0 then
begin
last:= inputstr;
Result:= Result+ last;
Exit;
end;
top:= Copy(inputstr,1,index); //取出 编码字符前的 非 unic 编码的字符,如数字
temp:= Copy(inputstr,index+1,6);//取出编码,包括 \u ,如\u4e3f
Delete(temp,1,2);
Delete(inputstr,1,index+6);
result:= Result+ top+ WideChar( StrToInt('$'+ temp)) ;
end;
end;
procedure TForm1.btnSendClick(Sender: TObject);
var
strMobile, strAppKey, strRand, strTime ,sig:string;
sdkappid:string;
sign,params,tpl_id:string;
url:string;
strjson:string;
http : TIdHttp;
jsonToSend : TStringStream;
Aresult:string;
//申明变量
Root:TJSONObject; //uses System.JSON;
begin
//短信api地址
//https://cloud.tencent.com/document/product/382/5976
//生成App 凭证 begin
//string strMobile = "13788888888"; //tel 的 mobile 字段的内容
//string strAppKey = "5f03a35d00ee52a21327ab048186a2c4"; //sdkappid 对应的 appkey,需要业务方高度保密
//string strRand = "7226249334"; //URL 中的 random 字段的值
//string strTime = "1457336869"; //UNIX 时间戳
//string sig = sha256(appkey=5f03a35d00ee52a21327ab048186a2c4&random=7226249334&time=1457336869&mobile=13788888888)
// = ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4;
strMobile := edt_strMobile.Text;
strAppKey := edt_strAppKey.Text;
Randomize;
strRand := inttostr(Random(7226249334)); //URL 中的 random 字段的值
strTime := gwj_DateTimeToUnix(now).ToString; //日期转Unix时间戳
// sig := sha256(appkey=5f03a35d00ee52a21327ab048186a2c4&random=7226249334&time=1457336869&mobile=13788888888)
// = ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4;
sig := THashSHA2.GetHashString('appkey='+strAppKey+'&random='+strRand+'&time='+strTime+'&mobile='+strMobile,THashSHA2.TSHA2Version.SHA256);
//生成App 凭证 end
sdkappid := edt_sdkappid.Text; //sdkappid 请填写您在腾讯云上申请到的,random 请填成随机数。
//POST https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid=xxxxx&random=xxxx
url := 'https://yun.tim.qq.com/v5/tlssmssvr/sendsms?sdkappid='+sdkappid+'&random='+strRand;
//请求参数
// {
// "ext": "",
// "extend": "",
// "params": [
// "验证码",
// "1234",
// "4"
// ],
// "sig": "ecab4881ee80ad3d76bb1da68387428ca752eb885e52621a3129dcf4d9bc4fd4",
// "sign": "腾讯云",
// "tel": {
// "mobile": "13788888888",
// "nationcode": "86"
// },
// "time": 1457336869,
// "tpl_id": 19
//}
//参数 必选 类型 描述
//ext 否 string 用户的 session 内容,腾讯 server 回包中会原样返回,可选字段,不需要就是设置为空
//extend 否 string 短信码号扩展号,格式为纯数字串,其他格式无效。默认没有开通,开通请联系 腾讯云短信技术支持
//params 是 array 模板参数,具体使用方法可参考注【1】。若模板没有参数,请设置为空数组
//sig 是 string App 凭证,具体计算方式见下注
//sign 否 string 短信签名,此处应填写审核通过的签名内容,非签名 ID,如果使用默认签名,该字段可缺省
//签名信息查看方法:登录 短信控制台 ,进入目标应用的配置页,选择【国内短信】(或【国际短信】)>【短信内容配置】> 【短信签名】即可查看对应的签名
//tel 是 object 国际电话号码,格式依据 e.164 标准为: +[国家码][手机号] ,示例如:+8613711112222, 其中前面有一个 + 符号 ,86 为国家码,13711112222 为手机号
//time 是 number 请求发起时间,UNIX 时间戳(单位:秒),如果和系统时间相差超过 10 分钟则会返回失败
//tpl_id 是 number 模板 ID,在 控制台 审核通过的模板 ID
//参数tel:
//参数 必选 类型 描述
//mobile 是 string 手机号码
//nationcode 是 string 国家码
sign := edt_sign.Text;
params := edt_params.Text;
tpl_id := edt_tpl_id.Text;
strjson := ''
+'{ '
+' "ext": "", '
+' "extend": "", '
//+' "params": '+params+','
+' "params": '+params+','
+' "sig": "'+sig+'",'
+' "sign": "'+sign+'",'
+' "tel": {'
+' "mobile": "'+strMobile+'",'
+' "nationcode": "86"'
+' },'
+' "time": '+strTime+','
+' "tpl_id": '+tpl_id+''
+'}';
http := TIdHttp.Create(nil);
http.HandleRedirects := True;//允许头转向
http.ReadTimeout := 5000;//请求超时设置
http.Request.ContentType := 'application/json';//设置内容类型为json
//jsonToSend := TStringStream.Create('{"name":"Peter Pan"}');//创建一个包含JSON数据的变量
//jsonToSend := TStringStream.Create(strjson);//创建一个包含JSON数据的变量
jsonToSend := TStringStream.Create(strjson, TEncoding.UTF8);
jsonToSend.Position := 0;//将流位置置为0
//Memo1.Lines.Text := http.Post('http://www.website.com/test.php', jsonToSend);//用MEMO控件接收POST后的数据返回
Aresult := http.Post(url, jsonToSend);//用MEMO控件接收POST后的数据返回
Aresult := UnicodeToChinese(Aresult);
Memo1.Lines.Text := Aresult;
jsonToSend.free; http.free;//用完记得释放
//单个模板变量字符数超过12个 如需调整限制,可联系 sms helper 解决
//https://cloud.tencent.com/document/product/382/3773#.E6.8A.80.E6.9C.AF.E4.BA.A4.E6.B5.81
//技术交流
//如果您希望与工程师即时沟通交流,欢迎通过如下方式进行联系:
//腾讯云短信技术交流 QQ:3012203387
//模板参数长度限制 请把 个人账户 升级为 公司账户 进行 企业认证
//
//{"result":1036,"errmsg":"\u6A21\u677F\u53C2\u6570\u957F\u5EA6\u9650\u5236","ext":""}
//{"result":1036,"errmsg":"模板参数长度限制","ext":""}
{
如果升级企业认证后,还是提示 长度不够,请联系客服 QQ:3012203387
聊天记录
易桥科技高文杰 11:36:46
单个模板变量字符数超过12个 如需调整限制,可联系 sms helper 解决
长度不够 怎么办
腾讯云短信小助手 11:37:36
转企业认证
易桥科技高文杰 11:37:43
转完了
腾讯云短信小助手 11:38:15
sdkappid发我看下
易桥科技高文杰 11:38:25
1400182757
腾讯云短信小助手 11:39:11
5分钟后试下
易桥科技高文杰 11:39:17
好的
}
//发送成功的示例
//{"result":0,"errmsg":"OK","ext":"","sid":"8:Xs6hJNbWKFwLz1A9EED20190626","fee":3}
//赋值
Root:= TJSONObject.ParseJSONValue(Trim(Aresult)) as TJSONObject; //uses System.JSON;
//用toString得到值在界面显示会有双引号
//edt_expr.Text :=Svdevobj.GetValue('expr').Value;//得到不带双引号的值
//edt_expr.Text :=Svdevobj.GetValue('expr').toString;//得到带引号的值
// edt_result.Text := Root.GetValue('result').ToString;
// edt_errmsg.Text := Root.GetValue('errmsg').ToString;
// edt_ext.Text := Root.GetValue('ext').ToString;
edt_result.Text := Root.GetValue('result').Value;
edt_errmsg.Text := Root.GetValue('errmsg').Value;
edt_ext.Text := Root.GetValue('ext').Value;
end;
procedure TForm1.btnSignTestClick(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.ShowModal;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
edt_strMobile.Text := '13165191728';
edt_strAppKey.Text := 'abcd1234';
edt_sdkappid.Text := '1400182757'; //sdkappid 请填写您在腾讯云上申请到的,random 请填成随机数。
//edt_params.Text := '["参数1","参数2","参数3"]';
edt_params.Text := '["1233"]';
edt_sign.text := '易桥科技';
edt_tpl_id.Text := '271462';
end;
end.