Files
shuffle_and_skirmish_website/wp-content/plugins/woocommerce-payments/includes/admin/class-wc-rest-payments-customer-controller.php
2025-11-24 21:33:55 +00:00

281 lines
8.6 KiB
PHP

<?php
/**
* Class WC_REST_Payments_Customer_Controller
*
* @package WooCommerce\Payments\Admin
*/
use WCPay\Core\Server\Request;
use WCPay\Exceptions\API_Exception;
defined( 'ABSPATH' ) || exit;
/**
* REST controller for customers.
*/
class WC_REST_Payments_Customer_Controller extends WC_Payments_REST_Controller {
/**
* Onboarding Service.
*
* @var WC_Payments_Customer_Service
*/
protected $customer_service;
/**
* Endpoint path.
*
* @var string
*/
protected $rest_base = 'payments/customers';
/**
* Constructor.
*
* @param WC_Payments_API_Client $api_client WooCommerce Payments API client.
* @param WC_Payments_Customer_Service $customer_service Token service.
*/
public function __construct(
WC_Payments_API_Client $api_client,
WC_Payments_Customer_Service $customer_service
) {
parent::__construct( $api_client );
$this->customer_service = $customer_service;
}
/**
* Configure REST API routes.
*/
public function register_routes() {
register_rest_route(
$this->namespace,
'/' . $this->rest_base . '/(?P<customer_id>\w+)/payment_methods',
[
[
'methods' => WP_REST_Server::READABLE,
'callback' => [ $this, 'get_customer_payment_methods' ],
'permission_callback' => [ $this, 'check_permission' ],
],
'schema' => [ $this, 'get_item_schema' ],
]
);
}
/**
* Retrieve transaction to respond with via API.
*
* @param WP_REST_Request $request Full data about the request.
*/
public function get_customer_payment_methods( $request ) {
$customer_id = $request->get_param( 'customer_id' );
$payment_methods_types = WC_Payments::get_gateway()->get_upe_enabled_payment_method_ids() ?? [];
$payment_methods = [];
// Perhaps we can fetch it directly from server and avoid looping to get payment methods from cache.
foreach ( $payment_methods_types as $type ) {
try {
$payment_methods[] = $this->customer_service->get_payment_methods_for_customer( $customer_id, $type );
} catch ( API_Exception $e ) {
wp_send_json_error(
wp_strip_all_tags( $e->getMessage() ),
403
);
}
}
$payment_methods = array_merge( ...$payment_methods );
$data = [];
foreach ( $payment_methods as $payment_method ) {
$response = $this->prepare_item_for_response( $payment_method, $request );
$data[] = $this->prepare_response_for_collection( $response );
}
return rest_ensure_response( $data );
}
/**
* Prepare each item for response.
*
* @param array|mixed $item Item to prepare.
* @param WP_REST_Request $request Request instance.
*
* @return WP_REST_Response|WP_Error
*/
public function prepare_item_for_response( $item, $request ) {
$prepared_item = [];
$prepared_item['id'] = $item['id'];
$prepared_item['type'] = $item['type'];
$prepared_item['billing_details'] = $item['billing_details'];
if ( array_key_exists( 'card', $item ) ) {
$prepared_item['card'] = [
'brand' => $item['card']['brand'],
'last4' => $item['card']['last4'],
'exp_month' => $item['card']['exp_month'],
'exp_year' => $item['card']['exp_year'],
];
}
if ( array_key_exists( 'card', $item ) ) {
$prepared_item['card'] = [
'brand' => $item['card']['brand'],
'last4' => $item['card']['last4'],
'exp_month' => $item['card']['exp_month'],
'exp_year' => $item['card']['exp_year'],
];
} elseif ( array_key_exists( 'sepa_debit', $item ) ) {
$prepared_item['sepa_debit'] = [
'last4' => $item['sepa_debit']['last4'],
];
} elseif ( array_key_exists( 'link', $item ) ) {
$prepared_item['link'] = [
'email' => $item['link']['email'],
];
}
$context = $request['context'] ?? 'view';
$prepared_item = $this->add_additional_fields_to_object( $prepared_item, $request );
$prepared_item = $this->filter_response_by_context( $prepared_item, $context );
return rest_ensure_response( $prepared_item );
}
/**
* Item schema.
*
* @return array
*/
public function get_item_schema() {
return [
'$schema' => 'http://json-schema.org/draft-04/schema#',
'title' => 'payment_method',
'type' => 'object',
'properties' => [
'id' => [
'description' => __( 'ID for the payment method.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'type' => [
'description' => __( 'Type of the payment method.', 'woocommerce-payments' ),
'type' => 'string',
'enum' => [ 'card', 'sepa_debit', 'link' ],
'context' => [ 'view' ],
],
'billing_details' => [
'description' => __( 'Billing details for the payment method.', 'woocommerce-payments' ),
'type' => 'object',
'context' => [ 'view' ],
'properties' => [
'address' => [
'description' => __( 'Address associated with the billing details.', 'woocommerce-payments' ),
'type' => 'object',
'context' => [ 'view' ],
'properties' => [
'city' => [
'description' => __( 'City of the billing address.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'country' => [
'description' => __( 'Country of the billing address.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'line1' => [
'description' => __( 'Line 1 of the billing address.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'line2' => [
'description' => __( 'Line 2 of the billing address.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'postal_code' => [
'description' => __( 'Postal code of the billing address.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'state' => [
'description' => __( 'State of the billing address.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
],
],
'email' => [
'description' => __( 'Email associated with the billing details.', 'woocommerce-payments' ),
'type' => 'string',
'format' => 'email',
'context' => [ 'view' ],
],
'name' => [
'description' => __( 'Name associated with the billing details.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'phone' => [
'description' => __( 'Phone number associated with the billing details.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
],
],
'card' => [
'description' => __( 'Card details for the payment method.', 'woocommerce-payments' ),
'type' => 'object',
'context' => [ 'view' ],
'properties' => [
'brand' => [
'description' => __( 'Brand of the card.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'last4' => [
'description' => __( 'Last 4 digits of the card.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
'exp_month' => [
'description' => __( 'Expiration month of the card.', 'woocommerce-payments' ),
'type' => 'integer',
'context' => [ 'view' ],
],
'exp_year' => [
'description' => __( 'Expiration year of the card.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
],
],
'sepa_debit' => [
'description' => __( 'SEPA Debit details for the payment method.', 'woocommerce-payments' ),
'type' => 'object',
'context' => [ 'view' ],
'properties' => [
'last4' => [
'description' => __( 'Last 4 digits of the SEPA Debit.', 'woocommerce-payments' ),
'type' => 'string',
'context' => [ 'view' ],
],
],
],
'link' => [
'description' => __( 'Link details for the payment method.', 'woocommerce-payments' ),
'type' => 'object',
'context' => [ 'view' ],
'properties' => [
'email' => [
'description' => __( 'Email associated with the link.', 'woocommerce-payments' ),
'type' => 'string',
'format' => 'email',
'context' => [ 'view' ],
],
],
],
],
];
}
}