Add save payment method attributes to PayPal payment source

This commit is contained in:
Emili Castells Guasch 2023-10-19 16:15:20 +02:00
parent 08280fa138
commit 99d05ca44d
6 changed files with 81 additions and 17 deletions

View file

@ -61,6 +61,8 @@ class UserIdToken {
/**
* Returns `id_token` which uniquely identifies the payer.
*
* @return string
*
* @throws PayPalApiException If the request fails.
* @throws RuntimeException If something unexpected happens.
*/

View file

@ -260,26 +260,25 @@ class OrderEndpoint {
);
throw $error;
}
$json = json_decode( $response['body'] );
$status_code = (int) wp_remote_retrieve_response_code( $response );
if ( 201 !== $status_code ) {
if ( ! in_array( $status_code, array( 200, 201 ), true ) ) {
$error = new PayPalApiException(
$json,
$status_code
);
$this->logger->log(
'warning',
$this->logger->warning(
sprintf(
'Failed to create order. PayPal API response: %1$s',
$error->getMessage()
),
array(
'args' => $args,
'response' => $response,
)
);
throw $error;
}
$order = $this->order_factory->from_paypal_response( $json );
do_action( 'woocommerce_paypal_payments_paypal_order_created', $order );

View file

@ -15,14 +15,15 @@ use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
* Class OrderStatus
*/
class OrderStatus {
const INTERNAL = 'INTERNAL';
const CREATED = 'CREATED';
const SAVED = 'SAVED';
const APPROVED = 'APPROVED';
const VOIDED = 'VOIDED';
const COMPLETED = 'COMPLETED';
const PENDING_APPROVAL = 'PENDING_APPROVAL';
const VALID_STATUS = array(
const INTERNAL = 'INTERNAL';
const CREATED = 'CREATED';
const SAVED = 'SAVED';
const APPROVED = 'APPROVED';
const VOIDED = 'VOIDED';
const COMPLETED = 'COMPLETED';
const PENDING_APPROVAL = 'PENDING_APPROVAL';
const PAYER_ACTION_REQUIRED = 'PAYER_ACTION_REQUIRED';
const VALID_STATUS = array(
self::INTERNAL,
self::CREATED,
self::SAVED,
@ -30,6 +31,7 @@ class OrderStatus {
self::VOIDED,
self::COMPLETED,
self::PENDING_APPROVAL,
self::PAYER_ACTION_REQUIRED,
);
/**

View file

@ -48,7 +48,13 @@ export const loadPaypalScript = (config, onLoaded) => {
return;
}
// Load PayPal script
// Adds data-user-id-token to script options.
const userIdToken = config.save_payment_methods.id_token;
if(userIdToken) {
scriptOptions['data-user-id-token'] = userIdToken;
}
// Load PayPal script.
loadScript(scriptOptions).then(callback);
}

View file

@ -1060,7 +1060,8 @@ class SmartButton implements SmartButtonInterface {
}
$this->request_data->dequeue_nonce_fix();
return $localize;
return apply_filters( 'woocommerce_paypal_payments_localized_script_data', $localize );
}
/**

View file

@ -9,6 +9,10 @@ declare(strict_types=1);
namespace WooCommerce\PayPalCommerce\SavePaymentMethods;
use Psr\Log\LoggerInterface;
use WooCommerce\PayPalCommerce\ApiClient\Authentication\UserIdToken;
use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider;
use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface;
use WooCommerce\PayPalCommerce\Vendor\Interop\Container\ServiceProviderInterface;
@ -36,5 +40,55 @@ class SavePaymentMethodsModule implements ModuleInterface {
if ( ! $c->get( 'save-payment-methods.eligible' ) ) {
return;
}
// Adds `id_token` to localized script data.
add_filter(
'woocommerce_paypal_payments_localized_script_data',
function( array $localized_script_data ) use ( $c ) {
$api = $c->get( 'api.user-id-token' );
assert( $api instanceof UserIdToken );
try {
$id_token = $api->id_token();
$localized_script_data['save_payment_methods'] = array(
'id_token' => $id_token,
);
$localized_script_data['data_client_id']['set_attribute'] = false;
} catch ( RuntimeException $exception ) {
$logger = $c->get( 'woocommerce.logger.woocommerce' );
assert( $logger instanceof LoggerInterface );
$error = $exception->getMessage();
if ( is_a( $exception, PayPalApiException::class ) ) {
$error = $exception->get_details( $error );
}
$logger->error( $error );
}
return $localized_script_data;
}
);
// Adds attributes needed to save payment method.
add_filter(
'ppcp_create_order_request_body_data',
function( $data ) {
$data['payment_source'] = array(
'paypal' => array(
'attributes' => array(
'vault' => array(
'store_in_vault' => 'ON_SUCCESS',
'usage_type' => 'MERCHANT',
),
),
),
);
return $data;
}
);
}
}