支付宝签名验证实现-Delphi版
支付宝签名验证实现-Delphi版
首先介结下支付宝签名验证流程:
一 支付宝密钥生成
支付宝提供秘钥生成工具https://docs.open.alipay.com/291/105971/
用此下载此工具,生成相关RSA密钥.

官网提供的PKCS8 和PKCS1 如果不是JAVA的请用PKCS1。
如果已经用了PKCS8的,Delphi要如何用呢?官网的工具也提供了转换工具

那么这串就是其它要用到的密钥.
打开密钥文件路径:就可以看到其它语言专用的密钥。长度1024,2048多行.
打开密钥文件:

其标准格式如上:我们可以看出其格式,头尾多以----注释---包围,很重要,这个是标明此密钥的格式。
二 支付宝签名过程: https://docs.open.alipay.com/291/106118

前面的多不难,很多人死在这一部。因为Delphi没有提供标准库证书算法.
三 Delpi如何实现:
我们去看DELPHI Indy得知要实现这一功能需要引用

在各自的不同平台多有其对应的库.
DELPHI indy也实现了对这些功能的扩展,其单元 IdSSLOpenSSLHeaders
此单元是indy基libeay32库扩展的PAS 里面实现了对接
- Libery32.dll用什么版本号.其实Delphi自代libery32.dll的我直接用自代的,最好用新版本会比较稳托.
我的开发环境是10.2.1其DELPHI所要的DLL目录如下

