DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: tkzcol
今日帖子: 1
在线用户: 6
导航: 论坛 -> DELPHI技术 斑竹:liumazi,sephil  
作者:
男 arvin (arvin) ★☆☆☆☆ -
盒子活跃会员
2018/5/3 0:57:08
标题:
谢谢大神,第三方支付的数字签名怎么写? 浏览:1047
加入我的收藏
楼主: 如题:

接口参数按照字母顺序进行排序后,拼接成字符串并加入key=****后得到数据明文,使用MD5对数据明文进行加密,将加密后的字符串转成大写,得到签名。
  例:
    key=djaUbadladkafhklasdj877qkljhggkh
    要传输的数据:
{
"shopid ":"8000121",
"noncestr ":"92206681991447ca90031468d9a21e34",
"partnerid ":"200",
"outorderid ":"123456",
"supplierid ":"1900000109",
"orderid ":"",
}
    数据明文:
noncestr=c7ee18d68a6f46a29c9dfcf32714b264&outorderid=123456&partnerid=202&shopid=8000482&supplierid=1900000109&key=djaUbadladkafhklasdj877qkljhggkh
签名:79848EDADBFD13317F4A6C19A52D27C0

发送的数据:
{
"shopid ":"8000121",
"noncestr ":"92206681991447ca90031468d9a21e34",
"partnerid ":"202",
"outorderid ":"123456",
"supplierid ":"1900000109",
"orderid ":"",
"sign":"79848EDADBFD13317F4A6C19A52D27C0",
}
 
我用的是D7,用INDY10的MD5 从网上摘了两段函数,生成后与例子中的不一样啊。

下面是抄来的函数
function StrToMD5(S: String): String;
var
Md5Encode: TMD5;
begin
Md5Encode:= TMD5.Create;
try
    //Result := Md5Encode.AsHex(Md5Encode.HashValue(S)); // Indy9的写法
    Result := Md5Encode.HashStringAsHex(S);    // Indy10中可以直接HashStringAsHex
finally
    Md5Encode.Free;
end;
end;


function StrToMD5(S: String; L: integer): String;
begin
Result := Copy(StrToMD5(S), 5, L);
end;

您受累给帮忙看看!
----------------------------------------------
-
作者:
男 arvin (arvin) ★☆☆☆☆ -
盒子活跃会员
2018/5/3 23:24:06
1楼: 今天下午有了一个大概基本的解决,因为只是验证性的开发。在这里感谢网友:汗血宝宝。他给提供了一个方法,就是百度一个MD5的在线加密,把明文复制进去再加密,看跟用DELPHI写的结果是否一致.结果我写的与在线加密的MD5返回值是一样的。而跟接口文档的例子中的签名是不一样的。所以……这事还得找第三方支付的开发问清楚。后续我会把成功的结果放在论坛里以免其他兄弟走弯路。
----------------------------------------------
-
作者:
男 wang_80919 (Flying Wang) ★☆☆☆☆ -
普通会员
2018/5/4 12:14:45
2楼: 如果你没有中文,那么 不可能不一样。
MD5 算法是定死的。
有中文,才有区别。区别在于编码。
这就是我们喜欢高版本的原因。
高版本 默认 UTF8,不喜欢的话,自己换编码。
高版本 的 MD5 可以抛弃 INDY,当然,不抛弃也是可以的。

D7 的话 string 默认是 Ansistring ,同时你可以强迫他成为 Utf8String。
高版本的 string 是 UnicodeString,为了安全起见,不要去想他是什么编码,你应该当成无编码的。中性的。

需要编码的时候,就该 TBytes 出场了。

用 TEncoding 来完成 String 和 Tbytes 的 转换即可。
MD5 SHA1 BASE64 URL 等 HASH 都支持 TBytes,否则默认都是 UTF8。

关于 MD5 SHA1 BASE64 URL 等 HASH 中编码的问题
http://www.2pascal.com/forum.php?mod=viewthread&tid=3011&fromuid=4
(出处: 2Pascal-新时代的Pascal)
欢迎来讨论。
----------------------------------------------
(C)(P)Flying Wang
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行60.05859毫秒 RSS