app/Plugin/PayPalCheckout42/Service/PayPalAcdcRequestService.php line 39

Open in your IDE?
  1. <?php
  2. namespace Plugin\PayPalCheckout42\Service;
  3. use Plugin\PayPalCheckout42\Contracts\GenerateClientTokenResponse;
  4. use Plugin\PayPalCheckout42\Contracts\GeneratePaymentTokenResponse;
  5. use Plugin\PayPalCheckout42\Lib\PayPalHttp\HttpException;
  6. use Plugin\PayPalCheckout42\Lib\PayPalHttp\HttpRequest as PayPalHttpRequest;
  7. use Plugin\PayPalCheckout42\Lib\PayPalHttp\HttpResponse as PayPalHttpResponse;
  8. use Plugin\PayPalCheckout42\Lib\PayPalCheckoutSdk\Core\PayPalHttpClient;
  9. use Plugin\PayPalCheckout42\Lib\PayPalCheckoutSdk\Core\ProductionEnvironment;
  10. use Plugin\PayPalCheckout42\Lib\PayPalCheckoutSdk\Core\SandboxEnvironment;
  11. use Plugin\PayPalCheckout42\Exception\PayPalRequestException;
  12. /**
  13.  * Class PayPalAcdcRequestService
  14.  * @package Plugin\PayPalCheckout42\Service
  15.  */
  16. class PayPalAcdcRequestService
  17. {
  18.     /**
  19.      * @var PayPalHttpClient|null
  20.      */
  21.     private $client;
  22.     /**
  23.      * PayPalRequestService constructor.
  24.      */
  25.     public function __construct()
  26.     {
  27.         $this->client null;
  28.     }
  29.     /**
  30.      * @param string $clientId
  31.      * @param string $clientSecret
  32.      * @param bool $sandbox
  33.      */
  34.     public function setEnv(string $clientIdstring $clientSecret$sandbox false): void
  35.     {
  36.         if ($sandbox) {
  37.             /** @var SandboxEnvironment $env */
  38.             $env = new SandboxEnvironment($clientId$clientSecret);
  39.         } else {
  40.             /** @var ProductionEnvironment $env */
  41.             $env = new ProductionEnvironment($clientId$clientSecret);
  42.         }
  43.         /** @var PayPalHttpClient $client */
  44.         $this->client = new PayPalHttpClient($env);
  45.     }
  46.     /**
  47.      * クライアントトークン取得のためのリクエストを作成します。
  48.      * 顧客IDを指定した場合は Vault 機能を使って顧客ごとにクレジットカード情報を保存することができます。
  49.      *
  50.      * @param string $customerId 一意に識別できる顧客IDを指定します
  51.      * @return PayPalHttpRequest
  52.      */
  53.     public function prepareClientToken($customerId null): PayPalHttpRequest
  54.     {
  55.         $request = new class($customerId) extends PayPalHttpRequest {
  56.             function __construct($customerId null)
  57.             {
  58.                 parent::__construct("/v1/identity/generate-token""POST");
  59.                 // Authorization ヘッダーは Client 側で付与してくれるので不要
  60.                 $this->headers["Content-Type"] = "application/json";
  61.                 $this->headers["Accept-Language"] = "en_US";
  62.                 if (!is_null($customerId)) {
  63.                     $this->body = [
  64.                         'customer_id' => $customerId
  65.                     ];
  66.                 }
  67.             }
  68.         };
  69.         return $request;
  70.     }
  71.     /**
  72.      * クライアントトークンを取得します
  73.      *
  74.      * @param PayPalHttpRequest $request リクエスト
  75.      * @return PayPalHttpResponse レスポンス
  76.      * @throws PayPalRequestException
  77.      */
  78.     public function getClientToken(PayPalHttpRequest $request): PayPalHttpResponse
  79.     {
  80.         /** @var PayPalHttpResponse $response */
  81.         $response $this->send($request);
  82.         return new class($response) extends PayPalHttpResponse implements GenerateClientTokenResponse
  83.         {
  84.             function __construct(PayPalHttpResponse $response)
  85.             {
  86.                 parent::__construct($response->statusCode$response->result$response->headers);
  87.             }
  88.             public function getClientToken(): string
  89.             {
  90.                 return $this->result->client_token;
  91.             }
  92.         };
  93.     }
  94.     /**
  95.      * ペイメントトークン取得のためのリクエストを作成します。
  96.      *
  97.      * @param string $customerId 一意に識別できる顧客IDを指定します
  98.      * @return PayPalHttpRequest
  99.      */
  100.     public function preparePaymentToken(string $customerId): PayPalHttpRequest
  101.     {
  102.         $request = new class($customerId) extends PayPalHttpRequest {
  103.             function __construct($customerId)
  104.             {
  105.                 parent::__construct("/v2/vault/payment-tokens?customer_id={$customerId}""GET");
  106.                 // Authorization ヘッダーは Client 側で付与してくれるので不要
  107.                 $this->headers["Content-Type"] = "application/json";
  108.             }
  109.         };
  110.         return $request;
  111.     }
  112.     /**
  113.      * ペイメントトークンを取得します
  114.      *
  115.      * @param PayPalHttpRequest $request リクエスト
  116.      * @return PayPalHttpResponse レスポンス
  117.      * @throws PayPalRequestException
  118.      */
  119.     public function getPaymentToken(PayPalHttpRequest $request): PayPalHttpResponse
  120.     {
  121.         /** @var PayPalHttpResponse $response */
  122.         $response $this->send($request);
  123.         return new class($response) extends PayPalHttpResponse implements GeneratePaymentTokenResponse
  124.         {
  125.             function __construct(PayPalHttpResponse $response)
  126.             {
  127.                 parent::__construct($response->statusCode$response->result$response->headers);
  128.             }
  129.             /**
  130.              * @return array
  131.              */
  132.             public function getPaymentTokens(): array
  133.             {
  134.                 return $this->result->payment_tokens ?? [];
  135.             }
  136.         };
  137.     }
  138.     /**
  139.      * vault 削除のためのリクエストを作成します。
  140.      *
  141.      * @param string $vaultId 削除する vault ID
  142.      * @return PayPalHttpRequest
  143.      */
  144.     public function prepareDeleteVault($vaultId): PayPalHttpRequest
  145.     {
  146.         $request = new class($vaultId) extends PayPalHttpRequest {
  147.             function __construct($vaultId null)
  148.             {
  149.                 parent::__construct("/v2/vault/payment-tokens/{$vaultId}""DELETE");
  150.                 // Authorization ヘッダーは Client 側で付与してくれるので不要
  151.                 $this->headers["Content-Type"] = "application/json";
  152.             }
  153.         };
  154.         return $request;
  155.     }
  156.     /**
  157.      * vault を削除します
  158.      *
  159.      * @param PayPalHttpRequest $request リクエスト
  160.      * @return bool 成否
  161.      * @throws PayPalRequestException
  162.      */
  163.     public function deleteVault(PayPalHttpRequest $request): bool
  164.     {
  165.         /** @var PayPalHttpResponse $response */
  166.         $response $this->send($request);
  167.         return 200 <= $response->statusCode && $response->statusCode <= 299;
  168.     }
  169.     /**
  170.      * @param PayPalHttpRequest $request
  171.      * @return PayPalHttpResponse
  172.      * @throws PayPalRequestException
  173.      */
  174.     private function send(PayPalHttpRequest $request): PayPalHttpResponse
  175.     {
  176.         try {
  177.             /** @var PayPalHttpResponse $response */
  178.             $response $this->client->execute($request);
  179.         } catch (HttpException $e) {
  180.             throw new PayPalRequestException($e->getMessage(), $e->statusCode$e);
  181.         }
  182.         return $response;
  183.     }
  184. }