Skip to content

Commit 910065c

Browse files
committed
card fields wip, crash at capture
1 parent f3a5827 commit 910065c

3 files changed

Lines changed: 134 additions & 43 deletions

File tree

out/src/js/paypal-dev.js

Lines changed: 62 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,14 @@
2121
};
2222

2323
this.setShopOrderData = async function (response, orderType) {
24-
if (response.status === 'success') {
25-
if (null !== this.currentOrder.shop) {
26-
await PayPalPayment.deleteOrder().then(function (data) {
27-
PayPalPayment.resetCurrentOrder();
28-
});
29-
}
30-
31-
PayPalPayment.currentOrder[orderType] = response;
32-
PayPalPayment.config.purchaseUnits.custom_id = response.customId;
24+
if (null !== this.currentOrder.shop) {
25+
await PayPalPayment.deleteOrder().then(function (data) {
26+
PayPalPayment.resetCurrentOrder();
27+
});
3328
}
29+
30+
PayPalPayment.currentOrder[orderType] = response;
31+
PayPalPayment.config.purchaseUnits.custom_id = response.customId;
3432
};
3533

3634
this.getCurrentOrderData = function (name, orderType) {
@@ -114,6 +112,10 @@
114112
PayPalPayment.setShopOrderData(data.detail, 'shop');
115113
};
116114

115+
this.onPayPalOrderCreated = function (data) {
116+
PayPalPayment.setCreatePayPalOrderResponse(data.detail);
117+
};
118+
117119
this.vaultingSettingSwitch = function (e) {
118120
PayPalPayment.currentOrder.vaultPayment = e.currentTarget.checked;
119121
};
@@ -123,26 +125,43 @@
123125

124126
window.onload = function (e) {
125127
const savePaymentChackbox = document.getElementById('oscPayPalVaultPaymentCheckbox');
128+
if (savePaymentChackbox) {
126129
savePaymentChackbox.onclick = PayPalPayment.vaultingSettingSwitch;
130+
}
127131
};
128132

129133
document.addEventListener('shopOrderCreated', this.onShopOrderCreated);
134+
document.addEventListener('payPalOrderCreated', this.onPayPalOrderCreated);
130135

131136
return this;
132137
};
133138

139+
this.createACDCOrder = async function (data, actions) {
140+
let result = await PayPalPayment.backendRequest('shopACDCOrderCreationStatusUrl', {}, {
141+
'deliveryAddressId': PayPalPayment.getConfigValue('deliveryAddressId')
142+
});
143+
144+
document.dispatchEvent(new CustomEvent('shopOrderCreated', new Object({detail: {...result.shopOrder}})));
145+
document.dispatchEvent(new CustomEvent('payPalOrderCreated', new Object({detail: {...result.payPalOrder}})));
146+
147+
return result.payPalOrder.id
148+
}
149+
150+
this.captureACDCOrder = async function (data, actions) {
151+
debugger
152+
153+
const capture = await actions.order.capture();
154+
debugger
155+
PayPalPayment.afterCaptureACDCOrder();
156+
}
157+
134158
this.createOrder = async function (data, actions) {
135159
let result = await PayPalPayment.backendRequest('shopOrderCreationStatusUrl', {}, {
136160
'deliveryAddressId': PayPalPayment.getConfigValue('deliveryAddressId')
137161
});
138162

139163
document.dispatchEvent(new CustomEvent('shopOrderCreated', new Object({detail: {...result}})));
140164

141-
const paymentId = PayPalPayment.getConfigValue('paymentId');
142-
if (paymentId === 'oscpaypal_acdc'){
143-
debugger
144-
}
145-
146165
return actions.order.create(PayPalPayment.getPurchaseUnits());
147166
};
148167

@@ -191,6 +210,11 @@
191210
});
192211
};
193212

213+
this.afterCaptureACDCOrder = function (details) {
214+
debugger
215+
window.location = PayPalPayment.getConfigValue('shopThankYouPageUrl');
216+
};
217+
194218
this.afterCaptureOrder = async function (details) {
195219
const {paypalOrderDetails} = await PayPalPayment.patchOrder(details);
196220

@@ -202,6 +226,7 @@
202226
};
203227

204228
this.handlePaymentAuthorization = async function (details) {
229+
debugger
205230
PayPalPayment.setCreatePayPalOrderResponse(details);
206231
const {paypalOrderDetails} = await PayPalPayment.patchOrder(details);
207232

@@ -258,7 +283,7 @@
258283
return;
259284
}
260285

