## PHP 集成示例
### 普通調用示例
~~~php
<?php
require 'vendor/autoload.php';
use Alipay\EasySDK\Kernel\Factory;
use Alipay\EasySDK\Kernel\Config;
//1. 設置參數(全局只需設置一次)Factory::setOptions(getOptions());
try {
//2. 發起API調用(以支付能力下的統一收單交易創建接口為例)
$result = Factory::payment()->common()->create("iPhone6 16G", "20200326235526001", "88.88", "2088002656718920");
//3. 處理響應或異常
if (!empty($result->code) && $result->code == 10000) {
echo "調用成功". PHP_EOL;
} else {
echo "調用失敗,原因:". $result->msg.",".$result->sub_msg.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;
}
~~~
### 第三方代理調用示例
~~~php
Factory::payment()->faceToFace()
// 調用agent擴展方法,設置app_auth_token,完成ISV代調用
->agent("ca34ea491e7146cc87d25fca24c4cD11")
->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
~~~
### 設置獨立的異步通知地址示例
~~~php
Factory::payment()->faceToFace()
// 調用asyncNotify擴展方法,可以為每此API調用,設置獨立的異步通知地址
// 此處設置的異步通知地址的優先級高于全局Config中配置的異步通知地址
->asyncNotify("https://www.test.com/callback")
->preCreate("Apple iPhone11 128G", "2234567890", "5799.00");
~~~
### 支付類異步通知驗簽示例
~~~php
$parameters = array(
"charset" => "UTF-8",
"sign" => "GM0CbuqaEivqgb......",
"app_id" => "2018091261392200",
"sign_type" => "RSA2",
"isv_ticket" => "",
"timestamp" => "2020-03-25 16:27:08"
//... ... 接收到的所有參數放入這里
);
Factory::payment()->common()->verifyNotify($parameters);
~~~
### 動態擴展 SDK 功能滿足個性化需求
#### 當 SDK 的 API 聲明中的參數不滿足個性化需求時,可按如下方式追加可選業務參數:
~~~php
$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");
~~~
#### 當想要調用的 OpenAPI 在 SDK 中沒有對應的 API 與之對應時,可按如下方式調用 OpenAPI:
**注意**:文件上傳類 OpenAPI、生成字符串類的 OpenAPI(老版 SDK 中需使用 sdkExecute)、生成 Form 表單類的 OpenAPI(老版 SDK 中需要使用 pageExecute)本調用方式暫不支持。
~~~php
//設置系統參數(OpenAPI中非biz_content里的參數)
$textParams = array("app_auth_token" => "201712BB_D0804adb2e743078d1822d536956X34");
//設置業務參數(OpenAPI中biz_content里的參數)
$extendParams = array("hb_fq_num" => "3", "hb_fq_seller_percent" => "3");
$bizParams = array(
"subject" => "Iphone6 16G",
"out_trade_no" => microtime(),
"total_amount" => "0.10",
"buyer_id" => "2088002656718920",
"extend_params" => $extendParams
);
Factory::util()->generic()->execute("alipay.trade.create",$textParams, $bizParams);
~~~