## 環境要求
1. Alipay Easy SDK for PHP 需要配合`PHP 7.0`或其以上版本。
2. 使用 Alipay Easy SDK for PHP 之前 ,您需要先前往[支付寶開發平臺-開發者中心](https://openhome.alipay.com/platform/developerIndex.htm)完成開發者接入的一些準備工作,包括創建應用、為應用添加功能包、設置應用的接口加簽方式等。
3. 準備工作完成后,注意保存如下信息,后續將作為使用SDK的輸入。
* 加簽模式為公鑰證書模式時(推薦)
`AppId`、`應用的私鑰`、`應用公鑰證書文件`、`支付寶公鑰證書文件`、`支付寶根證書文件`
* 加簽模式為公鑰模式時
`AppId`、`應用的私鑰`、`支付寶公鑰`
## [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96)安裝依賴
### [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E9%80%9A%E8%BF%87composer%E5%9C%A8%E7%BA%BF%E5%AE%89%E8%A3%85%E4%BE%9D%E8%B5%96%E6%8E%A8%E8%8D%90)通過[Composer](https://packagist.org/packages/alipaysdk/easysdk/)在線安裝依賴(推薦)
`composer require alipaysdk/easysdk:^2.2`
### [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E6%9C%AC%E5%9C%B0%E6%89%8B%E5%8A%A8%E9%9B%86%E6%88%90%E4%BE%9D%E8%B5%96%E9%80%82%E7%94%A8%E4%BA%8E%E8%87%AA%E5%B7%B1%E4%BF%AE%E6%94%B9%E6%BA%90%E7%A0%81%E5%90%8E%E7%9A%84%E6%9C%AC%E5%9C%B0%E9%87%8D%E6%96%B0%E6%89%93%E5%8C%85%E5%AE%89%E8%A3%85)本地手動集成依賴(適用于自己修改源碼后的本地重新打包安裝)
1. 本機安裝配置[Composer](https://getcomposer.org/)工具。
2. 在本`README.md`所在目錄下,執行`composer install`,下載SDK依賴。
3. 依賴文件會下載到`vendor`目錄下。
## [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E5%BF%AB%E9%80%9F%E4%BD%BF%E7%94%A8)快速使用
以下這段代碼示例向您展示了使用Alipay Easy SDK for PHP調用一個API的3個主要步驟:
1. 設置參數(全局只需設置一次)。
2. 發起API調用。
3. 處理響應或異常。
~~~html
<?php
require 'vendor/autoload.php';
use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Util\ResponseChecker;
use Alipay\EasySDK\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;
}
~~~
### [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E6%89%A9%E5%B1%95%E8%B0%83%E7%94%A8)擴展調用
#### [](https://github.com/alipay/alipay-easysdk/tree/master/php#isv%E4%BB%A3%E8%B0%83%E7%94%A8)ISV代調用
~~~html
Factory::payment()->faceToFace()
// 調用agent擴展方法,設置app_auth_token,完成ISV代調用
->agent("ca34ea491e7146cc87d25fca24c4cD11")
->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
~~~
#### [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E8%AE%BE%E7%BD%AE%E7%8B%AC%E7%AB%8B%E7%9A%84%E5%BC%82%E6%AD%A5%E9%80%9A%E7%9F%A5%E5%9C%B0%E5%9D%80)設置獨立的異步通知地址
~~~html
Factory::payment()->faceToFace()
// 調用asyncNotify擴展方法,可以為每此API調用,設置獨立的異步通知地址
// 此處設置的異步通知地址的優先級高于全局Config中配置的異步通知地址
->asyncNotify("https://www.test.com/callback")
->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
~~~
#### [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E8%AE%BE%E7%BD%AE%E5%8F%AF%E9%80%89%E4%B8%9A%E5%8A%A1%E5%8F%82%E6%95%B0)設置可選業務參數
~~~html
$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");
~~~
#### [](https://github.com/alipay/alipay-easysdk/tree/master/php#%E5%A4%9A%E7%A7%8D%E6%89%A9%E5%B1%95%E7%81%B5%E6%B4%BB%E7%BB%84%E5%90%88)多種擴展靈活組合
~~~html
// 多種擴展方式可靈活組裝(對擴展方法的調用順序沒有要求)
Factory::payment()->faceToFace()
->agent("ca34ea491e7146cc87d25fca24c4cD11")
->asyncNotify("https://www.test.com/callback")
->optional("seller_id", "2088102146225135")
->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
~~~
## [](https://github.com/alipay/alipay-easysdk/tree/master/php#api%E7%BB%84%E7%BB%87%E8%A7%84%E8%8C%83)API組織規范
在Alipay Easy SDK中,API的引用路徑與能力地圖的組織層次一致,遵循如下規范
>[success] Factory::能力名稱()->場景名稱()->接口方法名稱( ... )
比如,如果您想要使用[能力地圖](https://opendocs.alipay.com/mini/00am3f)中`營銷能力`下的`模板消息`場景中的`小程序發送模板消息`,只需按如下形式編寫調用代碼即可(不同編程語言的連接符號可能不同)。
`Factory::marketing()->templateMessage()->send( ... )`
其中,接口方法名稱通常是對其依賴的OpenAPI功能的一個最簡概況,接口方法的出入參與OpenAPI中同名參數含義一致,可參照OpenAPI相關參數的使用說明。
Alipay Easy SDK將致力于保持良好的API命名,以符合開發者的編程直覺。