@@ -55,7 +55,15 @@ public enum State {
5555 */
5656 REQUEST_PAYMENT_AUTHORIZATION_TOKEN ,
5757 /**
58- * Payment was received by the backend and we are waiting for confirmation of the payment provider
58+ * Checkout was received and we wait for confirmation by the supervisor
59+ */
60+ WAIT_FOR_SUPERVISOR ,
61+ /**
62+ * Checkout was received and we wait for confirmation by the gatekeeper
63+ */
64+ WAIT_FOR_GATEKEEPER ,
65+ /**
66+ * Payment was received by the backend and we are waiting for confirmation by the payment provider
5967 */
6068 WAIT_FOR_APPROVAL ,
6169 /**
@@ -158,15 +166,15 @@ public void abort() {
158166 * was cancelled
159167 */
160168 public void abort (boolean error ) {
161- cancelOutstandingCalls ();
162-
163169 if (state != Checkout .State .PAYMENT_APPROVED
164170 && state != Checkout .State .DENIED_BY_PAYMENT_PROVIDER
165171 && state != Checkout .State .DENIED_BY_SUPERVISOR
166172 && checkoutProcess != null ) {
167173 checkoutApi .abort (checkoutProcess , new CheckoutApi .PaymentAbortResult () {
168174 @ Override
169175 public void success () {
176+ cancelOutstandingCalls ();
177+
170178 synchronized (Checkout .this ) {
171179 if (error ) {
172180 notifyStateChanged (Checkout .State .PAYMENT_PROCESSING_ERROR );
@@ -236,13 +244,6 @@ public void reset() {
236244 shop = null ;
237245 }
238246
239- public void resume () {
240- if (lastState == Checkout .State .WAIT_FOR_APPROVAL || lastState == State .REQUEST_PAYMENT_AUTHORIZATION_TOKEN ) {
241- notifyStateChanged (Checkout .State .WAIT_FOR_APPROVAL );
242- pollForResult ();
243- }
244- }
245-
246247 public boolean isAvailable () {
247248 return project .getCheckoutUrl () != null && project .isCheckoutAvailable ();
248249 }
@@ -397,22 +398,6 @@ public void success(CheckoutApi.CheckoutProcessResponse checkoutProcessResponse,
397398 rawCheckoutProcess = rawResponse ;
398399
399400 if (!handleProcessResponse ()) {
400- boolean allChecksOk = areAllChecksSucceeded (checkoutProcessResponse );
401-
402- if (allChecksOk ) {
403- if (checkoutProcessResponse .paymentState == CheckoutApi .State .PROCESSING ) {
404- Logger .d ("Processing payment..." );
405- notifyStateChanged (Checkout .State .PAYMENT_PROCESSING );
406- } else {
407- Logger .d ("Waiting for approval..." );
408- if (paymentMethod != PaymentMethod .GOOGLE_PAY ) {
409- notifyStateChanged (Checkout .State .WAIT_FOR_APPROVAL );
410- }
411- }
412- } else {
413- notifyStateChanged (Checkout .State .WAIT_FOR_APPROVAL );
414- }
415-
416401 if (!paymentMethod .isOfflineMethod ()) {
417402 scheduleNextPoll ();
418403 }
@@ -457,7 +442,7 @@ private boolean areAllChecksSucceeded(CheckoutApi.CheckoutProcessResponse checko
457442
458443 if (checkoutProcessResponse .checks != null ) {
459444 for (CheckoutApi .Check check : checkoutProcessResponse .checks ) {
460- if (check .state == CheckoutApi .State .FAILED ) {
445+ if (check .state != CheckoutApi .State .SUCCESSFUL ) {
461446 return false ;
462447 }
463448
@@ -493,6 +478,30 @@ private boolean areAllChecksSucceeded(CheckoutApi.CheckoutProcessResponse checko
493478 return allChecksOk ;
494479 }
495480
481+ private boolean hasAnyCheckFailed (CheckoutApi .CheckoutProcessResponse checkoutProcessResponse ) {
482+ if (checkoutProcessResponse .checks != null ) {
483+ for (CheckoutApi .Check check : checkoutProcessResponse .checks ) {
484+ if (check .state == CheckoutApi .State .FAILED ) {
485+ return true ;
486+ }
487+ }
488+ }
489+
490+ return false ;
491+ }
492+
493+ private boolean hasAnyFulfillmentAllocationFailed () {
494+ if (checkoutProcess .fulfillments != null ) {
495+ for (CheckoutApi .Fulfillment fulfillment : checkoutProcess .fulfillments ) {
496+ if (fulfillment .state == FulfillmentState .ALLOCATION_FAILED || fulfillment .state == FulfillmentState .ALLOCATION_TIMED_OUT ) {
497+ return true ;
498+ }
499+ }
500+ }
501+
502+ return false ;
503+ }
504+
496505 private boolean hasStillPendingChecks (CheckoutApi .CheckoutProcessResponse checkoutProcessResponse ) {
497506 if (checkoutProcessResponse .checks != null ) {
498507 for (CheckoutApi .Check check : checkoutProcessResponse .checks ) {
@@ -569,6 +578,8 @@ private void pollForResult() {
569578
570579 Logger .d ("Polling for approval state..." );
571580
581+ Logger .d ("RoutingTarget = " + getRoutingTarget ());
582+
572583 checkoutApi .updatePaymentProcess (checkoutProcess , new CheckoutApi .PaymentProcessResult () {
573584 @ Override
574585 public void success (CheckoutApi .CheckoutProcessResponse checkoutProcessResponse , String rawResponse ) {
@@ -589,6 +600,8 @@ public void error() {
589600 });
590601
591602 if (state == Checkout .State .WAIT_FOR_APPROVAL
603+ || state == State .WAIT_FOR_GATEKEEPER
604+ || state == State .WAIT_FOR_SUPERVISOR
592605 || state == State .VERIFYING_PAYMENT_METHOD
593606 || state == State .REQUEST_PAYMENT_AUTHORIZATION_TOKEN
594607 || state == Checkout .State .PAYMENT_PROCESSING
@@ -608,6 +621,18 @@ private boolean handleProcessResponse() {
608621 return true ;
609622 }
610623
624+ if (state == State .VERIFYING_PAYMENT_METHOD ) {
625+ if (checkoutProcess .routingTarget == CheckoutApi .RoutingTarget .SUPERVISOR ) {
626+ notifyStateChanged (State .WAIT_FOR_SUPERVISOR );
627+ } else if (checkoutProcess .routingTarget == CheckoutApi .RoutingTarget .GATEKEEPER ) {
628+ notifyStateChanged (State .WAIT_FOR_GATEKEEPER );
629+ } else {
630+ notifyStateChanged (State .WAIT_FOR_APPROVAL );
631+ }
632+
633+ return false ;
634+ }
635+
611636 String authorizePaymentUrl = checkoutProcess .getAuthorizePaymentLink ();
612637 if (authorizePaymentUrl != null ) {
613638 if (authorizePaymentRequestFailed ) {
@@ -651,11 +676,12 @@ private boolean handleProcessResponse() {
651676 return false ;
652677 }
653678
654- if (hasStillPendingChecks (checkoutProcess )) {
655- notifyStateChanged (State .WAIT_FOR_APPROVAL );
679+ if (hasAnyFulfillmentAllocationFailed ()) {
680+ notifyStateChanged (State .PAYMENT_ABORTED );
681+ return true ;
656682 }
657683
658- if (! areAllChecksSucceeded (checkoutProcess )) {
684+ if (hasAnyCheckFailed (checkoutProcess )) {
659685 Logger .d ("Payment denied by supervisor" );
660686 shoppingCart .generateNewUUID ();
661687 notifyStateChanged (Checkout .State .DENIED_BY_SUPERVISOR );
@@ -708,6 +734,7 @@ public List<Coupon> getRedeemedCoupons() {
708734 public void approveOfflineMethod () {
709735 if (paymentMethod != null && paymentMethod .isOfflineMethod ()
710736 || paymentMethod == PaymentMethod .CUSTOMERCARD_POS ) {
737+ shoppingCart .generateNewUUID ();
711738 approve ();
712739 }
713740 }
@@ -787,6 +814,14 @@ public int getVerifiedOnlinePrice() {
787814 return -1 ;
788815 }
789816
817+ public CheckoutApi .RoutingTarget getRoutingTarget () {
818+ if (checkoutProcess != null && checkoutProcess .routingTarget != null ) {
819+ return checkoutProcess .routingTarget ;
820+ }
821+
822+ return CheckoutApi .RoutingTarget .NONE ;
823+ }
824+
790825 public List <Product > getInvalidProducts () {
791826 return invalidProducts ;
792827 }
0 commit comments