261-
const cardField = paypal.CardFields({
286+
const cardFields = paypal.CardFields({
262287
style: {
263288
'input': {
264289
'color': '#3A3A3A',
@@ -275,47 +300,44 @@
275300
'color': 'red'
276301
}
277302
},
278-
createOrder: PayPalPayment.createOrder,
279-
onApprove: PayPalPayment.handlePaymentAuthorization,
303+
createOrder: PayPalPayment.createACDCOrder,
304+
onApprove: PayPalPayment.captureACDCOrder,
280305
onError: PayPalPayment.handleError
281306
});
282307

283-
if (cardField.isEligible()) {
284-
const cardNameContainer = document.getElementById("card-name-field-container"); // Optional field
308+
if (cardFields.isEligible()) {
309+
const cardNameContainer = document.getElementById("card-name-field-container");
285310
const cardNumberContainer = document.getElementById("card-number-field-container");
286311
const cardCvvContainer = document.getElementById("card-cvv-field-container");
287312
const cardExpiryContainer = document.getElementById("card-expiry-field-container");
288-
const multiCardFieldButton = document.getElementById(
313+
const submitButton = document.getElementById(
289314
PayPalPayment.getConfigValue('buttonSelector').split('#').reverse()[0]
290315
);
291316

292-
const nameField = cardField.NameField();
293-
nameField.render(cardNameContainer);
294-
const numberField = cardField.NumberField();
295-
numberField.render(cardNumberContainer);
296-
const cvvField = cardField.CVVField();
297-
cvvField.render(cardCvvContainer);
298-
const expiryField = cardField.ExpiryField();
299-
expiryField.render(cardExpiryContainer);
300-
// Add click listener to the submit button and call the submit function on the CardField component
301-
multiCardFieldButton.addEventListener("click", () => {
302-
cardField
303-
.submit()
304-
.then(() => {
305-
debugger
306-
// Handle a successful payment
307-
})
308-
.catch((err) => {
309-
debugger
310-
// Handle an unsuccessful payment
317+
if (cardNameContainer) {
318+
cardFields.NameField().render(cardNameContainer);
319+
}
320+
if (cardNumberContainer) {
321+
cardFields.NumberField().render(cardNumberContainer);
322+
}
323+
if (cardCvvContainer) {
324+
cardFields.CVVField().render(cardCvvContainer);
325+
}
326+
if (cardExpiryContainer) {
327+
cardFields.ExpiryField().render(cardExpiryContainer);
328+
}
329+
if (submitButton) {
330+
submitButton.addEventListener("click", () => {
331+
cardFields.submit().catch(err => {
332+
console.error('Error submitting card fields:', err);
311333
});
312334
});
313335
}
336+
}
314337
};
315338

316339
this.getPayButtonSettings = function () {
317340
const buttonSettings = {
318-
displayOnly: ["vaultable", "card"],
319341
createOrder: PayPalPayment.createOrder,
320342
onApprove: PayPalPayment.handlePaymentAuthorization,
321343
onCancel: PayPalPayment.deleteOrder,

src/Controller/AjaxPaymentController.php

Lines changed: 70 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,15 @@
77

88
namespace OxidSolutionCatalysts\PayPal\Controller;
99

10+
use Exception;
1011
use JsonException;
1112
use OxidEsales\Eshop\Application\Model\Order;
1213
use OxidEsales\Eshop\Core\Registry;
1314
use OxidEsales\EshopCommunity\Application\Model\User;
1415
use OxidEsales\EshopCommunity\Core\Field;
16+
use OxidSolutionCatalysts\PayPal\Core\Constants;
17+
use OxidSolutionCatalysts\PayPal\Core\PayPalSession;
18+
use OxidSolutionCatalysts\PayPal\Model\Order as PayPalOrderModel;
1519
use OxidSolutionCatalysts\PayPal\Model\PayPalOrder;
1620
use OxidSolutionCatalysts\PayPal\Service\Logger;
1721
use OxidSolutionCatalysts\PayPal\Service\ModuleSettings;
@@ -34,6 +38,66 @@ public function __construct()
3438
$this->logger = $this->getServiceFromContainer(Logger::class);
3539
}
3640

41+
42+
/**
43+
* @psalm-suppress InternalMethod
44+
*/
45+
public function createAcdcOrder(): void
46+
{
47+
$data = $this->getRequestParameters();
48+
$_POST['sDeliveryAddressMD5'] = $data['deliveryAddressId'];
49+
$paymentService = $this->getServiceFromContainer(PaymentService::class);
50+
/** @var Logger $logger */
51+
$logger = $this->getServiceFromContainer(Logger::class);
52+
$order = oxNew(Order::class);
53+
$user = oxNew(User::class);
54+
$basket = Registry::getSession()->getBasket();
55+
56+
if (!$user->loadActiveUser()) {
57+
$this->permissionsCheck();
58+
}
59+
60+
Registry::getSession()->setVariable('sess_challenge', Registry::getUtilsObject()->generateUID());
61+
try {
62+
//finalizing ordering process (validating, storing order into DB, executing payment, setting status ...)
63+
$iSuccess = $order->finalizePayPalOrder($basket, $user);
64+
65+
// performing special actions after user finishes order (assignment to special user groups)
66+
$user->onOrderExecute($basket, $iSuccess);
67+
} catch (Exception $exception) {
68+
$logger->log('error', $exception->getMessage(), [$exception]);
69+
$this->outputJson(['acdcerror' => 'failed to execute shop order']);
70+
return;
71+
}
72+
73+
$response = $paymentService->doCreatePatchedOrder(
74+
Registry::getSession()->getBasket()
75+
);
76+
77+
if (!($paypalOrderId = $response['id'])) {
78+
$this->outputJson(['acdcerror' => 'cannot create paypal order']);
79+
return;
80+
}
81+
82+
$sessionOrderId = (string)Registry::getSession()->getVariable('sess_challenge');
83+
$payPalOrder = $paymentService->getPayPalCheckoutOrder($sessionOrderId, $paypalOrderId);
84+
$payPalOrder->setStatus($response['status']);
85+
$payPalOrder->save();
86+
87+
//currently needed for dev, IDK if that necessary at the end
88+
PayPalSession::unsetPayPalOrderId();
89+
Registry::getSession()->setVariable('sess_challenge', null);
90+
91+
$this->outputJson([
92+
'status' => 'success',
93+
'shopOrder' => [
94+
'shopOrderId' => $order->oxorder__oxid->value,
95+
'customId' => $paymentService->getCustomIdParameter($order)
96+
],
97+
'payPalOrder' => $response,
98+
]);
99+
}
100+
37101
/**
38102
*
39103
* TODO implement error reporting from front to log file
@@ -60,7 +124,10 @@ public function logError(): void
60124
public function permissionsCheck(
61125
?string $shopOrderId = null,
62126
?string $message = 'Operation not permitted'
63-
): void {
127+
): void
128+
{
129+
//@TODO ad session challenge somewhere
130+
64131
$user = oxNew(User::class);
65132
$user->loadActiveUser();
66133

@@ -144,7 +211,7 @@ public function patchShopOrder(): void
144211
'message' => 'Order id mismatch error.', //@TODO improve errors messages
145212
]);
146213
}
147-
$paymentsId = (string) $oOrder->getFieldData('oxpaymenttype');
214+
$paymentsId = (string)$oOrder->getFieldData('oxpaymenttype');
148215
/** @var PayPalApiOrder $payPalOrder */
149216
$payPalOrder = $paymentService->fetchOrderFields($payPalOrderId, '');
150217
$captureStrategy = $moduleSettings->getPayPalStandardCaptureStrategy();
@@ -242,7 +309,7 @@ public function updateOxUserWithPayPalCustomerId(): void
242309
$data = $this->getRequestParameters();
243310
$user = $this->getUser();
244311

245-
if (! $user->loadActiveUser()) {
312+
if (!$user->loadActiveUser()) {
246313
$this->permissionsCheck();
247314
}
248315

views/tpl/shared/layout/base_paypal_payment_controller_config.tpl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
[{if isset($oView) && isset($oViewConf)}]
22
[{if method_exists($oView, 'getPayment') && method_exists($oViewConf, 'getPayPalCheckoutConfig')}]
3+
[{assign var="sToken" value=$oViewConf->getSessionChallengeToken()}]
34
[{assign var="payment" value=$oView->getPayment()}]
45
[{assign var="paymentId" value=$payment->getId()}]
56
[{assign var="sSelfLink" value=$oViewConf->getSslSelfLink()|replace:"&":"&"}]
@@ -13,6 +14,7 @@
1314
return {
1415
shopOrderErrorUrl: '[{$sSelfLink|cat:"cl=ajaxpay&fnc=logError&aid="|cat:$aid|cat:"&stoken="|cat:$sToken}][{if $isSandBox}]&XDEBUG_SESSION=PHPSTORM[{/if}]',
1516
shopOrderCreationStatusUrl: '[{$sSelfLink|cat:"cl=ajaxpay&fnc=createShopOrder&aid="|cat:$aid|cat:"&stoken="|cat:$sToken}][{if $isSandBox}]&XDEBUG_SESSION=PHPSTORM[{/if}]',
17+
shopACDCOrderCreationStatusUrl: '[{$sSelfLink|cat:"cl=ajaxpay&fnc=createAcdcOrder&aid="|cat:$aid|cat:"&stoken="|cat:$sToken}][{if $isSandBox}]&XDEBUG_SESSION=PHPSTORM[{/if}]',
1618
shopOrderPatchingStatusUrl: '[{$sSelfLink|cat:"cl=ajaxpay&fnc=patchShopOrder&aid="|cat:$aid|cat:"&stoken="|cat:$sToken}][{if $isSandBox}]&XDEBUG_SESSION=PHPSTORM[{/if}]',
1719
shopOrderDeleteUrl: '[{$sSelfLink|cat:"cl=ajaxpay&fnc=deleteShopOrder&aid="|cat:$aid|cat:"&stoken="|cat:$sToken}][{if $isSandBox}]&XDEBUG_SESSION=PHPSTORM[{/if}]',
1820
payPalOrderDetailsUrl: '[{$sSelfLink|cat:"cl=ajaxpay&fnc=fetchPayPalOrderDetails&aid="|cat:$aid|cat:"&stoken="|cat:$sToken}][{if $isSandBox}]&XDEBUG_SESSION=PHPSTORM[{/if}]',

0 commit comments

Comments
 (0)