|
|
导航: |
论坛 -> DELPHI技术
斑竹:liumazi,sephil |
|
作者: |
|
2016/9/18 14:22:53 |
标题: |
|
加入我的收藏 |
楼主: |
这两天搞那个sign,搞的烦躁,问了一下论坛的那位同学,开口500。 唉,delphi这种偏门的就是这样,啥都贵。 后来想想用C#按阿里那边的帮助文档写了个,可以正常发送。然后把C#翻译成Delphi就可以。完整代码如下,里面的edit控件自己摆一下,拉一个indy http client控件到界面,值填写一下,100%可以。本来想发到cnblog上,想想懒的排版就发这里了。 1、注意:uses System.Hash; 2、发送按钮代码:
procedure TForm1.Button1Click(Sender: TObject); var lvSecret: string; lvStrings: TStringList; i: Integer; lvSign: string; lvMD5: THashMD5; lvResponse: TStringStream; begin 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-17 21:35:06'); 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:= UpperCase(lvMD5.GetHashString(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-17 21:35:06'); 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('respon_se='+lvResponse.DataString); finally lvResponse.Free; lvStrings.Free; end; end;
----------------------------------------------
虽千万人吾往矣! |
作者: |
hans (hans) |
★☆☆☆☆ |
-
|
普通会员 |
|
2016/9/18 14:45:44 |
1楼: |
免费的都是,要什么费,哪个ID要那么高的价格的?
http://bbs.2ccc.com/topic.asp?topicid=514039 9楼,还有其他楼都有,并且是跨平台的
----------------------------------------------
Hans
|
作者: |
|
2016/9/18 14:47:32 |
2楼: |
@hans 主要是拼装加密那个sign,参数搞不清楚,加密出来的串都是错误的。这个昨天折腾了我一整天。
----------------------------------------------
虽千万人吾往矣!
|
作者: |
|
2016/9/18 14:49:32 |
3楼: |
补充:跨平台的例子可以去csdn下载这位大神的demo
http://download.csdn.net/detail/hansxia888/9603061
----------------------------------------------
虽千万人吾往矣!
|
作者: |
hans (hans) |
★☆☆☆☆ |
-
|
普通会员 |
|
2016/9/18 15:30:59 |
4楼: |
那是我发的,我也是转载的,不是原创,也不是什么大神,别神话 ,哈哈
----------------------------------------------
Hans
|
作者: |
pcb (pcb) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2016/9/18 20:32:30 |
5楼: |
谢谢,测试成功。 补充下:edit1.text的值为提交网址http://gw.api.taobao.com/router/rest 短信模板中的变量,实际赋值时,如果注册为个人用户,长度不能超过15个字符,超过会发送失败。注册为企业用户,则长度没有限制。
----------------------------------------------
-
|
作者: |
|
2016/9/19 8:23:38 |
6楼: |
D7下请用TIdHashMessageDigest5代替THashMD5,即可编译通过。 位置: lvSign:= UpperCase(lvMD5.GetHashString(lvSign)); 改为 lvSign:= UpperCase(lvMD5.HashStringAsHex(lvSign));
----------------------------------------------
Delphi爱好者。
|
作者: |
|
2016/9/19 8:29:22 |
7楼: |
完善的接口需要: 一是支持各类客户端;二是使用简便 比如: http://122.0.74.171/alidayu.html
----------------------------------------------
樵夫的大马甲
|
作者: |
|
2016/9/19 11:44:02 |
8楼: |
楼主好人
----------------------------------------------
-
|
作者: |
abencat (远离delphi的人) |
★☆☆☆☆ |
-
|
盒子活跃会员 |
|
2016/9/21 8:37:53 |
9楼: |
鄙视那些经常在群里面发广告的人和写点代码就收费的人
----------------------------------------------
delphi爱好者
|
作者: |
|
2016/9/26 11:11:20 |
10楼: |
楼主,我按照你提供的代码格式,各参数没问题(我用淘宝的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;
----------------------------------------------
-
|
作者: |
axfx (axfx) |
▲▲▲▲▲ |
-
|
普通会员 |
|
2016/10/2 20:35:46 |
11楼: |
写成通用的接口,直接调用。
----------------------------------------------
超低价出售pos/进销存/收银软件源码 https://item.taobao.com/item.htm?spm=a21dvs.23580594.0.0.4fee645eC26dvB&ft=t&id=671027238807
|
|