Skip to content

Commit 7c9e536

Browse files
committed
capture strategies (direct, manual, upon delivery) support
1 parent 82f2e7a commit 7c9e536

3 files changed

Lines changed: 51 additions & 20 deletions

File tree

out/src/js/paypal-dev.js

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717
}
1818

1919
this.setCreatePayPalOrderResponse = function (response) {
20-
debugger
2120
if (null !== this.currentOrder.paypal) {
2221
//some order is currently ...
2322
//@TODO check if this part is needed. Its the case that pay button is clicked twice (maybe its impossible)
@@ -171,6 +170,17 @@
171170
window.location = PayPalPayment.getConfigValue('shopThankYouPageUrl');
172171
}
173172

173+
this.handlePaymentAuthorization = async function (details) {
174+
PayPalPayment.setCreatePayPalOrderResponse(details);
175+
const {paypalOrderDetails} = await PayPalPayment.patchOrder(details);
176+
177+
if (paypalOrderDetails?.payment_source) {
178+
await PayPalPayment.vaultPayment(paypalOrderDetails);
179+
}
180+
181+
window.location = PayPalPayment.getConfigValue('shopThankYouPageUrl');
182+
}
183+
174184
this.captureOrder = async function (data, actions) {
175185
PayPalPayment.setCreatePayPalOrderResponse(data);
176186
return actions.order.capture().then(await PayPalPayment.afterCaptureOrder);
@@ -189,10 +199,6 @@
189199
window.location = PayPalPayment.getConfigValue('shopOrderErrorUrl');
190200
}
191201

192-
this.handlePaymentAuthorization = function (details) {
193-
debugger
194-
}
195-
196202
this.renderButton = function () {
197203
let button = paypal.Buttons(PayPalPayment.getPayButtonSettings());
198204

@@ -210,15 +216,15 @@
210216
onError: PayPalPayment.handleError
211217
};
212218

213-
if (PayPalPayment.config.captureStrategy === 'directly'){
219+
if (PayPalPayment.config.captureStrategy === 'CAPTURE'){
214220
buttonSettings.onApprove = PayPalPayment.captureOrder;
215221
}
216222

217223
return buttonSettings;
218224
}
219225

220-
this.backendRequest = async function (url, headers, body) {
221-
let response = await fetch(PayPalPayment.getConfigValue(url), {
226+
this.backendRequest = async function (urlSlug, headers, body) {
227+
let response = await fetch(PayPalPayment.getConfigValue(urlSlug), {
222228
method: 'post',
223229
headers: Object.assign({
224230
'content-type': 'application/json',

src/Controller/AjaxPaymentController.php

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
use OxidEsales\EshopCommunity\Application\Model\User;
1414
use OxidEsales\EshopCommunity\Core\Field;
1515
use OxidSolutionCatalysts\PayPal\Model\PayPalOrder;
16+
use OxidSolutionCatalysts\PayPal\Service\ModuleSettings;
1617
use OxidSolutionCatalysts\PayPal\Service\Payment as PaymentService;
1718
use OxidSolutionCatalysts\PayPal\Traits\JsonTrait;
1819
use OxidSolutionCatalysts\PayPal\Traits\ServiceContainer;
@@ -69,6 +70,7 @@ public function patchShopOrder(): void
6970
$cancelSession = !$sessionShopOrderId || $shopOrderId !== $sessionShopOrderId;
7071

7172
$paymentService = $this->getServiceFromContainer(PaymentService::class);
73+
$moduleSettings = $this->getServiceFromContainer(ModuleSettings::class);
7274

7375
/** @var \OxidEsales\EshopCommunity\Application\Model\User $oUser */
7476
$oUser = oxNew(User::class);
@@ -87,18 +89,36 @@ public function patchShopOrder(): void
8789
$paymentsId = (string) $oOrder->getFieldData('oxpaymenttype');
8890
/** @var PayPalApiOrder $payPalOrder */
8991
$payPalOrder = $paymentService->fetchOrderFields($payPalOrderId, '');
90-
if ($oOrder->isPayPalOrderCompleted($payPalOrder)) {
91-
$oOrder->markOrderPaid();
92-
$transactionId = (string)$payPalOrder->purchase_units[0]->payments->captures[0]->id;
93-
$oOrder->setTransId($transactionId);
94-
$paymentService->trackPayPalOrder(
95-
$shopOrderId,
96-
$payPalOrderId,
97-
$paymentsId,
98-
PayPalApiOrder::STATUS_COMPLETED,
99-
$transactionId
100-
);
101-
} else {
92+
$captureStrategy = $moduleSettings->getPayPalStandardCaptureStrategy();
93+
94+
try {
95+
if ($captureStrategy === 'directly'){
96+
if ($oOrder->isPayPalOrderCompleted($payPalOrder)) {
97+
$oOrder->markOrderPaid();
98+
$transactionId = (string)$payPalOrder->purchase_units[0]->payments->captures[0]->id;
99+
$oOrder->setTransId($transactionId);
100+
$paymentService->trackPayPalOrder(
101+
$shopOrderId,
102+
$payPalOrderId,
103+
$paymentsId,
104+
PayPalApiOrder::STATUS_COMPLETED,
105+
$transactionId
106+
);
107+
}
108+
}
109+
110+
//capture after shipment or manual
111+
if ($captureStrategy !== 'directly'){
112+
$oOrder->setOrderStatus('NOT_FINISHED');
113+
//prepare capture tracking
114+
$paymentService->trackPayPalOrder(
115+
$oOrder->getId(),
116+
$payPalOrderId,
117+
$paymentsId,
118+
PayPalApiOrder::STATUS_APPROVED
119+
);
120+
}
121+
} catch (\Exception $e){
102122
$this->outputJson([
103123
'status' => 'error',
104124
'message' => 'Order completion error.', //@TODO improve errors messages

src/Model/Order.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -564,6 +564,11 @@ public function setOrderNumber(): void
564564
}
565565
}
566566

567+
public function setOrderStatus($sStatus): void
568+
{
569+
$this->_setOrderStatus($sStatus);
570+
}
571+
567572
public function isOrderFinished(): bool
568573
{
569574
return 'OK' === $this->getFieldData('oxtransstatus');

0 commit comments

Comments
 (0)