westsoft

阿里大鱼短信接口

阿里大于短信验证实现完整代码分享

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;

 

posted on 2016-10-05 19:03  westsoft  阅读(3630)  评论(0编辑  收藏  举报
 

分类:

技术点:

相关文章: