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


补充:跨平台的例子可以去csdn下载这位大神的demo



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;