Use ExperienceContext for PayPal buttons

This commit is contained in:
Alex P. 2025-05-29 16:34:25 +03:00
parent c19b89ed5b
commit 279a3452c8
No known key found for this signature in database
GPG key ID: 54487A734A204D71
5 changed files with 58 additions and 6 deletions

View file

@ -227,6 +227,7 @@ return array(
$request_data,
$purchase_unit_factory,
$container->get( 'api.factory.shipping-preference' ),
$container->get( 'wcgateway.builder.experience-context' ),
$order_endpoint,
$payer_factory,
$session_handler,

View file

@ -19,9 +19,11 @@ use WooCommerce\PayPalCommerce\ApiClient\Entity\ApplicationContext;
use WooCommerce\PayPalCommerce\ApiClient\Entity\Money;
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
use WooCommerce\PayPalCommerce\ApiClient\Entity\Payer;
use WooCommerce\PayPalCommerce\ApiClient\Entity\PaymentSource;
use WooCommerce\PayPalCommerce\ApiClient\Entity\PurchaseUnit;
use WooCommerce\PayPalCommerce\ApiClient\Exception\PayPalApiException;
use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
use WooCommerce\PayPalCommerce\ApiClient\Factory\ExperienceContextBuilder;
use WooCommerce\PayPalCommerce\ApiClient\Factory\PayerFactory;
use WooCommerce\PayPalCommerce\ApiClient\Factory\PurchaseUnitFactory;
use WooCommerce\PayPalCommerce\ApiClient\Factory\ShippingPreferenceFactory;
@ -66,6 +68,11 @@ class CreateOrderEndpoint implements EndpointInterface {
*/
private $shipping_preference_factory;
/**
* The ExperienceContextBuilder.
*/
private ExperienceContextBuilder $experience_context_builder;
/**
* The order endpoint.
*
@ -177,6 +184,7 @@ class CreateOrderEndpoint implements EndpointInterface {
* @param RequestData $request_data The RequestData object.
* @param PurchaseUnitFactory $purchase_unit_factory The PurchaseUnit factory.
* @param ShippingPreferenceFactory $shipping_preference_factory The shipping_preference factory.
* @param ExperienceContextBuilder $experience_context_builder The ExperienceContextBuilder.
* @param OrderEndpoint $order_endpoint The OrderEndpoint object.
* @param PayerFactory $payer_factory The PayerFactory object.
* @param SessionHandler $session_handler The SessionHandler object.
@ -194,6 +202,7 @@ class CreateOrderEndpoint implements EndpointInterface {
RequestData $request_data,
PurchaseUnitFactory $purchase_unit_factory,
ShippingPreferenceFactory $shipping_preference_factory,
ExperienceContextBuilder $experience_context_builder,
OrderEndpoint $order_endpoint,
PayerFactory $payer_factory,
SessionHandler $session_handler,
@ -211,6 +220,7 @@ class CreateOrderEndpoint implements EndpointInterface {
$this->request_data = $request_data;
$this->purchase_unit_factory = $purchase_unit_factory;
$this->shipping_preference_factory = $shipping_preference_factory;
$this->experience_context_builder = $experience_context_builder;
$this->api_endpoint = $order_endpoint;
$this->payer_factory = $payer_factory;
$this->session_handler = $session_handler;
@ -475,6 +485,15 @@ class CreateOrderEndpoint implements EndpointInterface {
}
}
$payment_source = new PaymentSource(
'paypal',
(object) array(
'experience_context' => $this->experience_context_builder
->with_default_paypal_config( $shipping_preference, $action )
->build()->to_array(),
)
);
try {
return $this->api_endpoint->create(
array( $this->purchase_unit ),
@ -482,7 +501,8 @@ class CreateOrderEndpoint implements EndpointInterface {
$payer,
$action,
$payment_method,
$data
$data,
$payment_source
);
} catch ( PayPalApiException $exception ) {
// Looks like currently there is no proper way to validate the shipping address for PayPal,
@ -502,7 +522,11 @@ class CreateOrderEndpoint implements EndpointInterface {
return $this->api_endpoint->create(
array( $this->purchase_unit ),
$shipping_preference,
$payer
$payer,
$action,
$payment_method,
$data,
$payment_source
);
}