<?php
/**
* The Create Setup Token endpoint.
*
* @package WooCommerce\PayPalCommerce\ApiClient\Endpoint
*/
declare (strict_types=1);
namespace WooCommerce\PayPalCommerce\SavePaymentMethods\Endpoint;
use Exception;
use WooCommerce\PayPalCommerce\ApiClient\Endpoint\PaymentMethodTokensEndpoint;
use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource;
use WooCommerce\PayPalCommerce\Button\Endpoint\EndpointInterface;
use WooCommerce\PayPalCommerce\Button\Endpoint\RequestData;
use WooCommerce\PayPalCommerce\Button\Exception\NonceValidationException;
use WooCommerce\PayPalCommerce\WcGateway\Gateway\CreditCardGateway;
/**
* Class CreateSetupToken
*/
class CreateSetupToken implements EndpointInterface
{
const ENDPOINT = 'ppc-create-setup-token';
/**
* The request data helper.
*
* @var RequestData
*/
private $request_data;
/**
* Payment Method Tokens endpoint.
*
* @var PaymentMethodTokensEndpoint
*/
private $payment_method_tokens_endpoint;
/**
* CreateSetupToken constructor.
*
* @param RequestData $request_data The request data helper.
* @param PaymentMethodTokensEndpoint $payment_method_tokens_endpoint Payment Method Tokens endpoint.
*/
public function __construct(RequestData $request_data, PaymentMethodTokensEndpoint $payment_method_tokens_endpoint)
{
$this->request_data = $request_data;
$this->payment_method_tokens_endpoint = $payment_method_tokens_endpoint;
}
/**
* Returns the nonce.
*
* @return string
*/
public static function nonce(): string
{
return self::ENDPOINT;
}
/**
* Handles the request.
*
* @throws Exception On Error.
*/
public function handle_request(): void
{
try {
$data = $this->request_data->read_request($this->nonce());
$payment_source = new PaymentSource('paypal', (object) array('usage_type' => 'MERCHANT', 'experience_context' => (object) array('return_url' => esc_url(wc_get_account_endpoint_url('payment-methods')), 'cancel_url' => esc_url(wc_get_account_endpoint_url('add-payment-method')))));
$payment_method = $data['payment_method'] ?? '';
if ($payment_method === CreditCardGateway::ID) {
$properties = (object) array();
$verification_method = $data['verification_method'] ?? '';
if ($verification_method === 'SCA_WHEN_REQUIRED' || $verification_method === 'SCA_ALWAYS') {
$properties = (object) array('verification_method' => $verification_method, 'usage_type' => 'MERCHANT', 'experience_context' => (object) array('return_url' => esc_url(wc_get_account_endpoint_url('payment-methods')), 'cancel_url' => esc_url(wc_get_account_endpoint_url('add-payment-method'))));
}
$payment_source = new PaymentSource('card', $properties);
}
$customer_id = get_user_meta(get_current_user_id(), '_ppcp_target_customer_id', \true);
$result = $this->payment_method_tokens_endpoint->setup_tokens($payment_source, (string) $customer_id);
wp_send_json_success($result);
} catch (NonceValidationException $error) {
wp_send_json_error(array('message' => $error->getMessage()), 400);
} catch (Exception $exception) {
wp_send_json_error();
}
}
}