支付宝签名验证实现-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 里面实现了对接

  1. 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

请自行下载

  1. 签名实现代码如下

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&timestamp=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版的更多相关文章

  1. 十六进制字符串转化成字符串输出HexToStr(Delphi版、C#版)

    //注意:Delphi2010以下版本默认的字符编码是ANSI,VS2010的默认编码是UTF-8,delphi版得到的字符串须经过Utf8ToAnsi()转码才能跟C#版得到的字符串显示结果一致. ...

  2. 通过崩溃地址找错误行数之Delphi版

    通过崩溃地址找错误行数之Delphi版2009-5-11 17:42:35 来源: 转载 作者:网络 访问:360 次 被顶:2 次 字号:[大 中 小]核心提示:什么是 MAP 文件?简单地讲, M ...

  3. Delphi版IP地址与整型互转

    Delphi版IP地址与整型互转 unit Unit11; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphic ...

  4. 从内存中加载DLL Delphi版(转)

    源:从内存中加载DLL DELPHI版 原文 : http://www.2ccc.com/article.asp?articleid=5784 MemLibrary.pas //从内存中加载DLL D ...

  5. 雪花算法(snowflake)delphi版

    雪花算法简单描述: + 最高位是符号位,始终为0,不可用. + 41位的时间序列,精确到毫秒级,41位的长度可以使用69年.时间位还有一个很重要的作用是可以根据时间进行排序. + 10位的机器标识,1 ...

  6. 二维码生成delphi版

    二维码生成delphi版 生成二维码的软件,代码从C语言转换过来(源地址:http://fukuchi.org/works/qrencode/),断断续续的差不多花了一周时间来转换和调试.在转换过程中 ...

  7. 从内存中加载DLL DELPHI版

    //从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): ...

  8. [转载]《Delphi 版 everything、光速搜索代码》 关于获取文件全路径 GetFullFileName 函数的优化

    Delphi 版 everything.光速搜索代码>,文章中关于获取文件全路径的函数:GetFullFileName,有一个地方值得优化. 就是有多个文件,它们可能属于同一个目录. 譬如 Sy ...

  9. 内存中加载DLL DELPHI版

    //从内存中加载DLL DELPHI版 unit MemLibrary; interface uses Windows; function memLoadLibrary(pLib: Pointer): ...

随机推荐

  1. Linux虚拟地址空间布局以及进程栈和线程栈总结【转】

    转自:http://www.cnblogs.com/xzzzh/p/6596982.html 原文链接:http://blog.csdn.net/freeelinux/article/details/ ...

  2. Makefile PHONY

    case 1: Makefile clean: rm a environment_1 : There is only file a $ make clean clean a environment_2 ...

  3. appium===安卓SDK下载很慢的解决办法

    方法一:http://www.apkbus.com/forum.php?mod=viewthread&tid=240851 方法二:http://www.androiddevtools.cn/

  4. selenium 消息框元素定位处理

    以下内容来自于“风少”的博客 <元素定位:selenium消息框处理 (alert.confirm.prompt)> 基础普及 alert对话框 .细分三种,Alert,prompt,co ...

  5. 抽象语法树简介(ZZ)

    转载自: http://www.cnblogs.com/cxihu/p/5836744.html (一)简介 抽象语法树(abstract syntax code,AST)是源代码的抽象语法结构的树状 ...

  6. dict的setdefault(学习bottle源代码)

    在bottle的源代码中,看到如下一段话: sys.modules.setdefault('bottle', sys.modules['__main__']) 这段话,实际上就是dict类型的setd ...

  7. MVC架构中的controller的几种写法

    开始写代码之前,我们先来看一下spring MVC概念.一张图能够清晰得说明. 除了controller,我们需要编写大量代码外,其余的都可以通过配置文件直接配置. MVC的本质即是将业务数据的抽取和 ...

  8. (十二)MySQL逻辑备份mysqldump

    (1)简介 语法 mysqldump -h服务器 -u用户名 -p密码 [-P端口号] [参数] 数据库名 >备份文件.sql 关于数据库: -A,--all-databases 所有库,会生成 ...

  9. MySQL 一般模糊查询的几种用法

    1.%:表示零个或多个字符.在某些情况下需要中文查询,一般用两个%来查询,即%%: select * from user where name like %五%; -->表示:查询user表中的 ...

  10. 文件的上传(TCP)

    问题描述:将本地文件上传(需将文件名一起上传)至指定服务器,服务器将上传的文件保存至指定路径下并文件名添加前缀 "Downlod_原文件名". 思路: 客户端需要一个输入流来读取本 ...