From ad32a4ff21937cc4f7a88cd37281a769e515e487 Mon Sep 17 00:00:00 2001
From: Pedro Silva
Date: Tue, 31 Oct 2023 10:35:29 +0000
Subject: [PATCH] Add PayNow support to ApplePay
---
.../resources/js/ApplepayButton.js | 60 +++++++++++++++----
.../resources/js/Context/BaseHandler.js | 39 ++++++------
.../js/Context/ContextHandlerFactory.js | 4 +-
.../resources/js/Context/PayNowHandler.js | 35 +++++++++++
.../js/Context/SingleProductHandler.js | 13 +---
5 files changed, 109 insertions(+), 42 deletions(-)
create mode 100644 modules/ppcp-applepay/resources/js/Context/PayNowHandler.js
diff --git a/modules/ppcp-applepay/resources/js/ApplepayButton.js b/modules/ppcp-applepay/resources/js/ApplepayButton.js
index 15615d7ee..2c1b6fb4c 100644
--- a/modules/ppcp-applepay/resources/js/ApplepayButton.js
+++ b/modules/ppcp-applepay/resources/js/ApplepayButton.js
@@ -244,6 +244,11 @@ class ApplepayButton {
requiredShippingContactFields: ["postalAddress", "email", "phone"],
requiredBillingContactFields: ["postalAddress", "email", "phone"],
}
+
+ if (!this.contextHandler.shippingAllowed()) {
+ baseRequest.requiredShippingContactFields = [];
+ }
+
const paymentDataRequest = Object.assign({}, baseRequest);
paymentDataRequest.currencyCode = buttonConfig.shop.currencyCode;
paymentDataRequest.total = {
@@ -508,18 +513,53 @@ class ApplepayButton {
if (confirmOrderResponse && confirmOrderResponse.approveApplePayPayment) {
if (confirmOrderResponse.approveApplePayPayment.status === "APPROVED") {
try {
- let data = {
- billing_contact: event.payment.billingContact,
- shipping_contact: event.payment.shippingContact,
- paypal_order_id: id,
- };
- let authorizationResult = await processInWooAndCapture(data);
- if (authorizationResult.result === "success") {
- session.completePayment(ApplePaySession.STATUS_SUCCESS)
- window.location.href = authorizationResult.redirect
+
+ if (!this.contextHandler.shippingAllowed()) {
+ // No shipping, expect immediate capture, ex: PayNow.
+
+ let approveFailed = false;
+ await this.contextHandler.approveOrder({
+ orderID: id
+ }, { // actions mock object.
+ restart: () => new Promise((resolve, reject) => {
+ approveFailed = true;
+ resolve();
+ }),
+ order: {
+ get: () => new Promise((resolve, reject) => {
+ resolve(null);
+ })
+ }
+ });
+
+ if (!approveFailed) {
+ this.log('onpaymentauthorized approveOrder OK');
+ session.completePayment(ApplePaySession.STATUS_SUCCESS);
+ } else {
+ this.log('onpaymentauthorized approveOrder FAIL');
+ session.completePayment(ApplePaySession.STATUS_FAILURE);
+ session.abort()
+ console.error(error);
+ }
+
} else {
- session.completePayment(ApplePaySession.STATUS_FAILURE)
+ // Default payment.
+
+ let data = {
+ billing_contact: event.payment.billingContact,
+ shipping_contact: event.payment.shippingContact,
+ paypal_order_id: id,
+ };
+ let authorizationResult = await processInWooAndCapture(data);
+ if (authorizationResult.result === "success") {
+ session.completePayment(ApplePaySession.STATUS_SUCCESS)
+ window.location.href = authorizationResult.redirect
+ } else {
+ session.completePayment(ApplePaySession.STATUS_FAILURE)
+ }
+
}
+
} catch (error) {
session.completePayment(ApplePaySession.STATUS_FAILURE);
session.abort()
diff --git a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
index dea7de698..f08c2d6a1 100644
--- a/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/BaseHandler.js
@@ -1,8 +1,6 @@
import ErrorHandler from "../../../../ppcp-button/resources/js/modules/ErrorHandler";
import CartActionHandler
from "../../../../ppcp-button/resources/js/modules/ActionHandler/CartActionHandler";
-import onApprove
- from "../../../../ppcp-button/resources/js/modules/OnApproveHandler/onApproveForContinue";
class BaseHandler {
@@ -11,6 +9,10 @@ class BaseHandler {
this.ppcpConfig = ppcpConfig;
}
+ shippingAllowed() {
+ return true;
+ }
+
transactionInfo() {
return new Promise((resolve, reject) => {
@@ -42,30 +44,25 @@ class BaseHandler {
}
createOrder() {
- const errorHandler = new ErrorHandler(
- this.ppcpConfig.labels.error.generic,
- document.querySelector('.woocommerce-notices-wrapper')
- );
-
- const actionHandler = new CartActionHandler(
- this.ppcpConfig,
- errorHandler,
- );
-
- return actionHandler.configuration().createOrder(null, null);
+ return this.actionHandler().configuration().createOrder(null, null);
}
- approveOrderForContinue(data, actions) {
- const errorHandler = new ErrorHandler(
+ approveOrder(data, actions) {
+ return this.actionHandler().configuration().onApprove(data, actions);
+ }
+
+ actionHandler() {
+ return new CartActionHandler(
+ this.ppcpConfig,
+ this.errorHandler(),
+ );
+ }
+
+ errorHandler() {
+ return new ErrorHandler(
this.ppcpConfig.labels.error.generic,
document.querySelector('.woocommerce-notices-wrapper')
);
-
- let onApproveHandler = onApprove({
- config: this.ppcpConfig
- }, errorHandler);
-
- return onApproveHandler(data, actions);
}
}
diff --git a/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js b/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js
index 72ee4f5fa..04338354b 100644
--- a/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js
+++ b/modules/ppcp-applepay/resources/js/Context/ContextHandlerFactory.js
@@ -4,6 +4,7 @@ import CheckoutHandler from "./CheckoutHandler";
import CartBlockHandler from "./CartBlockHandler";
import CheckoutBlockHandler from "./CheckoutBlockHandler";
import MiniCartHandler from "./MiniCartHandler";
+import PayNowHandler from "./PayNowHandler";
class ContextHandlerFactory {
@@ -14,8 +15,9 @@ class ContextHandlerFactory {
case 'cart':
return new CartHandler(buttonConfig, ppcpConfig);
case 'checkout':
- case 'pay-now': // same as checkout
return new CheckoutHandler(buttonConfig, ppcpConfig);
+ case 'pay-now':
+ return new PayNowHandler(buttonConfig, ppcpConfig);
case 'mini-cart':
return new MiniCartHandler(buttonConfig, ppcpConfig);
case 'cart-block':
diff --git a/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js b/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js
new file mode 100644
index 000000000..add275608
--- /dev/null
+++ b/modules/ppcp-applepay/resources/js/Context/PayNowHandler.js
@@ -0,0 +1,35 @@
+import Spinner from "../../../../ppcp-button/resources/js/modules/Helper/Spinner";
+import BaseHandler from "./BaseHandler";
+import CheckoutActionHandler
+ from "../../../../ppcp-button/resources/js/modules/ActionHandler/CheckoutActionHandler";
+
+class PayNowHandler extends BaseHandler {
+
+ shippingAllowed() {
+ return false;
+ }
+
+ transactionInfo() {
+ return new Promise(async (resolve, reject) => {
+ const data = this.ppcpConfig['pay_now'];
+
+ resolve({
+ countryCode: data.country_code,
+ currencyCode: data.currency_code,
+ totalPriceStatus: 'FINAL',
+ totalPrice: data.total_str
+ });
+ });
+ }
+
+ actionHandler() {
+ return new CheckoutActionHandler(
+ this.ppcpConfig,
+ this.errorHandler(),
+ new Spinner()
+ );
+ }
+
+}
+
+export default PayNowHandler;
diff --git a/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js b/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js
index ddb7ad531..a014f2ae6 100644
--- a/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js
+++ b/modules/ppcp-applepay/resources/js/Context/SingleProductHandler.js
@@ -48,23 +48,16 @@ class SingleProductHandler extends BaseHandler {
});
}
- createOrder() {
- const errorHandler = new ErrorHandler(
- this.ppcpConfig.labels.error.generic,
- document.querySelector('.woocommerce-notices-wrapper')
- );
-
- const actionHandler = new SingleProductActionHandler(
+ actionHandler() {
+ return new SingleProductActionHandler(
this.ppcpConfig,
new UpdateCart(
this.ppcpConfig.ajax.change_cart.endpoint,
this.ppcpConfig.ajax.change_cart.nonce,
),
document.querySelector('form.cart'),
- errorHandler,
+ this.errorHandler(),
);
-
- return actionHandler.configuration().createOrder();
}
}