Add ApplePay checkout data mode settings option.

Refactor admin indentation.
This commit is contained in:
Pedro Silva 2023-11-08 18:07:19 +00:00
parent 0e59051815
commit 3a39bccc54
No known key found for this signature in database
GPG key ID: E2EE20C0669D24B3
6 changed files with 134 additions and 46 deletions

View file

@ -162,8 +162,8 @@ return array(
),
),
),
'applepay_button_domain_registration' => array(
'title' => str_repeat( ' ', 6 ) . __( 'Domain Registration', 'woocommerce-paypal-payments' ),
'applepay_button_domain_registration' => array(
'title' => __( 'Domain Registration', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' =>
'<a href="' . $domain_registration_url . '" class="button" target="_blank">'
@ -177,13 +177,14 @@ return array(
'Registering the website domain on the PayPal site is mandated by Apple. Payments will fail if the Apple Pay button is used on an unregistered domain.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
'applepay_button_domain_validation' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Domain Validation', 'woocommerce-paypal-payments' ),
'applepay_button_domain_validation' => array(
'title' => __( 'Domain Validation', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' => $domain_validation_text
. '<p class="description">'
@ -199,13 +200,14 @@ return array(
'Apple requires the website domain to be registered and validated. PayPal Payments automatically presents your domain association file for Apple to validate the manually registered domain.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
'applepay_button_device_eligibility' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Device Eligibility', 'woocommerce-paypal-payments' ),
'applepay_button_device_eligibility' => array(
'title' => __( 'Device Eligibility', 'woocommerce-paypal-payments' ),
'type' => 'ppcp-text',
'text' => $device_eligibility_text
. '<p class="description">'
@ -216,19 +218,21 @@ return array(
'Apple Pay demands certain Apple devices for secure payment execution. This helps determine if your current device is compliant.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
'applepay_button_type' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Button Label', 'woocommerce-paypal-payments' ),
'applepay_button_type' => array(
'title' => __( 'Button Label', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'This controls the label of the Apple Pay button.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'pay',
@ -237,8 +241,8 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
'applepay_button_color' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Button Color', 'woocommerce-paypal-payments' ),
'applepay_button_color' => array(
'title' => __( 'Button Color', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
@ -247,6 +251,7 @@ return array(
),
'label' => '',
'input_class' => array( 'wc-enhanced-select' ),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'default' => 'black',
'options' => PropertiesDictionary::button_colors(),
@ -254,14 +259,15 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
'applepay_button_language' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Button Language', 'woocommerce-paypal-payments' ),
'applepay_button_language' => array(
'title' => __( 'Button Language', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'The language and region used for the displayed Apple Pay button. The default value is the current language and region setting in a browser.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'en',
@ -270,6 +276,20 @@ return array(
'gateway' => 'paypal',
'requirements' => array(),
),
'applepay_checkout_data_mode' => array(
'title' => __( 'Send checkout billing and shipping data to Apple Pay', 'woocommerce-paypal-payments' ),
'type' => 'select',
'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'desc_tip' => true,
'description' => __( 'Using the WC form data increases convenience for the customers, but can cause issues if Apple Pay details do not match the billing and shipping data in the checkout form.', 'woocommerce-paypal-payments' ),
'default' => PropertiesDictionary::BILLING_DATA_MODE_DEFAULT,
'options' => PropertiesDictionary::billing_data_modes(),
'screens' => array( State::STATE_ONBOARDED ),
'gateway' => 'paypal',
'requirements' => array(),
),
)
);
},

View file

@ -132,7 +132,7 @@ class ApplepayButton {
const session = new ApplePaySession(4, paymentRequest)
session.begin()
if (this.buttonConfig.product.needShipping) {
if (this.shouldAllowShippingInButton()) {
session.onshippingmethodselected = this.onshippingmethodselected(session)
session.onshippingcontactselected = this.onshippingcontactselected(session)
}
@ -222,20 +222,50 @@ class ApplepayButton {
this.applePaySession(paymentDataRequest)
}
/**
* If the button should show the shipping fields.
*
* @returns {false|*}
*/
shouldAllowShippingInButton() {
return this.contextHandler.shippingAllowed()
&& this.buttonConfig.product.needShipping
&& (this.context !== 'checkout' || this.shouldAllowShippingInButton());
}
/**
* If the button should be updated with the form addresses.
*
* @returns {boolean}
*/
shouldUpdateButtonWithFormData() {
return this.ppcpConfig?.preferences?.checkout_data_mode === 'use_applepay';
}
update_request_data_with_form(paymentDataRequest) {
paymentDataRequest.billingContact = this.fill_billing_contact(this.form_saved);
// "applicationData" is originating a "PayPalApplePayError: An internal server error has occurred" on paypal.Applepay().confirmOrder().
//paymentDataRequest.applicationData = this.fill_application_data(this.form_saved);
if (!this.buttonConfig.product.needShipping) {
if (!this.shouldUpdateButtonWithFormData()) {
return;
}
// Add billing address.
paymentDataRequest.billingContact = this.fill_billing_contact(this.form_saved);
// Add custom data.
// "applicationData" is originating a "PayPalApplePayError: An internal server error has occurred" on paypal.Applepay().confirmOrder().
// paymentDataRequest.applicationData = this.fill_application_data(this.form_saved);
if (!this.shouldAllowShippingInButton()) {
return;
}
// Add shipping address.
paymentDataRequest.shippingContact = this.fill_shipping_contact(this.form_saved);
// Get shipping methods.
const rate = this.transactionInfo.chosenShippingMethods[0];
paymentDataRequest.shippingMethods = [];
// Add selected shipping method.
for (const shippingPackage of this.transactionInfo.shippingPackages) {
if (rate === shippingPackage.id) {
paymentDataRequest.shippingMethods.push({
@ -248,6 +278,7 @@ class ApplepayButton {
}
}
// Add other shipping methods.
for (const shippingPackage of this.transactionInfo.shippingPackages) {
if (rate !== shippingPackage.id) {
paymentDataRequest.shippingMethods.push({
@ -256,7 +287,6 @@ class ApplepayButton {
'amount' : shippingPackage.cost_str,
'identifier' : shippingPackage.id,
});
break;
}
}
@ -271,11 +301,11 @@ class ApplepayButton {
merchantCapabilities: applepayConfig.merchantCapabilities,
supportedNetworks: applepayConfig.supportedNetworks,
requiredShippingContactFields: ["postalAddress", "email", "phone"],
requiredBillingContactFields: ["postalAddress", "email", "phone"],
requiredBillingContactFields: ["postalAddress"],
}
if (!this.contextHandler.shippingAllowed()) {
baseRequest.requiredShippingContactFields = [];
if (!this.shouldAllowShippingInButton()) {
baseRequest.requiredShippingContactFields = ["email", "phone"];
}
const paymentDataRequest = Object.assign({}, baseRequest);
@ -429,7 +459,7 @@ class ApplepayButton {
caller_page: 'productDetail',
product_quantity: this.productQuantity,
simplified_contact: event.shippingContact,
need_shipping: this.buttonConfig.product.needShipping,
need_shipping: this.shouldAllowShippingInButton(),
'woocommerce-process-checkout-nonce': this.nonce,
};
case 'cart':
@ -441,7 +471,7 @@ class ApplepayButton {
action: 'ppcp_update_shipping_contact',
simplified_contact: event.shippingContact,
caller_page: 'cart',
need_shipping: this.buttonConfig.product.needShipping,
need_shipping: this.shouldAllowShippingInButton(),
'woocommerce-process-checkout-nonce': this.nonce,
};
}
@ -548,7 +578,7 @@ class ApplepayButton {
if (confirmOrderResponse.approveApplePayPayment.status === "APPROVED") {
try {
if (!this.contextHandler.shippingAllowed()) {
if (!this.shouldAllowShippingInButton()) {
// No shipping, expect immediate capture, ex: PayNow.
let approveFailed = false;

View file

@ -144,31 +144,35 @@ class DataToAppleButtonScripts {
$type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
$color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
$lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
$checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
'sdk_url' => $this->sdk_url,
'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
'button' => array(
'sdk_url' => $this->sdk_url,
'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
'preferences' => array(
'checkout_data_mode' => $checkout_data_mode,
),
'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
'type' => $type,
'color' => $color,
'lang' => $lang,
),
'product' => array(
'product' => array(
'needShipping' => $product_need_shipping,
'id' => $product_id,
'price' => $product_price,
'isVariation' => $is_variation,
'stock' => $product_stock,
),
'shop' => array(
'shop' => array(
'countryCode' => $shop_country_code,
'currencyCode' => $currency_code,
'totalLabel' => $total_label,
),
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'woocommerce-process_checkout' ),
'ajax_url' => admin_url( 'admin-ajax.php' ),
'nonce' => wp_create_nonce( 'woocommerce-process_checkout' ),
);
}
@ -191,14 +195,18 @@ class DataToAppleButtonScripts {
return array();
}
$type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
$color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
$lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
$lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
$type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
$color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
$lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
$lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
$checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
'sdk_url' => $this->sdk_url,
'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
'preferences' => array(
'checkout_data_mode' => $checkout_data_mode,
),
'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',
@ -235,14 +243,18 @@ class DataToAppleButtonScripts {
$currency_code,
$total_label
) {
$type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
$color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
$lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
$lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
$type = $this->settings->has( 'applepay_button_type' ) ? $this->settings->get( 'applepay_button_type' ) : '';
$color = $this->settings->has( 'applepay_button_color' ) ? $this->settings->get( 'applepay_button_color' ) : '';
$lang = $this->settings->has( 'applepay_button_language' ) ? $this->settings->get( 'applepay_button_language' ) : '';
$lang = apply_filters( 'woocommerce_paypal_payments_applepay_button_language', $lang );
$checkout_data_mode = $this->settings->has( 'applepay_checkout_data_mode' ) ? $this->settings->get( 'applepay_checkout_data_mode' ) : PropertiesDictionary::BILLING_DATA_MODE_DEFAULT;
return array(
'sdk_url' => $this->sdk_url,
'is_debug' => defined( 'WP_DEBUG' ) && WP_DEBUG ? true : false,
'preferences' => array(
'checkout_data_mode' => $checkout_data_mode,
),
'button' => array(
'wrapper' => 'applepay-container',
'mini_cart_wrapper' => 'applepay-container-minicart',

View file

@ -17,6 +17,10 @@ class PropertiesDictionary {
public const BILLING_CONTACT_INVALID = 'billing Contact Invalid';
public const BILLING_DATA_MODE_USE_WC = 'use_wc';
public const BILLING_DATA_MODE_USE_APPLEPAY = 'use_applepay';
public const BILLING_DATA_MODE_DEFAULT = self::BILLING_DATA_MODE_USE_WC;
public const CREATE_ORDER_SINGLE_PROD_REQUIRED_FIELDS =
array(
self::WCNONCE,
@ -186,4 +190,16 @@ class PropertiesDictionary {
'zh-TW' => __( 'Chinese (Traditional)', 'woocommerce-paypal-payments' ),
);
}
/**
* Returns the possible list of billing data modes.
*
* @return array
*/
public static function billing_data_modes(): array {
return array(
PropertiesDictionary::BILLING_DATA_MODE_USE_WC => __( 'Use WC checkout form data (do not show shipping address fields)', 'woocommerce-paypal-payments' ),
PropertiesDictionary::BILLING_DATA_MODE_USE_APPLEPAY => __( 'Do not use WC checkout form data (request billing and shipping addresses on Apple Pay)', 'woocommerce-paypal-payments' ),
);
}
}

View file

@ -135,13 +135,14 @@ return array(
),
),
'googlepay_button_type' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Button Label', 'woocommerce-paypal-payments' ),
'title' => __( 'Button Label', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'This controls the label of the Google Pay button.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'pay',
@ -151,7 +152,7 @@ return array(
'requirements' => array(),
),
'googlepay_button_color' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Button Color', 'woocommerce-paypal-payments' ),
'title' => __( 'Button Color', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
@ -160,6 +161,7 @@ return array(
),
'label' => '',
'input_class' => array( 'wc-enhanced-select' ),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'default' => 'black',
'options' => PropertiesDictionary::button_colors(),
@ -168,13 +170,14 @@ return array(
'requirements' => array(),
),
'googlepay_button_language' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Button Language', 'woocommerce-paypal-payments' ),
'title' => __( 'Button Language', 'woocommerce-paypal-payments' ),
'type' => 'select',
'desc_tip' => true,
'description' => __(
'The language and region used for the displayed Google Pay button. The default value is the current language and region setting in a browser.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'class' => array(),
'input_class' => array( 'wc-enhanced-select' ),
'default' => 'en',
@ -184,13 +187,14 @@ return array(
'requirements' => array(),
),
'googlepay_button_shipping_enabled' => array(
'title' => str_repeat( '&nbsp;', 6 ) . __( 'Shipping Callback', 'woocommerce-paypal-payments' ),
'title' => __( 'Shipping Callback', 'woocommerce-paypal-payments' ),
'type' => 'checkbox',
'desc_tip' => true,
'description' => __(
'Synchronizes your available shipping options with Google Pay. Enabling this may impact the buyer experience.',
'woocommerce-paypal-payments'
),
'classes' => array('ppcp-field-indent'),
'label' => __( 'Enable Google Pay shipping callback', 'woocommerce-paypal-payments' ),
'default' => 'no',
'screens' => array( State::STATE_ONBOARDED ),

View file

@ -9,3 +9,9 @@
filter: grayscale(100%);
opacity: 0.5;
}
.ppcp-field-indent {
th {
padding-left: 20px;
}
}