在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
支付宝签名验证实现-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 里面实现了对接
我的开发环境是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 叫兽叔叔 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论