Alipay SDK for PHP
为什么不用官方
官方 SDK | 本 SDK | 链接 |
---|---|---|
无 Composer 集成,自动加载依赖第三方 PHP 框架 lotusphp |
集成 | |
代码不严谨,各种 Warning | 持续构建,Notice 也不放过 | |
零单元测试 | 99% 测试覆盖率 | |
代码风格、命名风格鱼龙混杂 | PSR1 + PSR2 | |
几乎零 PHPDoc | 持续补充中 | 对比图 |
异常和错误处理不统一 | 所有错误都将以异常的形式抛出,确保返回数据可靠 | Exceptions |
需手动根据接口名拼接请求类名 | 请求类工厂,根据 API 名直接创建请求类 | AlipayRequestFactory |
耦合度高,难以升级或替换 | 几乎完全解耦,任意替换签名 / 密钥 / 响应 甚至 HTTP 客户端 | AopClient |
主要目的
- 集成 Composer。
- 降低 PHP 依赖至 5.4。
- 整理代码风格使其符合
PSR-1
、PSR-2
。 - 增加单元测试。
- 兼容 PHP 7.x。
- 移除官方 API 文档内
已弃用
特性。 - 移除难以拓展的调试、日志等特性,以便于集成第三方框架和扩展包。
- 移除编码转换特性,统一使用
UTF-8
。 - 其它优化,持续进行中 ...
小试牛刀
如何使用
-
Composer 安装。
composer require abbotton/alipay-sdk
-
创建
AlipayKeyPair
实例。// 通过密钥文件创建(推荐) $keyPair = \Alipay\Key\AlipayKeyPair::create( __DIR__ . '/private.pem', __DIR__ . '/public.pem' ); // 通过密钥字符串创建 $privateKey = '-----BEGIN RSA PRIVATE KEY----- // ...... kXTZhB4nQqZXWFu8R+RdqC6gTh9k2dDz0NlibYSW9xApWRN572M9/n737110Yxa2 JZX27eBHLqR8aCZcXkADRpe9+yAL9SqErEOMh26nWFtwP5ZugHRf -----END RSA PRIVATE KEY-----'; $publicKey = '-----BEGIN PUBLIC KEY----- // ...... C9ykBV6BfujeeVQ2wUdpxFtI4gW8A4rgqecMvbL/KngU+aChG+W6SGXD8QY0fC4d 4QIDAQAB -----END PUBLIC KEY-----'; $keyPair = \Alipay\Key\AlipayKeyPair::create($privateKey, $publicKey);
AlipayKeyPair
用于存储应用私钥、支付宝公钥;两份密钥将分别用于与支付宝服务器通信时,生成请求签名、验证响应签名等。 -
创建
AopClient
实例。$aop = new \Alipay\AopClient('APP_ID', $keyPair);
AopClient
通常情况会贯穿整条业务,除非你须要在同一套代码内处理多个商户号/小程序,否则只需在初始化阶段创建一次即可。 -
根据业务需要,创建
AlipayRequest
实例。$bizContent = [ 'start_time' => '2021-08-01 00:00:00', 'end_time' => '2021-08-31 23:59:59', 'type' => 'TRANSFER', 'page_no' => 1 ]; // 通过工厂类创建 $request = (new \Alipay\AlipayRequestFactory)->create('alipay.data.bill.transfer.query', [ 'biz_content' => $bizContent, // ... ]); // 直接创建 $request = (new \Alipay\Request\AlipayRequest()) ->setApiMethodName('alipay.data.bill.transfer.query') ->setBizContent($bizContent);
-
发送请求,获得响应数据。
$result = $aop->execute($request)->getData();
所有错误(包括但不限于网络通信异常、数据格式异常、支付宝服务器返回的错误)都会被转换为异常,请注意捕捉。
-
更多实例,请移步
examples
目录。最后,官方 SDK 内
AopClient::pageExecute()
被分离为pageExecuteUrl
和pageExecuteForm
。AopClient::sdkExecute()
和AopClient::execute()
方法名保持不变,参数和返回值有所改动。
注意事项
- 请不要依赖任何在官方 SDK 内被标注为
private
的属性,它们可能已在迭代中被修改或废弃。 - 请不要依赖任何在官方 API 文档内被标注为
已废弃
的特性,它们可能已在迭代中被废弃或移除。 - 本 SDK 已移除所有编码转换特性;请确保执行上传文件请求时,文件编码为
UTF-8
而非GBK
。
实用工具
其它资源
已知 Issue
OpenSSL 在 Win32 平台需要配置 openssl.cnf
路径,参见 OpenSSL 安装 - PHP 手册。
在本 SDK 内,也可通过自定义 $configargs
参数来自定义此文件路径,而不需要配置环境变量;参见 examples/keys/generate.php。
目前已知以下方法依赖于此配置文件:
- 生成密钥对:
AlipayKeyPair::generate()
- 将私钥资源转换为字符串:
AlipayPrivateKey::toString()