function TForm1.SendSMS(constAppKey, AppSecret, ReceiveNumber, FreeSignName,
TemplateCode, TemplateContent:string; var ResultMsg: string): Boolean;function specialUrlEncode(const sStr:string):string;begin
//URLEncode后再增加三种字符替换:加号(+)替换成 %20、星号(*)替换成 %2A、%7E 替换回波浪号(~)
Result :=TNetEncoding.URL.EncodeForm(sStr);
Result.Replace('+','%20').Replace('*','%2A').Replace('%7E','~');end;function MakeSign(const AParams: TStringList; const AppSecret: string;var sortQueryStringTmp :String): string;varI: Integer;
sortedQueryString :string;
stringToSign:string;
sSign :string;
outs: TStringList;
pn,pv:string;
skey:Tbytes;beginouts:=AParams;
outs.UseLocale:=True;
outs.Sort;//SortString( AParams,outs);
//参数拼接
sortQueryStringTmp := '';for I := 0 to outs.Count - 1 do
beginpn:=specialUrlEncode(outs.Names[I]);
pv:=specialUrlEncode(outs.Values[outs.Names[I]]);
sortQueryStringTmp := sortQueryStringTmp +pn + '='+ pv+'&';end;
setlength(sortQueryStringTmp,length(sortQueryStringTmp)-1);
sortedQueryString:=sortQueryStringTmp;
stringToSign :='GET&%2F&' +specialUrlEncode(sortedQueryString);
skey:=THashSHA1.GetHMACAsBytes(Tencoding.UTF8.GetBytes(stringToSign), Tencoding.UTF8.GetBytes(AppSecret+'&'));
sSign := TBase64Encoding.Create.EncodeBytesToString(skey);
Result :=specialUrlEncode(sSign);end;varHTTP: TNetHTTPClient;
JO: TJSONObject;
Params: TStringList;
Response:string;
code:TGUID;
sortQueryStringTmp :string;
signature :string;
sURL :string;
ResponseStr: TStringStream;beginResult :=False;
CreateGUID(code);
HTTP := TNetHTTPClient.Create(nil);
Params := TStringList.Create();
ResponseStr :=TStringStream.Create('', TEncoding.ASCII);//中文用UTF8
try
//;//
//请求参数中不允许出现以Signature为key的参数。参考代码如下```//String accessKeyId = “testId”;String accessSecret = “testSecret”;//java.text.SimpleDateFormat df = new java.text.SimpleDateFormat(“yyyy-MM-dd’T’HH:mm:ss’Z’”);//df.setTimeZone(new java.util.SimpleTimeZone(0, “GMT”));// 这里一定要设置GMT时区//
//java.util.Map paras = new java.util.HashMap(); 1. 系统参数//paras.put(“SignatureMethod”, “HMAC-SHA1”);//paras.put(“SignatureNonce”, java.util.UUID.randomUUID().toString());//paras.put(“AccessKeyId”, accessKeyId);//paras.put(“SignatureVersion”, “1.0”);//paras.put(“Timestamp”, df.format(new java.util.Date()));//paras.put(“Format”, “XML”);//
2. 业务API参数//paras.put(“Action”, “SendSms”);//paras.put(“Version”, “2017-05-25”);//paras.put(“RegionId”, “cn-hangzhou”);//paras.put(“PhoneNumbers”, “15300000001”);//paras.put(“SignName”, “阿里云短信测试专用”);//paras.put(“TemplateParam”, “{\”customer\”:\”test\”}”);//paras.put(“TemplateCode”, “SMS_71390007”);//paras.put(“OutId”, “123”);
Params.Values['P2'] := 'HMAC-SHA1';
Params.Values['P3'] :=GUIDToString(code);
Params.Values['AccessKeyId'] :=AppKey;
Params.Values['P1'] := '1.0';//Params.Values['Timestamp'] := FormatDateTime('yyyy-mm-dd hh:mm:ss', now - 1/3);
Params.Values['Timestamp'] := FormatDateTime('yyyy-MM-dd''T''HH:mm:ss''Z''', now-1/3);//Params.Values['Format'] := 'JSON';
Params.Values['Action'] := 'SendSms';//Params.Values['Version'] := '2017-05-25';
//Params.Values['RegionId'] := 'cn-hangzhou';
//Params.Values['PhoneNumbers'] := ReceiveNumber;
//Params.Values['SignName'] := FreeSignName;
//Params.Values['TemplateParam'] := TemplateContent;
//Params.Values['TemplateCode'] := TemplateCode;
signature:=MakeSign(Params,AppSecret,sortQueryStringTmp);
sURL := 'http://127.0.0.1/xalionrest/getwithcheck?signature='+signature+'&'+sortQueryStringTmp;
Memo1.Lines.Text :=sURL;tryresultmsg:=http.Get(sURL).ContentAsString ;
Memo2.Lines.add( resultmsg);excepton E: Exceptiondo
beginResultMsg :=E.Message;
Exit;end;end;finallyHTTP.Free;
Params.Free;
ResponseStr.Free;end;end;