yijin / easysdk
支付宝官方 Alipay Easy SDK-适配SWOOLE
Requires
- php: >=7.0
- ext-ctype: *
- ext-curl: *
- ext-dom: *
- ext-fileinfo: *
- ext-json: *
- ext-libxml: *
- ext-mbstring: *
- ext-openssl: *
- ext-simplexml: *
- ext-xmlwriter: *
- adbario/php-dot-notation: ^2.2
- alibabacloud/tea: ^3.1
- alibabacloud/tea-fileform: ^0.3.2
- danielstjules/stringy: ^3.1
- guzzlehttp/guzzle: >=6.3
- mtdowling/jmespath.php: ^2.4
- pimple/pimple: ^3.0
- psr/log: ^1.1
- songshenzong/support: ^2.0
- xin/container: ^2.0.1
Requires (Dev)
- phpunit/phpunit: ^7.5
README
基于 Alipay Easy SDK for PHP 魔改的版本,主要是去除单例,防止swoole协程环境下数据混淆。
Alipay Easy SDK for PHP 让您无需复杂的编程即可访问支付宝开放平台提供的各项常用功能,SDK可以自动帮助您满足能力调用过程中所需的证书校验、加签、验签、发送HTTP请求等非功能性要求。
以下向您介绍Alipay Easy SDK for PHP 的基本设计理念和使用方法。
设计理念
与原有的Alipay SDK通用全面的设计理念不同,Alipay Easy SDK 对开放能力的 API 进行了更加贴近高频场景的精心设计与裁剪,简化了服务端调用方式,让调用 API 像使用语言内置的函数一样简便。
Alipay Easy SDK 提供了与 能力地图 对应的代码组织结构,让开发者可以快速找到不同能力对应的 API。
Alipay Easy SDK 的主要目标是提高开发者集成支付宝开放平台各类核心能力的效率。
环境要求
-
Alipay Easy SDK for PHP 需要 PHP 7.0 或更高版本。
-
在使用 Alipay Easy SDK for PHP 之前,您需要先前往 支付宝开发平台-开发者中心 完成开发者接入的一些准备工作,包括创建应用、为应用添加功能包、设置应用的接口加签方式等。
-
准备工作完成后,注意保存如下信息,后续将作为使用 SDK 的输入。
- 加签模式为公钥证书模式时(推荐)
AppId
、应用的私钥
、应用公钥证书文件
、支付宝公钥证书文件
、支付宝根证书文件
- 加签模式为公钥模式时
AppId
、应用的私钥
、支付宝公钥
安装依赖
通过 Composer 在线安装依赖(推荐)
composer require alipaysdk/easysdk:^2.2
本地手动集成依赖(适用于自己修改源码后的本地重新打包安装)
- 在本机安装配置 Composer 工具。
- 在本
README.md
所在目录下,执行composer install
,下载 SDK 依赖。 - 依赖文件会下载到
vendor
目录下。
快速使用
以下代码示例向您展示了使用 Alipay Easy SDK for PHP 调用一个 API 的 3 个主要步骤:
- 设置参数(全局只需设置一次)。
- 发起 API 调用。
- 处理响应或异常。
<?php require 'vendor/autoload.php'; use Alipay\EasySDKSwoole\Kernel\Factory; use Alipay\EasySDKSwoole\Kernel\Util\ResponseChecker; use Alipay\EasySDKSwoole\Kernel\Config; //1. 设置参数(全局只需设置一次) Factory::setOptions(getOptions()); try { //2. 发起API调用(以支付能力下的统一收单交易创建接口为例) $result = Factory::payment()->common()->create("iPhone6 16G", "20200326235526001", "88.88", "2088002656718920"); $responseChecker = new ResponseChecker(); //3. 处理响应或异常 if ($responseChecker->success($result)) { echo "调用成功". PHP_EOL; } else { echo "调用失败,原因:". $result->msg.",".$result->subMsg.PHP_EOL; } } catch (Exception $e) { echo "调用失败,". $e->getMessage(). PHP_EOL;; } function getOptions() { $options = new Config(); $options->protocol = 'https'; $options->gatewayHost = 'openapi.alipay.com'; $options->signType = 'RSA2'; $options->appId = '<-- 请填写您的AppId,例如:2019022663440152 -->'; // 为避免私钥随源码泄露,推荐从文件中读取私钥字符串而不是写入源码中 $options->merchantPrivateKey = '<-- 请填写您的应用私钥,例如:MIIEvQIBADANB ... ... -->'; $options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径,例如:/foo/alipayCertPublicKey_RSA2.crt -->'; $options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径,例如:/foo/alipayRootCert.crt" -->'; $options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径,例如:/foo/appCertPublicKey_2019051064521003.crt -->'; //注:如果采用非证书模式,则无需赋值上面的三个证书路径,改为赋值如下的支付宝公钥字符串即可 // $options->alipayPublicKey = '<-- 请填写您的支付宝公钥,例如:MIIBIjANBg... -->'; //可设置异步通知接收服务地址(可选) $options->notifyUrl = "<-- 请填写您的支付类接口异步通知接收服务地址,例如:https://www.test.com/callback -->"; //可设置AES密钥,调用AES加解密相关接口时需要(可选) $options->encryptKey = "<-- 请填写您的AES密钥,例如:aa4BtZ4tspm2wnXLb1ThQA== -->"; return $options; }
扩展调用
ISV代调用
Factory::payment()->faceToFace() // 调用agent扩展方法,设置app_auth_token,完成ISV代调用 ->agent("ca34ea491e7146cc87d25fca24c4cD11") ->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
设置独立的异步通知地址
Factory::payment()->faceToFace() // 调用asyncNotify扩展方法,可以为每此API调用,设置独立的异步通知地址 // 此处设置的异步通知地址的优先级高于全局Config中配置的异步通知地址 ->asyncNotify("https://www.test.com/callback") ->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
设置可选业务参数
$goodDetail = array( "goods_id" => "apple-01", "goods_name" => "iPhone6 16G", "quantity" => 1, "price" => "5799" ); $goodsDetail[0] = $goodDetail; Factory::payment()->faceToFace() // 调用optional扩展方法,完成可选业务参数(biz_content下的可选字段)的设置 ->optional("seller_id", "2088102146225135") ->optional("discountable_amount", "8.88") ->optional("goods_detail", $goodsDetail) ->preCreate("Apple iPhone11 128G", "2234567890", "5799.00"); $optionalArgs = array( "timeout_express" => "10m", "body" => "Iphone6 16G" ); Factory::payment()->faceToFace() // 也可以调用batchOptional扩展方法,批量设置可选业务参数(biz_content下的可选字段) ->batchOptional($optionalArgs) ->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
多种扩展灵活组合
// 多种扩展方式可灵活组装(对扩展方法的调用顺序没有要求) Factory::payment()->faceToFace() ->agent("ca34ea491e7146cc87d25fca24c4cD11") ->asyncNotify("https://www.test.com/callback") ->optional("seller_id", "2088102146225135") ->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
API 组织规范
在 Alipay Easy SDK 中,API 的引用路径与能力地图的组织层次一致,遵循如下规范
Factory::能力名称()->场景名称()->接口方法名称( ... )
例如,如果您想要使用 能力地图 中 营销能力
下的 模板消息
场景中的 小程序发送模板消息
,只需按如下形式编写调用代码即可(不同编程语言的连接符号可能不同)。
Factory::marketing()->templateMessage()->send( ... )
其中,接口方法名称通常是对其依赖的 OpenAPI 功能的一个最简概括,接口方法的出入参与 OpenAPI 中同名参数含义一致,可参照 OpenAPI 相关参数的使用说明。
Alipay Easy SDK 将致力于保持良好的 API 命名,以符合开发者的编程直觉。
已支持的 API 列表
能力类别 | 场景类别 | 接口方法名称 | 调用的 OpenAPI 名称 |
---|---|---|---|
Base | OAuth | getToken | alipay.system.oauth.token |
Base | OAuth | refreshToken | alipay.system.oauth.token |
Base | Qrcode | create | alipay.open.app.qrcode.create |
Base | Image | upload | alipay.offline.material.image.upload |
Base | Video | upload | alipay.offline.material.image.upload |
Member | Identification | init | alipay.user.certify.open.initialize |
Member | Identification | certify | 支付宝用户认证开放认证 |
Member | Identification | 查询 | 支付宝用户认证开放查询 |
支付 | 通用 | create | alipay.trade.create |
支付 | 通用 | 查询 | alipay.trade.query |
支付 | 通用 | 退款 | alipay.trade.refund |
支付 | 通用 | 关闭 | alipay.trade.close |
支付 | 通用 | 取消 | alipay.trade.cancel |
支付 | 通用 | 查询退款 | alipay.trade.fastpay.refund.query |
支付 | 通用 | 下载账单 | alipay.data.dataservice.bill.downloadurl.query |
支付 | 通用 | 验证通知 | - |
支付 | 花呗 | create | alipay.trade.create |
支付 | 面对面支付 | 支付 | alipay.trade.pay |
支付 | 面对面支付 | 预创建 | alipay.trade.precreate |
支付 | App | 支付 | alipay.trade.app.pay |
支付 | 页面 | 支付 | alipay.trade.page.pay |
支付 | Wap | 支付 | alipay.trade.wap.pay |
安全 | 文本风险 | 检测 | alipay.security.risk.content.detect |
营销 | 通过 | 创建模板 | alipay.pass.template.add |
营销 | 通过 | 更新模板 | alipay.pass.template.update |
营销 | 通过 | 添加实例 | alipay.pass.instance.add |
营销 | 通过 | 更新实例 | alipay.pass.instance.update |
营销 | 模板消息 | 发送 | alipay.open.app.mini.templatemessage.send |
营销 | 开放生活 | 创建图文内容 | alipay.open.public.message.content.create |
营销 | 开放生活 | 修改图文内容 | alipay.open.public.message.content.modify |
营销 | 开放生活 | 发送文本 | alipay.open.public.message.total.send |
营销 | 开放生活 | 发送图文 | alipay.open.public.message.total.send |
营销 | 开放生活 | 发送单条消息 | alipay.open.public.message.single.send |
营销 | 开放生活 | 撤回消息 | alipay.open.public.life.msg.recall |
营销 | 开放生活 | 设置行业 | alipay.open.public.template.message.industry.modify |
营销 | 开放生活 | 获取行业 | alipay.open.public.setting.category.query |
工具 | AES | 解密 | - |
工具 | AES | 加密 | - |
工具 | 通用 | 执行 | - |
工具 | 通用 | sdkExecute | - |
工具 | 通用 | fileExecute | - |
注:更多高频场景的API持续更新中,敬请期待。