mirror of
https://github.com/woocommerce/woocommerce-paypal-payments.git
synced 2025-09-06 09:08:09 +08:00
Merge pull request #1980 from woocommerce/PCP-1685-store-three-d-secure-enrollment-status-and-authentication-status-responses-in-wc-order
Store three d secure enrollment status and authentication status responses in wc order (1685)
This commit is contained in:
commit
53c2c96b8c
11 changed files with 249 additions and 51 deletions
|
@ -51,6 +51,8 @@ class PayPalGateway extends \WC_Payment_Gateway {
|
|||
const FEES_META_KEY = '_ppcp_paypal_fees';
|
||||
const REFUND_FEES_META_KEY = '_ppcp_paypal_refund_fees';
|
||||
const REFUNDS_META_KEY = '_ppcp_refunds';
|
||||
const THREE_D_AUTH_RESULT_META_KEY = '_ppcp_paypal_3DS_auth_result';
|
||||
const FRAUD_RESULT_META_KEY = '_ppcp_paypal_fraud_result';
|
||||
|
||||
/**
|
||||
* The Settings Renderer.
|
||||
|
|
|
@ -0,0 +1,147 @@
|
|||
<?php
|
||||
/**
|
||||
* Common operations performed for handling the ACDC order info.
|
||||
*
|
||||
* @package WooCommerce\PayPalCommerce\WcGateway\Processor
|
||||
*/
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace WooCommerce\PayPalCommerce\WcGateway\Processor;
|
||||
|
||||
use WC_Order;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\FraudProcessorResponse;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Order;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Factory\CardAuthenticationResultFactory;
|
||||
use WooCommerce\PayPalCommerce\WcGateway\Gateway\PayPalGateway;
|
||||
|
||||
/**
|
||||
* Trait CreditCardOrderInfoHandlingTrait.
|
||||
*/
|
||||
trait CreditCardOrderInfoHandlingTrait {
|
||||
|
||||
/**
|
||||
* Handles the 3DS details.
|
||||
*
|
||||
* Adds the order note with 3DS details.
|
||||
* Adds the order meta with 3DS details.
|
||||
*
|
||||
* @param Order $order The PayPal order.
|
||||
* @param WC_Order $wc_order The WC order.
|
||||
*/
|
||||
protected function handle_three_d_secure(
|
||||
Order $order,
|
||||
WC_Order $wc_order
|
||||
): void {
|
||||
|
||||
$payment_source = $order->payment_source();
|
||||
if ( ! $payment_source || $payment_source->name() !== 'card' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$authentication_result = $payment_source->properties()->authentication_result ?? null;
|
||||
$card_brand = $payment_source->properties()->brand ?? __( 'N/A', 'woocommerce-paypal-payments' );
|
||||
|
||||
if ( $authentication_result ) {
|
||||
$card_authentication_result_factory = new CardAuthenticationResultFactory();
|
||||
$result = $card_authentication_result_factory->from_paypal_response( $authentication_result );
|
||||
|
||||
$three_d_response_order_note_title = __( '3DS authentication result', 'woocommerce-paypal-payments' );
|
||||
/* translators: %1$s is 3DS order note title, %2$s is 3DS order note result markup */
|
||||
$three_d_response_order_note_format = __( '%1$s %2$s', 'woocommerce-paypal-payments' );
|
||||
$three_d_response_order_note_result_format = '<ul class="ppcp_3ds_result">
|
||||
<li>%1$s</li>
|
||||
<li>%2$s</li>
|
||||
<li>%3$s</li>
|
||||
<li>%4$s</li>
|
||||
</ul>';
|
||||
$three_d_response_order_note_result = sprintf(
|
||||
$three_d_response_order_note_result_format,
|
||||
/* translators: %s is liability shift */
|
||||
sprintf( __( 'Liability Shift: %s', 'woocommerce-paypal-payments' ), esc_html( $result->liability_shift() ) ),
|
||||
/* translators: %s is enrollment status */
|
||||
sprintf( __( 'Enrollment Status: %s', 'woocommerce-paypal-payments' ), esc_html( $result->enrollment_status() ) ),
|
||||
/* translators: %s is authentication status */
|
||||
sprintf( __( 'Authentication Status: %s', 'woocommerce-paypal-payments' ), esc_html( $result->authentication_result() ) ),
|
||||
/* translators: %s is card brand */
|
||||
sprintf( __( 'Card Brand: %s', 'woocommerce-paypal-payments' ), esc_html( $card_brand ) )
|
||||
);
|
||||
$three_d_response_order_note = sprintf(
|
||||
$three_d_response_order_note_format,
|
||||
esc_html( $three_d_response_order_note_title ),
|
||||
wp_kses_post( $three_d_response_order_note_result )
|
||||
);
|
||||
|
||||
$wc_order->add_order_note( $three_d_response_order_note );
|
||||
|
||||
$meta_details = array_merge( $result->to_array(), array( 'card_brand' => $card_brand ) );
|
||||
$wc_order->update_meta_data( PayPalGateway::THREE_D_AUTH_RESULT_META_KEY, $meta_details );
|
||||
$wc_order->save_meta_data();
|
||||
|
||||
/**
|
||||
* Fired when the 3DS information is added to WC order.
|
||||
*/
|
||||
do_action( 'woocommerce_paypal_payments_thee_d_secure_added', $wc_order, $order );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the fraud processor response details.
|
||||
*
|
||||
* Adds the order note with the fraud processor response details.
|
||||
* Adds the order meta with the fraud processor response details.
|
||||
*
|
||||
* @param FraudProcessorResponse $fraud The fraud processor response (AVS, CVV ...).
|
||||
* @param Order $order The PayPal order.
|
||||
* @param WC_Order $wc_order The WC order.
|
||||
*/
|
||||
protected function handle_fraud( FraudProcessorResponse $fraud, Order $order, WC_Order $wc_order ): void {
|
||||
$payment_source = $order->payment_source();
|
||||
if ( ! $payment_source || $payment_source->name() !== 'card' ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$fraud_responses = $fraud->to_array();
|
||||
$avs_response_order_note_title = __( 'Address Verification Result', 'woocommerce-paypal-payments' );
|
||||
/* translators: %1$s is AVS order note title, %2$s is AVS order note result markup */
|
||||
$avs_response_order_note_format = __( '%1$s %2$s', 'woocommerce-paypal-payments' );
|
||||
$avs_response_order_note_result_format = '<ul class="ppcp_avs_result">
|
||||
<li>%1$s</li>
|
||||
<ul class="ppcp_avs_result_inner">
|
||||
<li>%2$s</li>
|
||||
<li>%3$s</li>
|
||||
</ul>
|
||||
</ul>';
|
||||
$avs_response_order_note_result = sprintf(
|
||||
$avs_response_order_note_result_format,
|
||||
/* translators: %s is fraud AVS code */
|
||||
sprintf( __( 'AVS: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['avs_code'] ) ),
|
||||
/* translators: %s is fraud AVS address match */
|
||||
sprintf( __( 'Address Match: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['address_match'] ) ),
|
||||
/* translators: %s is fraud AVS postal match */
|
||||
sprintf( __( 'Postal Match: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['postal_match'] ) )
|
||||
);
|
||||
$avs_response_order_note = sprintf(
|
||||
$avs_response_order_note_format,
|
||||
esc_html( $avs_response_order_note_title ),
|
||||
wp_kses_post( $avs_response_order_note_result )
|
||||
);
|
||||
$wc_order->add_order_note( $avs_response_order_note );
|
||||
|
||||
$cvv_response_order_note_format = '<ul class="ppcp_cvv_result"><li>%1$s</li></ul>';
|
||||
$cvv_response_order_note = sprintf(
|
||||
$cvv_response_order_note_format,
|
||||
/* translators: %s is fraud CVV match */
|
||||
sprintf( __( 'CVV2 Match: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['cvv_match'] ) )
|
||||
);
|
||||
$wc_order->add_order_note( $cvv_response_order_note );
|
||||
|
||||
$wc_order->update_meta_data( PayPalGateway::FRAUD_RESULT_META_KEY, $fraud_responses );
|
||||
$wc_order->save_meta_data();
|
||||
|
||||
/**
|
||||
* Fired when the fraud result information is added to WC order.
|
||||
*/
|
||||
do_action( 'woocommerce_paypal_payments_fraud_result_added', $wc_order, $order );
|
||||
}
|
||||
}
|
|
@ -112,6 +112,10 @@ trait PaymentsStatusHandlingTrait {
|
|||
'on-hold',
|
||||
__( 'Awaiting payment.', 'woocommerce-paypal-payments' )
|
||||
);
|
||||
/**
|
||||
* Fired when PayPal order is authorized.
|
||||
*/
|
||||
do_action( 'woocommerce_paypal_payments_order_authorized', $wc_order, $authorization );
|
||||
break;
|
||||
case AuthorizationStatus::DENIED:
|
||||
$wc_order->update_status(
|
||||
|
|
|
@ -11,10 +11,11 @@ namespace WooCommerce\PayPalCommerce\WcGateway;
|
|||
|
||||
use Psr\Log\LoggerInterface;
|
||||
use Throwable;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Entity\Authorization;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Exception\RuntimeException;
|
||||
use WooCommerce\PayPalCommerce\ApiClient\Helper\Cache;
|
||||
use WooCommerce\PayPalCommerce\WcGateway\Endpoint\RefreshFeatureStatusEndpoint;
|
||||
use WooCommerce\PayPalCommerce\WcSubscriptions\Helper\SubscriptionHelper;
|
||||
use WooCommerce\PayPalCommerce\WcGateway\Processor\CreditCardOrderInfoHandlingTrait;
|
||||
use WooCommerce\PayPalCommerce\Vendor\Dhii\Container\ServiceProvider;
|
||||
use WooCommerce\PayPalCommerce\Vendor\Dhii\Modular\Module\ModuleInterface;
|
||||
use WC_Order;
|
||||
|
@ -56,6 +57,8 @@ use WooCommerce\PayPalCommerce\Vendor\Psr\Container\ContainerInterface;
|
|||
*/
|
||||
class WCGatewayModule implements ModuleInterface {
|
||||
|
||||
use CreditCardOrderInfoHandlingTrait;
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
@ -92,7 +95,7 @@ class WCGatewayModule implements ModuleInterface {
|
|||
|
||||
add_action(
|
||||
'woocommerce_paypal_payments_order_captured',
|
||||
function ( WC_Order $wc_order, Capture $capture ) {
|
||||
function ( WC_Order $wc_order, Capture $capture ) use ( $c ) {
|
||||
$breakdown = $capture->seller_receivable_breakdown();
|
||||
if ( $breakdown ) {
|
||||
$wc_order->update_meta_data( PayPalGateway::FEES_META_KEY, $breakdown->to_array() );
|
||||
|
@ -104,43 +107,34 @@ class WCGatewayModule implements ModuleInterface {
|
|||
$wc_order->save_meta_data();
|
||||
}
|
||||
|
||||
$order = $c->get( 'session.handler' )->order();
|
||||
if ( ! $order ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$fraud = $capture->fraud_processor_response();
|
||||
if ( $fraud ) {
|
||||
$fraud_responses = $fraud->to_array();
|
||||
$avs_response_order_note_title = __( 'Address Verification Result', 'woocommerce-paypal-payments' );
|
||||
/* translators: %1$s is AVS order note title, %2$s is AVS order note result markup */
|
||||
$avs_response_order_note_format = __( '%1$s %2$s', 'woocommerce-paypal-payments' );
|
||||
$avs_response_order_note_result_format = '<ul class="ppcp_avs_result">
|
||||
<li>%1$s</li>
|
||||
<ul class="ppcp_avs_result_inner">
|
||||
<li>%2$s</li>
|
||||
<li>%3$s</li>
|
||||
</ul>
|
||||
</ul>';
|
||||
$avs_response_order_note_result = sprintf(
|
||||
$avs_response_order_note_result_format,
|
||||
/* translators: %s is fraud AVS code */
|
||||
sprintf( __( 'AVS: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['avs_code'] ) ),
|
||||
/* translators: %s is fraud AVS address match */
|
||||
sprintf( __( 'Address Match: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['address_match'] ) ),
|
||||
/* translators: %s is fraud AVS postal match */
|
||||
sprintf( __( 'Postal Match: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['postal_match'] ) )
|
||||
);
|
||||
$avs_response_order_note = sprintf(
|
||||
$avs_response_order_note_format,
|
||||
esc_html( $avs_response_order_note_title ),
|
||||
wp_kses_post( $avs_response_order_note_result )
|
||||
);
|
||||
$wc_order->add_order_note( $avs_response_order_note );
|
||||
|
||||
$cvv_response_order_note_format = '<ul class="ppcp_cvv_result"><li>%1$s</li></ul>';
|
||||
$cvv_response_order_note = sprintf(
|
||||
$cvv_response_order_note_format,
|
||||
/* translators: %s is fraud CVV match */
|
||||
sprintf( __( 'CVV2 Match: %s', 'woocommerce-paypal-payments' ), esc_html( $fraud_responses['cvv_match'] ) )
|
||||
);
|
||||
$wc_order->add_order_note( $cvv_response_order_note );
|
||||
$this->handle_fraud( $fraud, $order, $wc_order );
|
||||
}
|
||||
$this->handle_three_d_secure( $order, $wc_order );
|
||||
},
|
||||
10,
|
||||
2
|
||||
);
|
||||
|
||||
add_action(
|
||||
'woocommerce_paypal_payments_order_authorized',
|
||||
function ( WC_Order $wc_order, Authorization $authorization ) use ( $c ) {
|
||||
$order = $c->get( 'session.handler' )->order();
|
||||
if ( ! $order ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$fraud = $authorization->fraud_processor_response();
|
||||
if ( $fraud ) {
|
||||
$this->handle_fraud( $fraud, $order, $wc_order );
|
||||
}
|
||||
$this->handle_three_d_secure( $order, $wc_order );
|
||||
},
|
||||
10,
|
||||
2
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue