19
19
*/
20
20
21
21
use PrestaShop \Module \PrestashopCheckout \CommandBus \CommandBusInterface ;
22
+ use PrestaShop \Module \PrestashopCheckout \CommandBus \QueryBusInterface ;
22
23
use PrestaShop \Module \PrestashopCheckout \Controller \AbstractFrontController ;
23
24
use PrestaShop \Module \PrestashopCheckout \Exception \PsCheckoutException ;
24
25
use PrestaShop \Module \PrestashopCheckout \Order \Command \CreateOrderCommand ;
@@ -48,9 +49,12 @@ class Ps_CheckoutPaymentModuleFrontController extends AbstractFrontController
48
49
*/
49
50
private $ paypalOrderId ;
50
51
52
+ private CommandBusInterface $ commandBus ;
53
+ private QueryBusInterface $ queryBus ;
54
+
51
55
public function checkAccess ()
52
56
{
53
- return $ this ->context ->customer && $ this ->context ->customer -> isLogged () && $ this -> context -> cart ;
57
+ return $ this ->context ->customer && $ this ->context ->cart ;
54
58
}
55
59
56
60
public function initContent ()
@@ -79,33 +83,42 @@ public function postProcess()
79
83
try {
80
84
$ this ->paypalOrderId = new PayPalOrderId ($ orderId );
81
85
86
+ $ this ->commandBus = $ this ->module ->getService ('ps_checkout.bus.command ' );
87
+ $ this ->queryBus = $ this ->module ->getService ('ps_checkout.bus.query ' );
88
+
82
89
/** @var PayPalOrderRepository $payPalOrderRepository */
83
90
$ payPalOrderRepository = $ this ->module ->getService (PayPalOrderRepository::class);
84
- /** @var PayPalOrderProvider $payPalOrderProvider */
85
- $ payPalOrderProvider = $ this ->module ->getService (PayPalOrderProvider::class);
86
- /** @var CommandBusInterface $commandBus */
87
- $ commandBus = $ this ->module ->getService ('ps_checkout.bus.command ' );
88
91
/** @var Symfony\Contracts\Cache\CacheInterface $payPalOrderCache */
89
92
$ payPalOrderCache = $ this ->module ->getService ('ps_checkout.cache.paypal.order ' );
90
93
91
94
$ payPalOrder = $ payPalOrderRepository ->getPayPalOrderById ($ this ->paypalOrderId );
92
95
96
+ $ orders = new PrestaShopCollection (Order::class);
97
+ $ orders ->where ('id_cart ' , '= ' , $ payPalOrder ->getIdCart ());
98
+
99
+ if ($ orders ->count ()) {
100
+ if ($ this ->context ->customer ->isLogged ()) {
101
+ $ this ->redirectToOrderHistoryPage ();
102
+ } else {
103
+ $ payPalOrderQueryResult = $ this ->getPayPalOrder ($ orderId );
104
+ $ payPalOrderFromCache = $ payPalOrderQueryResult ->getPayPalOrder ();
105
+
106
+ $ this ->redirectToOrderConfirmationPage ($ payPalOrder ->getIdCart (), $ payPalOrderFromCache ['purchase_units ' ][0 ]['payments ' ]['captures ' ][0 ]['id ' ], $ payPalOrderFromCache ['status ' ]);
107
+ }
108
+ }
109
+
93
110
if ($ payPalOrder ->getIdCart () !== $ this ->context ->cart ->id ) {
94
- throw new Exception ( ' PayPal order does not belong to this customer ' );
111
+ $ this -> redirectToOrderPage ( );
95
112
}
96
113
97
- $ payPalOrderFromCache = $ payPalOrderProvider ->getById ($ payPalOrder ->getId ()->getValue ());
114
+ $ payPalOrderQueryResult = $ this ->getPayPalOrder ($ orderId );
115
+ $ payPalOrderFromCache = $ payPalOrderQueryResult ->getPayPalOrder ();
98
116
99
117
if ($ payPalOrderFromCache ['status ' ] === 'COMPLETED ' ) {
100
118
$ this ->createOrder ($ payPalOrderFromCache , $ payPalOrder );
101
119
}
102
120
103
121
if ($ payPalOrderFromCache ['status ' ] === 'PAYER_ACTION_REQUIRED ' ) {
104
- // Delete from cache so when user is redirected from 3DS authentication page the order is fetched from PayPal
105
- if ($ payPalOrderCache ->hasItem ($ this ->paypalOrderId ->getValue ())) {
106
- $ payPalOrderCache ->delete ($ this ->paypalOrderId ->getValue ());
107
- }
108
-
109
122
$ this ->redirectTo3DSVerification ($ payPalOrderFromCache );
110
123
}
111
124
@@ -117,15 +130,21 @@ public function postProcess()
117
130
$ this ->redirectTo3DSVerification ($ payPalOrderFromCache );
118
131
break ;
119
132
case Card3DSecure::PROCEED :
120
- $ commandBus ->handle (new CapturePayPalOrderCommand ($ this -> paypalOrderId -> getValue () , array_keys ($ payPalOrderFromCache ['payment_source ' ])[0 ]));
121
- $ payPalOrderFromCache = $ payPalOrderCache ->get ($ this -> paypalOrderId -> getValue () );
133
+ $ this -> commandBus ->handle (new CapturePayPalOrderCommand ($ orderId , array_keys ($ payPalOrderFromCache ['payment_source ' ])[0 ]));
134
+ $ payPalOrderFromCache = $ payPalOrderCache ->get ($ orderId );
122
135
$ this ->createOrder ($ payPalOrderFromCache , $ payPalOrder );
123
136
break ;
124
137
case Card3DSecure::NO_DECISION :
125
138
default :
126
139
break ;
127
140
}
128
141
}
142
+
143
+ if ($ payPalOrderFromCache ['status ' ] === 'APPROVED ' ) {
144
+ $ this ->commandBus ->handle (new CapturePayPalOrderCommand ($ orderId , array_keys ($ payPalOrderFromCache ['payment_source ' ])[0 ]));
145
+ $ payPalOrderFromCache = $ payPalOrderCache ->get ($ orderId );
146
+ $ this ->createOrder ($ payPalOrderFromCache , $ payPalOrder );
147
+ }
129
148
} catch (Exception $ exception ) {
130
149
$ this ->context ->smarty ->assign ('error ' , $ exception ->getMessage ());
131
150
}
@@ -143,19 +162,14 @@ public function postProcess()
143
162
*/
144
163
private function createOrder ($ payPalOrderFromCache , $ payPalOrder )
145
164
{
146
- /** @var CommandBusInterface $commandBus */
147
- $ commandBus = $ this ->module ->getService ('ps_checkout.bus.command ' );
148
-
149
- $ capture = $ payPalOrderFromCache ['purchase_units ' ][0 ]['payments ' ]['captures ' ][0 ];
150
- if ($ capture ['status ' ] === 'COMPLETED ' ) {
151
- $ commandBus ->handle (new CreateOrderCommand ($ payPalOrder ->getId ()->getValue (), $ capture ));
152
- if ($ payPalOrder ->getPaymentTokenId () && $ payPalOrder ->checkCustomerIntent (PayPalOrder::CUSTOMER_INTENT_FAVORITE )) {
153
- /** @var PaymentTokenRepository $paymentTokenRepository */
154
- $ paymentTokenRepository = $ this ->module ->getService (PaymentTokenRepository::class);
155
- $ paymentTokenRepository ->setTokenFavorite ($ payPalOrder ->getPaymentTokenId ());
156
- }
157
- $ this ->redirectToOrderConfirmationPage ($ payPalOrder ->getIdCart (), $ capture ['id ' ], $ payPalOrderFromCache ['status ' ]);
165
+ $ capture = isset ($ payPalOrderFromCache ['purchase_units ' ][0 ]['payments ' ]['captures ' ][0 ]) ? $ payPalOrderFromCache ['purchase_units ' ][0 ]['payments ' ]['captures ' ][0 ] : null ;
166
+ $ this ->commandBus ->handle (new CreateOrderCommand ($ payPalOrder ->getId ()->getValue (), $ capture ));
167
+ if ($ payPalOrder ->getPaymentTokenId () && $ payPalOrder ->checkCustomerIntent (PayPalOrder::CUSTOMER_INTENT_FAVORITE )) {
168
+ /** @var PaymentTokenRepository $paymentTokenRepository */
169
+ $ paymentTokenRepository = $ this ->module ->getService (PaymentTokenRepository::class);
170
+ $ paymentTokenRepository ->setTokenFavorite ($ payPalOrder ->getPaymentTokenId ());
158
171
}
172
+ $ this ->redirectToOrderConfirmationPage ($ payPalOrder ->getIdCart (), $ capture ? $ capture ['id ' ] : null , $ payPalOrderFromCache ['status ' ]);
159
173
}
160
174
161
175
/**
@@ -218,4 +232,23 @@ private function redirectToOrderConfirmationPage($cartId, $captureId, $payPalOrd
218
232
));
219
233
}
220
234
}
235
+
236
+ /**
237
+ * @param string $orderId
238
+ *
239
+ * @return GetPayPalOrderForCheckoutCompletedQueryResult
240
+ *
241
+ * @throws PayPalOrderException
242
+ */
243
+ private function getPayPalOrder ($ orderId )
244
+ {
245
+ $ payPalOrderQuery = new GetPayPalOrderForCheckoutCompletedQuery ($ orderId );
246
+
247
+ return $ this ->queryBus ->handle ($ payPalOrderQuery );
248
+ }
249
+
250
+ private function redirectToOrderHistoryPage ()
251
+ {
252
+ Tools::redirect ($ this ->context ->link ->getPageLink ('history ' ));
253
+ }
221
254
}
0 commit comments