在其安装目录下就自代这货了。。MSVCP100高版本的DLL需要这个配合使用,不然会提示少MSVCP100.DLL
把相关DLL直接COPY到EXE所在目录即可
有的低版本delphi其自代的DLL版本太低,或其DLL和现有的DELPHI IDDSLL单元不匹配.因此很多人重写了
Libery32.pas对接libery32.dll 这样在什么样的版本DELPHI 多可以适用。而且DELPHI自代的有的没有把LIBER32.DLL功能实现,
经过多方查找,终于找到一个重写libery32.pas写的比较好的库,这个很重要,真的很重要。
本人SVN地址:
https://115.159.70.108:8443/svn/Super/OpenSSL
账号:read
密码:read
请自行下载
- 签名实现代码如下
program mysign;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils,
ssl_evp,
ssl_bio,
ssl_err,
ssl_const,
ssl_types,
ssl_pem,
ssl_engine,
ssl_x509;
var
certFile: AnsiString;
PrivKey: AnsiString;
signFile: AnsiString;
Path: AnsiString;
pkey: PEVP_PKEY;
bp, mbp: PBIO;
md_ctx: EVP_MD_CTX;
Buf: AnsiString;
Len: Integer;
SigBuf: Array [0..4095] of AnsiChar;
SigLen: Integer;
InBuf: Array[0..511] of AnsiChar;
_x509: PX509;
b64: PBIO;
a, i : Integer;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
Writeln('DEMO: mysign');
//初始化工作
SSL_InitPEM;
SSL_InitERR;
SSL_InitBIO;
SSL_InitEVP;
SSL_InitENGINE;
SSL_InitX509;
ENGINE_load_builtin_engines;
OpenSSL_add_all_ciphers;
OpenSSL_add_all_digests;
Path := ExtractFilePath(ParamStr(0));
//支付宝生成的密钥文件加载进来
PrivKey := Path + 'private.pem';
//sha1withRSA 签名后得到的保存地址
signFile := Path+'sign.pem';
if (not FileExists(PrivKey)) then
raise Exception.Create('PrivKey密钥文件不存在');
//签名 sign_type=RSA2 或RSA
Buf := 'app_id=11111111&biz_content={"out_trade_no":"2017090517245110464476"}'+
'&charset=UTF-8&format=JSON&method=alipay.trade.query&sign_type=RSA2×tamp=2017-09-26 15:16:25&version=1.0';
//如果用UTF-8请UTF8编码
Buf := UTF8Encode(Buf);
Len := Length(Buf);
Writeln('Sign test phrase: '+Buf);
{ Sign }
bp := BIO_new_file(PAnsiChar(PrivKey), 'r');
SSL_CheckError;
try
pkey := PEM_read_bio_PrivateKey(bp, nil, nil, nil);
SSL_CheckError;
finally
BIO_free(bp);
end;
//如果是RSA2用 EVP_sha256 如果用RSA用 EVP_sha1
EVP_SignInit(@md_ctx, EVP_sha256);
SSL_CheckError;
EVP_SignUpdate(@md_ctx, PAnsiChar(buf), len);
SSL_CheckError;
EVP_SignFinal(@md_ctx, @SigBuf, SigLen, pkey);
SSL_CheckError;
Writeln('Sign size ', SigLen, ' bytes');
EVP_PKEY_free(pkey);
bp := BIO_new_file(PAnsiChar(signFile), 'w');
b64 := BIO_new(BIO_f_base64);
mbp := BIO_push(b64, bp);
BIO_write(mbp, @SigBuf, SigLen);
BIO_flush(mbp);
Writeln('Bytes written ', BIO_number_written(bp), ' file ', signFile);
BIO_free_all(mbp);
{ End sign }
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
好了,东东不多,但研究时是另一回事,本人也是研究了三天才得出的结果,最后签名和支付宝签名工具一至。。。哇哈哈。
联系QQ:378464060 叫兽叔叔
支付宝签名验证实现-Delphi版的更多相关文章
- 十六进制字符串转化成字符串输出HexToStr(Delphi版、C#版)
//注意:Delphi2010以下版本默认的字符编码是ANSI,VS2010的默认编码是UTF-8,delphi版得到的字符串须经过Utf8ToAnsi()转码才能跟C#版得到的字符串显示结果一致. ...
- 通过崩溃地址找错误行数之Delphi版
通过崩溃地址找错误行数之Delphi版2009-5-11 17:42:35 来源: 转载 作者:网络 访问:360 次 被顶:2 次 字号:[大 中 小]核心提示:什么是 MAP 文件?简单地讲, M ...
- Delphi版IP地址与整型互转
Delphi版IP地址与整型互转 unit Unit11; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...
- 从内存中加载DLL Delphi版(转)
源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...
- 雪花算法(snowflake)delphi版
雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,1 ...
- 二维码生成delphi版
二维码生成delphi版 生成二维码的软件,代码从C语言转换过来(源地址:http://fukuchi.org/works/qrencode/),断断续续的差不多花了一周时间来转换和调试.在转换过程中 ...
- 从内存中加载DLL DELPHI版
//从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): ...
- [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化
Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...
- 内存中加载DLL DELPHI版
//从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): ...
随机推荐
- 图论:Dinic算法
解决最大流问题我搜到了一堆的算法:EK算法.FF算法.Dinic算法.SAP算法.ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些..我当不知 ...
- 【洛谷 P4555】 [国家集训队]最长双回文串 (Manacher)
题目链接 \(|S|<=10^5\),时间还是很宽松的. 允许我们使用线性/\(N\log N\)/甚至\(N \sqrt N\)的算法. 设\(l[i]\)表示以\(a[i]\)结尾的最长回文 ...
- Shell Script Basics
https://developer.apple.com/library/mac/documentation/OpenSource/Conceptual/ShellScripting/shell_scr ...
- selenium自动化添加日志
于logging日志的介绍,主要有两大功能,一个是控制台的输出,一个是保存到本地文件 先封装logging模块,保存到common文件夹命名为logger.py,以便于调用,直接上代码 filenam ...
- TortoiseSVN与VisualSVN Server搭建SVN版本控制系统【转】
转自:http://www.cnblogs.com/xing901022/p/4399382.html 本片主要介绍如何搭建SVN版本控制系统,主要使用工具: 1 客户端:TortoiseSVN (小 ...
- IC卡的传输协议(1)-字符传输协议T=0【转】
转自:http://bbs.ednchina.com/BLOG_ARTICLE_172022.HTM 在异步半双工传输协议中,主要定义了终端为实现传输控制和特殊需要发出的命令及这些命令的处理过程. 在 ...
- Backbone Model 源码简谈 (版本:1.1.0 基础部分完毕)
Model工厂 作为model的主要函数,其实只有12行,特别的简练 var Model = Backbone.Model = function(attributes, options) { va ...
- Android sdk manager更新 下载API源码
方法一:在C:\Windows\System32\drivers\etc路径下的hosts文件中加入如下代码即可更新 203.208.46.146 www.google.com74.125.113.1 ...
- JSONObject常用的API
http://www.cnblogs.com/java-pan/archive/2012/04/07/jsonobject.html 1.介绍基于JSONObject 1.1的API 2.只介绍常用的 ...
- 详解cookie与session的区别,讲得最透彻的一篇文章
在PHP面试中 经常碰到请阐述session与cookie的区别与联系,以及如何修改两者的有效时间. 大家都知道,session是存储在服务器端的,cookie是存储在客户端的,session依赖于c ...