function TForm1.send_sms(Atel_no:string;Acode:string): boolean;
var
Params: TDictionary<string, string>;
SortedParams: TArray<string>;
sortQueryString,key:string;
LParamIndex :Integer;
LSignatureNonce:string;
Ltimestamp:string;
LAccessKeyId, LAccessKeySecret:string;
LSignature:string;
Ldatetime:Tdatetime;
Lversion:string;
LSignName:Ansistring;
LTemplateParam:string;
LPathValue:Tjsonvalue;
begin
result:=false;
Params:=TDictionary<string, string>.create;
try
self.RESTClient.BaseURL:='https://dysmsapi.aliyuncs.com/';
LAccessKeyId:='你的AccessKeyId';
LAccessKeySecret:='你的AccessKeySecret';
LSignatureNonce:=THashMD5.GetHashString(TGUID.NewGuid.ToString);
Ldatetime:=UnixToDateTime(DateTimeToUnix(now,false),true);
Ltimestamp:=formatdatetime('yyyy-MM-dd',Ldatetime)+'T'+ formatdatetime('HH:mm:ss',Ldatetime)+'Z';
Lversion:='2017-05-25';
LSignName:='你的SignName';
LTemplateParam:='{"code":"'+Acode+'"}';
//①.系统参数:
Params.Add('AccessKeyId',LAccessKeyId);
RESTRequest.Params.AddItem('AccessKeyId',LAccessKeyId, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('Timestamp', TNetEncoding.URL.EncodeForm(Ltimestamp));
RESTRequest.Params.AddItem('Timestamp', Ltimestamp, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('Format', 'JSON');
RESTRequest.Params.AddItem('Format', 'JSON', TRESTRequestParameterKind.pkGETorPOST);
Params.Add('SignatureMethod', 'HMAC-SHA1');
RESTRequest.Params.AddItem('SignatureMethod', 'HMAC-SHA1', TRESTRequestParameterKind.pkGETorPOST);
Params.Add('SignatureNonce', LSignatureNonce);
RESTRequest.Params.AddItem('SignatureNonce', LSignatureNonce, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('SignatureVersion', '1.0');
RESTRequest.Params.AddItem('SignatureVersion', '1.0', TRESTRequestParameterKind.pkGETorPOST);
//②.业务API参数:
Params.Add('Action', 'SendSms');
RESTRequest.Params.AddItem('Action', 'SendSms', TRESTRequestParameterKind.pkGETorPOST);
Params.Add('Version', Lversion);
RESTRequest.Params.AddItem('Version', Lversion, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('RegionId', 'cn-hangzhou');
RESTRequest.Params.AddItem('RegionId', 'cn-hangzhou', TRESTRequestParameterKind.pkGETorPOST);
Params.Add('PhoneNumbers', Atel_no);
RESTRequest.Params.AddItem('PhoneNumbers', Atel_no, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('SignName', TNetEncoding.URL.EncodeForm(LSignName));
RESTRequest.Params.AddItem('SignName', LSignName, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('TemplateCode', '你的TemplateCode');
RESTRequest.Params.AddItem('TemplateCode', '你的TemplateCode', TRESTRequestParameterKind.pkGETorPOST);
Params.Add('TemplateParam', TNetEncoding.URL.EncodeForm(LTemplateParam));
RESTRequest.Params.AddItem('TemplateParam', LTemplateParam, TRESTRequestParameterKind.pkGETorPOST);
Params.Add('OutId', '');
RESTRequest.Params.AddItem('OutId', '', TRESTRequestParameterKind.pkGETorPOST);
//③.去除签名关键字Key:
//2.1.3:(我加的严格按照API说明更安全)去除签名关键字Key:'Signature':
if Params.ContainsKey('Signature') then Params.Remove('Signature');
//2.2、第二步:根据参数Key排序(顺序)::
SortedParams := Params.keys.ToArray;
TArray.Sort<string>(SortedParams);
//2.3.2、拼接sortQueryString
sortQueryString:='';
LParamIndex:=0;
for Key in SortedParams do
begin
if LParamIndex=0 then
sortQueryString:=sortQueryString
+SpecialUrlEncode(Key)
+'%3D'+SpecialUrlEncode(Params.Items[Key])
else
sortQueryString:=sortQueryString
+'%26'+SpecialUrlEncode(Key)
+'%3D'+SpecialUrlEncode(Params.Items[Key]);
INC(LParamIndex);
//:第1个参数不带连接符&
end;
sortQueryString:='GET&%2F&'+sortQueryString;
LSignature:= Sign(sortQueryString,LAccessKeySecret + '&');
RESTRequest.Params.AddItem('Signature', LSignature, TRESTRequestParameterKind.pkGETorPOST);
RESTRequest.Execute;
if RESTRequest.Response.JSONValue.TryGetValue<TJSONValue>('Code', LPathValue) then
begin
if Lpathvalue.ToString.ToLower='"ok"' then
result:=true;
end;
finally
params.Free;
end;
end;