afterpay-global/afterpay-sdk-php

官方 Afterpay SDK for PHP

1.8.0 2024-01-19 06:26 UTC

README

Build PHP Coding Standard

官方 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

注意:如果您需要在 sourcedist 安装之间切换,您需要先使用以下命令删除包,然后使用上面的其中一个 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两位国家代码。以下指定这些详情的方法被支持

  1. 在您的.env.php文件中,作为$afterpay_sdk_env_config数组中的merchantIdsecretKeycountryCode属性。
  2. 作为环境变量MERCHANT_IDSECRET_KEYCOUNTRY_CODE
  3. 通过手动定义一个\Afterpay\SDK\MerchantAccount类的对象,使用其setMerchantIdsetSecretKeysetCountryCode方法传递您的账户详情,然后使用其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   ##########

贡献

查看CONTRIBUTING.md