阿里大魚短信接口


阿里大於短信驗證實現完整代碼分享

http://bbs.2ccc.com/topic.asp?topicid=515649

補充:跨平台的例子可以去csdn下載這位大神的demo

http://download.csdn.net/detail/hansxia888/9603061

 1 這兩天搞那個sign,搞的煩躁,問了一下論壇的那位同學,開口500。
 2 唉,delphi這種偏門的就是這樣,啥都貴。
 3 后來想想用C#按阿里那邊的幫助文檔寫了個,可以正常發送。然后把C#翻譯成Delphi就可以。完整代碼如下,里面的edit控件自己擺一下,拉一個indy http client控件到界面,值填寫一下,100%可以。本來想發到cnblog上,想想懶的排版就發這里了。
 4 1、注意:uses System.Hash;
 5 2、發送按鈕代碼:
 6 
 7 
 8 procedure TForm1.Button1Click(Sender: TObject);
 9 var
10   lvSecret: string;
11   lvStrings: TStringList;
12   i: Integer;
13   lvSign: string;
14   lvMD5: THashMD5;
15   lvResponse: TStringStream;
16 begin
17   lvStrings:= TStringList.Create;
18   lvResponse:= TStringStream.Create;
19   try
20     lvSecret:= Edit3.Text;
21 
22     //加密用到的參數就這些,不要亂加參數
23     lvStrings.Add('app_key'+Edit2.Text);
24     lvStrings.Add('format'+'xml');
25     lvStrings.Add('method'+'alibaba.aliqin.fc.sms.num.send');
26     lvStrings.Add('sign_method'+'md5');
27     lvStrings.Add('timestamp'+'2016-09-17 21:35:06');
28     lvStrings.Add('v'+'2.0');
29     lvStrings.Add('rec_num'+Edit6.Text);
30     lvStrings.Add('sms_free_sign_name'+'個人測試');
31     lvStrings.Add('sms_param'+Edit5.Text);
32     lvStrings.Add('sms_template_code'+Edit4.Text);
33     lvStrings.Add('sms_type'+'normal');
34     lvStrings.Sort;
35     for i:= 0 to lvStrings.Count -1 do
36       lvSign:= lvSign + lvStrings[i];
37     lvSign:= lvSecret + lvSign + lvSecret;  //加密前的串,格式是:Secret + 拼裝的參數名參數值串 + Secret
38     lvSign:= UpperCase(lvMD5.GetHashString(lvSign));  //按照阿里大於的幫助文檔組裝加密后得到的Sign,很多人都卡這里
39     Memo1.Lines.Add('sign='+lvSign);
40 
41     lvStrings.Clear;
42     lvStrings.Add('app_key='+edit2.Text); //阿里大於后台的app_key
43     lvStrings.Add('format='+'xml'); //這里選擇xml格式,也可以用json
44     lvStrings.Add('method='+'alibaba.aliqin.fc.sms.num.send'); //短信發送API名稱,固定,不要變
45     lvStrings.Add('sign_method='+'md5');  //加密方法,這里選擇md5
46     lvStrings.Add('timestamp='+'2016-09-17 21:35:06');
47     lvStrings.Add('v='+'2.0');
48     lvStrings.Add('rec_num='+Edit6.Text); //要接收的手機號碼,有多個用英文逗號隔開
49     lvStrings.Add('sms_free_sign_name='+'個人測試'); //阿里大於后台申請的短信簽名名稱
50     lvStrings.Add('sms_param='+Edit5.Text);     //edit5.text:= '{"code":"5858"}'
51     lvStrings.Add('sms_template_code='+Edit4.Text); //阿里大於后台申請的短信模板,我的格式是:您的驗證碼${code},60秒內輸入有效。
52     lvStrings.Add('sms_type='+'normal');
53     lvStrings.Add('sign='+lvSign);
54 
55     IdHTTP1.ReadTimeout:= 3000;
56     IdHTTP1.AllowCookies:= False;
57     IdHTTP1.Request.ContentType:= 'application/x-www-form-urlencoded;charset=utf-8';
58     IdHTTP1.Post(Edit1.Text,lvStrings,lvResponse);
59     Memo1.Lines.Add('respon_se='+lvResponse.DataString);
60   finally
61     lvResponse.Free;
62     lvStrings.Free;
63   end;
64 end;


