afterpay-global / afterpay-sdk-php
官方 Afterpay SDK for PHP
Requires (Dev)
- phpunit/phpunit: ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.0
- squizlabs/php_codesniffer: ^3.5
README
官方 Afterpay SDK for PHP
先决条件
最低要求
- PHP 5.6+
可选建议
- MySQL 5.6+
- PHPUnit 5+
安装
使用 Composer 安装。
生产环境
对于生产使用,请确保使用 dist
安装方法。这将排除开发资源,如测试和示例代码。
composer require --prefer-dist afterpay-global/afterpay-sdk-php
开发环境
对于开发目的,使用 --prefer-source
选项从源安装。这将包括开发资源,如测试和示例代码。
composer require --prefer-source afterpay-global/afterpay-sdk-php
注意:如果您需要在 source
和 dist
安装之间切换,您需要先使用以下命令删除包,然后使用上面的其中一个 require
命令重新安装。
composer remove afterpay-global/afterpay-sdk-php
配置
预期环境变量在 PHP 文件中定义,位于 ./vendor/afterpay-global/afterpay-sdk-php/.env.php
。
在 ./vendor/afterpay-global/afterpay-sdk-php/sample.env.php
提供了一个示例文件 - 使用此文件作为模板来创建自己的环境配置文件。
可以在没有此预期文件的情况下配置 SDK,通过在应用程序中使用之前手动设置每个适当的类上的配置选项。作为最后的手段,SDK 将尝试使用 getenv
从系统中加载其环境变量。
测试
使用 PHPUnit 进行测试。确保您已安装了根据您的 PHP 版本适当的 PHPUnit 版本。
每个版本都在以下测试环境中得到验证
然而,在部署到生产之前,始终建议在自己的独特环境中测试所有软件。
单元测试
这些测试不需要任何网络或持久存储。
phpunit --colors=always ./vendor/afterpay-global/afterpay-sdk-php/test/unit
服务测试
这些测试假定您已在 .env.php
配置文件中配置了持久存储提供程序。例如,如果您提供了 MySQL 数据库的凭据,SDK 将验证它可以以写访问连接到数据库。
phpunit --colors=always ./vendor/afterpay-global/afterpay-sdk-php/test/service
网络测试
这些测试将验证 SDK 是否可以使用 PHP 的本地 cURL 库与必要的外部服务通信。
phpunit --colors=always ./vendor/afterpay-global/afterpay-sdk-php/test/network
集成测试
这些测试假定您已在 .env.php
配置文件中为 Afterpay/Clearpay Online API 配置了有效的商家凭据。如果是这样,SDK 将验证它可以向 API 发送请求,并且 API 以预期的方式响应。
phpunit --colors=always ./vendor/afterpay-global/afterpay-sdk-php/test/integration
使用方法
构建数据模型
所有模型类都可在 src/Model 中找到。这些类旨在反映 Afterpay 和 Clearpay 的官方在线文档中描述的数据模型。通过使用这些模型类来构建 HTTP 请求,可以在运行时验证请求格式的有效性。
在 sample 目录中提供了示例代码
发起HTTP请求
大多数API端点都需要认证(Ping请求除外)。您可以使用几种不同的方法定义Afterpay/Clearpay商户账户的API凭据。您还需要指定商户账户的ISO 3166-1 alpha-2两位国家代码。以下指定这些详情的方法被支持
- 在您的
.env.php
文件中,作为$afterpay_sdk_env_config
数组中的merchantId
、secretKey
和countryCode
属性。 - 作为环境变量
MERCHANT_ID
、SECRET_KEY
和COUNTRY_CODE
。 - 通过手动定义一个
\Afterpay\SDK\MerchantAccount
类的对象,使用其setMerchantId
、setSecretKey
和setCountryCode
方法传递您的账户详情,然后使用其setMerchantAccount
方法将该对象传递给HTTP请求对象。
在 sample 目录中提供了示例代码
故障排除
如何检索原始HTTP日志
所有请求和响应对象提供了一个getRawLog
方法,用于返回原始HTTP日志。在遇到Afterpay API未按预期行为的情况时,这通常是最有用的数据,以协助调查。
注意:默认情况下,出于隐私原因,任何潜在敏感信息都会被隐藏。强烈建议不要禁用此功能,除非采取了非凡的预防措施,确保原始HTTP日志不会长时间存储,并在达到预期目的后立即销毁。
例如
require __DIR__ . '/vendor/autoload.php'; use Afterpay\SDK\HTTP\Request\CreateCheckout as AfterpayCreateCheckoutRequest; $createCheckoutRequest = new AfterpayCreateCheckoutRequest([ 'amount' => [ '10.00', 'AUD' ], 'consumer' => [ 'phoneNumber' => '0400 000 000', 'givenNames' => 'Test', 'surname' => 'Test', 'email' => 'test@example.com' ], 'billing' => [ 'name' => 'Joe Consumer', 'line1' => 'Level 5', 'line2' => '406 Collins Street', 'area1' => 'Melbourne', 'region' => 'VIC', 'postcode' => '3000', 'countryCode' => 'AU', 'phoneNumber' => '0400 000 000' ], 'shipping' => [ 'name' => 'Joe Consumer', 'line1' => 'Level 5', 'line2' => '406 Collins Street', 'area1' => 'Melbourne', 'region' => 'VIC', 'postcode' => '3000', 'countryCode' => 'AU', 'phoneNumber' => '0400 000 000' ], 'courier' => [ 'shippedAt' => '2019-01-01T00:00:00+10:00', 'name' => 'Australia Post', 'tracking' => 'AA0000000000000', 'priority' => 'STANDARD' ], 'items' => [ [ 'name' => 'T-Shirt - Blue - Size M', 'sku' => 'TSH0001B1MED', 'quantity' => 10, 'pageUrl' => 'https://www.example.com/page.html', 'imageUrl' => 'https://www.example.com/image.jpg', 'price' => [ '10.00', 'AUD' ], 'categories' => [ [ 'Clothing', 'T-Shirts', 'Under $25' ], [ 'Sale', 'Clothing' ] ] ] ], 'discounts' => [ [ 'displayName' => '20% off SALE', 'amount' => [ '24.00', 'AUD' ] ] ], 'merchant' => [ 'redirectConfirmUrl' => 'http://localhost', 'redirectCancelUrl' => 'http://localhost' ], 'taxAmount' => [ '0.00', 'AUD' ], 'shippingAmount' => [ '0.00', 'AUD' ] ]); $createCheckoutRequest->send(); echo $createCheckoutRequest->getRawLog();
########## BEGIN RAW HTTP REQUEST ##########
POST /v2/checkouts HTTP/2
Host: global-api-sandbox.afterpay.com
Authorization: Basic MzM******************************************************************************************************************************************************************************TA=
User-Agent: afterpay-sdk-php/1.4.1 (PHP/8.1.1; cURL/7.77.0; Merchant/*****)
Accept: */*
Content-Type: application/json
Content-Length: 1223
{"amount":{"amount":"10.00","currency":"AUD"},"consumer":{"phoneNumber":"**** *** ***","givenNames":"****","surname":"****","email":"****************"},"billing":{"name":"*** ********","line1":"***** *","line2":"*** ******* ******","area1":"*********","region":"***","postcode":"****","countryCode":"AU","phoneNumber":"**** *** ***"},"shipping":{"name":"*** ********","line1":"***** *","line2":"*** ******* ******","area1":"*********","region":"***","postcode":"****","countryCode":"AU","phoneNumber":"**** *** ***"},"courier":{"shippedAt":"2019-01-01T00:00:00+10:00","name":"********* ****","tracking":"AA0000000000000","priority":"STANDARD"},"items":[{"name":"******* * **** * **** *","sku":"TSH0001B1MED","quantity":10,"pageUrl":"https:\/\/www.example.com\/page.html","imageUrl":"https:\/\/www.example.com\/image.jpg","price":{"amount":"10.00","currency":"AUD"},"categories":[["Clothing","T-Shirts","Under $25"],["Sale","Clothing"]]}],"discounts":[{"displayName":"20% off SALE","amount":{"amount":"24.00","currency":"AUD"}}],"merchant":{"redirectConfirmUrl":"http:\/\/localhost","redirectCancelUrl":"http:\/\/localhost"},"taxAmount":{"amount":"0.00","currency":"AUD"},"shippingAmount":{"amount":"0.00","currency":"AUD"}}
########## END RAW HTTP REQUEST ##########
########## BEGIN RAW HTTP RESPONSE ##########
HTTP/2 201
date: Tue, 15 Sep 2020 14:20:49 GMT
content-type: application/json
content-length: 249
set-cookie: __cfduid=d05b6824b1ed88439e0b8edfe4905c7671600179649; expires=Thu, 15-Oct-20 14:20:49 GMT; path=/; domain=.afterpay.com; HttpOnly; SameSite=Lax; Secure
http_correlation_id: ed5d72kgz3ezlylm7g3qxiej6a
cf-cache-status: DYNAMIC
cf-request-id: 0533bcd2b60000fd36ac918200000001
expect-ct: max-age=604800, report-uri="https://report-uri.cloudflare.com/cdn-cgi/beacon/expect-ct"
strict-transport-security: max-age=31536000; includeSubDomains; preload
server: cloudflare
cf-ray: 5d32fd97883dfd36-SYD
{
"token" : "001.ug27ke8qbpljfsssn4t98c60eq61767rva1e3f3g7g4nup7c",
"expires" : "2020-09-15T17:20:49.267Z",
"redirectCheckoutUrl" : "https://portal.sandbox.afterpay.com/au/checkout/?token=001.ug27ke8qbpljfsssn4t98c60eq61767rva1e3f3g7g4nup7c"
}
########## END RAW HTTP RESPONSE ##########