D7下請用TIdHashMessageDigest5代替THashMD5,即可編譯通過。
位置:
lvSign:= UpperCase(lvMD5.GetHashString(lvSign)); 
改為
lvSign:= UpperCase(lvMD5.HashStringAsHex(lvSign));

謝謝,測試成功。
補充下:edit1.text的值為提交網址http://gw.api.taobao.com/router/rest
短信模板中的變量,實際賦值時,如果注冊為個人用戶,長度不能超過15個字符,超過會發送失敗。注冊為企業用戶,則長度沒有限制。

 

樓主,我按照你提供的代碼格式,各參數沒問題(我用淘寶的api測試了),提示錯誤sign不正確。我用的是delphi2010,也是發驗證碼,轉了下utf8(不轉也不對),幫忙給看看吧,sign要注意啥,謝謝
var
  lvSecret: string;
  lvStrings: TStringList;
  i: Integer;
  lvSign: string;
  lvMD5: TIdHashMessageDigest5;
  lvResponse: TStringStream;
begin
  lvMD5 := TIdHashMessageDigest5.Create;
  lvStrings := TStringList.Create;
  lvResponse := TStringStream.Create;
  try
    lvSecret := Edit3.text;

    // 加密用到的參數就這些,不要亂加參數
    lvStrings.Add('app_key' + Edit2.text);
    lvStrings.Add('format' + 'xml');
    lvStrings.Add('method' + 'alibaba.aliqin.fc.sms.num.send');
    lvStrings.Add('sign_method' + 'md5');
    lvStrings.Add('timestamp' + '2016-09-25 20:48:54');
    lvStrings.Add('v' + '2.0');
    lvStrings.Add('rec_num' + Edit6.text);
    lvStrings.Add('sms_free_sign_name' + '短信接口');
    lvStrings.Add('sms_param' + Edit5.text);
    lvStrings.Add('sms_template_code' + Edit4.text);
    lvStrings.Add('sms_type' + 'normal');
    lvStrings.Sort;
    for i := 0 to lvStrings.Count - 1 do
      lvSign := lvSign + lvStrings[i];
    lvSign := lvSecret + lvSign + lvSecret; // 加密前的串,格式是:Secret + 拼裝的參數名參數值串 + Secret
    lvSign := AnsiToUtf8(lvSign);
    lvSign := lvMD5.HashStringAsHex(lvSign);
    Memo1.Lines.Add(lvSign);
    // 按照阿里大於的幫助文檔組裝加密后得到的Sign,很多人都卡這里
    Memo1.Lines.Add('sign=' + lvSign);

    lvStrings.Clear;
    lvStrings.Add('app_key=' + Edit2.text); // 阿里大於后台的app_key
    lvStrings.Add('format=' + 'xml'); // 這里選擇xml格式,也可以用json
    lvStrings.Add('method=' + 'alibaba.aliqin.fc.sms.num.send');
    // 短信發送API名稱,固定,不要變
    lvStrings.Add('sign_method=' + 'md5'); // 加密方法,這里選擇md5
    lvStrings.Add('timestamp=' + '2016-09-25 20:48:54');
    lvStrings.Add('v=' + '2.0');
    lvStrings.Add('rec_num=' + Edit6.text); // 要接收的手機號碼,有多個用英文逗號隔開
    lvStrings.Add('sms_free_sign_name=' + '短信接口'); // 阿里大於后台申請的短信簽名名稱
    lvStrings.Add('sms_param=' + Edit5.text); // edit5.text:= '{"code":"5858"}'
    lvStrings.Add('sms_template_code=' + Edit4.text);
    // 阿里大於后台申請的短信模板,我的格式是:您的驗證碼${code},60秒內輸入有效。
    lvStrings.Add('sms_type=' + 'normal');
    lvStrings.Add('sign=' + lvSign);

    IdHTTP1.ReadTimeout := 3000;
    IdHTTP1.AllowCookies := False;
    IdHTTP1.Request.ContentType :=
      'application/x-www-form-urlencoded;charset=utf-8';
    IdHTTP1.Post(Edit1.text, lvStrings, lvResponse);
    Memo1.Lines.Add(lvStrings.text);
    Memo1.Lines.Add('respon__se=' + lvResponse.DataString);
  finally
    lvResponse.Free;
    lvStrings.Free;
    lvMD5.Free;
  end;
end;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM