Skip to content

Commit 0df2f96

Browse files
Merge pull request #28 from CyberSource/v25.2.0
release V25.2.0
2 parents 86bf5ac + fe33420 commit 0df2f96

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1184
-1113
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,3 +2,4 @@ int_cybersource_sfra/node_modules
22
int_cybersource_sfra/.vscode
33
**/dw.json
44
node_modules
5+
.DS_Store

README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33

44
* **Description:** Cybersource, a Visa solution, is the only global, modular payment management platform built on secure Visa infrastructure with the payment reach and fraud insights of a massive $500B+ global processing network. You can find out more about what Cybersource does [here](https://www.cybersource.com/en-gb.html).
55
* **Categories:** Payment Processing, Fraud Detection, Address Validation, Tax Computation
6-
* **Version:** 25.1.0
6+
* **Version:** 25.2.0
77
* **Compatibility:** <span style="color:red">This version of the Cybersource cartridge is not compatible with versions of SFRA higher than Release 7.0.0. </span>
8-
This version can be found on the Master branch of the SFRA repository at commit 50ee82face6e0a000f649a51f162e8a3f171531c [50ee82f] on December , 2024 <span style="color:red">This version is compatible with Salesforce B2C Commerce 22.2 release. <span>
8+
This version can be found on the Master branch of the SFRA repository on May , 2025 <span style="color:red">This version is compatible with Salesforce B2C Commerce 22.2 release. <span>
99

1010
----
1111

cartridges/int_cybersource_sfra/README.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,11 @@ THe Cybersource cartridge has a link cartridge (`int_cybersource_sfra`) provided
66

77
# Getting Started
88

9-
1 Set node version to 8.11.3
9+
1 Set node version to 18.19.0
1010

1111
2 Clone this repository.
1212

13-
3 Run `npm install` to install all of the local dependencies (node version 8.x or current LTS release recommended)
13+
3 Run `npm install` to install all of the local dependencies (node version 18.x or current LTS release recommended)
1414

1515
4 Run `npm run compile:js` from the command line that would compile all client-side JS files. Run `npm run compile:scss` and `npm run compile:fonts` that would do the same for css and fonts.
1616

cartridges/int_cybersource_sfra/cartridge/client/default/custom/cybersource-custom.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,8 @@ var init = {
208208
$(document).on('click', '.billingAgreementExpressCheckout', function (e) {
209209
e.preventDefault();
210210
var paypalcallback = document.getElementById('paypal_callback').value;
211-
paypalcallback = encodeURIComponent(paypalcallback);
212-
if(init.verifyUrl(decodeURIComponent(paypalcallback))){
211+
var encodedePaypalcallback = encodeURIComponent(paypalcallback);
212+
if(init.verifyUrl(decodeURIComponent(encodedePaypalcallback))){
213213
var form = $('<form action="' + paypalcallback + '" method="post">'
214214
+ '</form>');
215215
$('body').append(form);

cartridges/int_cybersource_sfra/cartridge/client/default/scss/cyber-source.scss

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,12 @@
7171
.billing-agreement-container {
7272
white-space:nowrap;
7373
}
74+
.billingAgreementExpressCheckout {
75+
display: block;
76+
margin: 0 auto;
77+
max-width: 100%;
78+
height: auto;
79+
}
7480
.checkout-continue{
7581
position: relative;
7682
box-shadow : none;

cartridges/int_cybersource_sfra/cartridge/controllers/COPlaceOrder.js

Lines changed: 7 additions & 161 deletions
Original file line numberDiff line numberDiff line change
@@ -11,167 +11,13 @@ var COHelpers = require('*/cartridge/scripts/checkout/checkoutHelpers');
1111
var OrderModel = require('*/cartridge/models/order');
1212
var csrfProtection = require('*/cartridge/scripts/middleware/csrf');
1313

14-
/**
15-
* function
16-
* @param {*} args args
17-
* @returns {*} obj
18-
*/
19-
function failOrder(args) {
20-
var Cybersource = require('*/cartridge/scripts/Cybersource');
21-
var orderResult = Cybersource.GetOrder(args.Order);
22-
if (orderResult.error) {
23-
// eslint-disable-next-line
24-
args.PlaceOrderError = orderResult.PlaceOrderError;
25-
return args;
26-
}
27-
var order = orderResult.Order;
28-
var PlaceOrderError = args.PlaceOrderError != null ? args.PlaceOrderError : new dw.system.Status(dw.system.Status.ERROR, 'confirm.error.declined', 'Payment Declined');
29-
session.privacy.SkipTaxCalculation = false;
30-
var failResult = dw.system.Transaction.wrap(function () {
31-
OrderMgr.failOrder(order, true);
32-
return {
33-
error: true,
34-
PlaceOrderError: PlaceOrderError
35-
};
36-
});
37-
if (failResult.error) {
38-
// eslint-disable-next-line
39-
args.PlaceOrderError = failResult.PlaceOrderError;
40-
}
41-
return args;
42-
}
43-
44-
/**
45-
* Create Order and set to NOT CONFIRMED
46-
* @param {*} orderId orderId
47-
* @param {*} req req
48-
* @param {*} res res
49-
* @param {*} next next
50-
* @returns {*} obj
51-
*/
52-
function reviewOrder(orderId, req, res, next) {
53-
var currentBasket = BasketMgr.getCurrentBasket();
54-
var order = OrderMgr.getOrder(orderId);
55-
var fraudDetectionStatus = HookMgr.callHook('app.fraud.detection', 'fraudDetection', currentBasket);
56-
var Transaction = require('dw/system/Transaction');
57-
58-
if (fraudDetectionStatus.status === 'fail') {
59-
Transaction.wrap(function () { OrderMgr.failOrder(order, true); });
60-
// fraud detection failed
61-
req.session.privacyCache.set('fraudDetectionStatus', true);
62-
res.redirect(URLUtils.https('Error-ErrorCode', 'err', fraudDetectionStatus.errorCode));
63-
return next();
64-
}
65-
66-
COHelpers.sendConfirmationEmail(order, req.locale.id);
67-
68-
// Set Order confirmation status to NOT CONFIRMED
69-
var Order = require('dw/order/Order');
70-
Transaction.wrap(function () {
71-
order.setConfirmationStatus(Order.CONFIRMATION_STATUS_NOTCONFIRMED);
72-
});
73-
74-
// Reset usingMultiShip after successful Order placement
75-
req.session.privacyCache.set('usingMultiShipping', false);
76-
res.redirect(URLUtils.https('COPlaceOrder-SubmitOrderConformation', 'ID', order.orderNo, 'token', order.orderToken));
77-
return next();
78-
}
79-
80-
/**
81-
* Submit the order and send order confirmation email
82-
* @param {*} orderId orderId
83-
* @param {*} req req
84-
* @param {*} res res
85-
* @param {*} next next
86-
* @returns {*} obj
87-
*/
88-
function submitOrder(orderId, req, res, next) {
89-
var currentBasket = BasketMgr.getCurrentBasket();
90-
var order = OrderMgr.getOrder(orderId);
91-
var fraudDetectionStatus = HookMgr.callHook('app.fraud.detection', 'fraudDetection', currentBasket);
92-
var Transaction = require('dw/system/Transaction');
93-
var Resource = require('dw/web/Resource');
94-
95-
if (fraudDetectionStatus.status === 'fail') {
96-
Transaction.wrap(function () { OrderMgr.failOrder(order, true); });
97-
// fraud detection failed
98-
req.session.privacyCache.set('fraudDetectionStatus', true);
99-
res.redirect(URLUtils.https('Error-ErrorCode', 'err', fraudDetectionStatus.errorCode));
100-
return next();
101-
}
102-
103-
// Place the order
104-
var placeOrderResult = COHelpers.placeOrder(order, fraudDetectionStatus);
105-
if (placeOrderResult.error) {
106-
res.redirect(URLUtils.https('Checkout-Begin', 'stage', 'placeOrder', 'PlaceOrderError', Resource.msg('error.technical', 'checkout', null)));
107-
return next();
108-
}
109-
110-
// Set order confirmation status to not confirmed for REVIEW orders.
111-
if (session.privacy.CybersourceFraudDecision === 'REVIEW') {
112-
var Order = require('dw/order/Order');
113-
Transaction.wrap(function () {
114-
order.setConfirmationStatus(Order.CONFIRMATION_STATUS_NOTCONFIRMED);
115-
});
116-
}
117-
118-
COHelpers.sendConfirmationEmail(order, req.locale.id);
119-
// Reset using MultiShip after successful Order placement
120-
req.session.privacyCache.set('usingMultiShipping', false);
121-
res.redirect(URLUtils.https('COPlaceOrder-SubmitOrderConformation', 'ID', order.orderNo, 'token', order.orderToken));
122-
return next();
123-
}
124-
125-
/**
126-
* function
127-
* @param {*} order order
128-
* @param {*} req req
129-
* @param {*} res res
130-
* @param {*} next next
131-
* @returns {*} obj
132-
*/
133-
function submitApplePayOrder(order, req, res, next) {
134-
var checkoutHelper = require('*/cartridge/scripts/checkout/checkoutHelpers');
135-
136-
if (!order && req.querystring.order_token !== order.getOrderToken()) {
137-
return next(new Error('Order token does not match'));
138-
}
139-
// var HookMgr = require('dw/system/HookMgr');
140-
var fraudDetectionStatus = HookMgr.callHook('app.fraud.detection', 'fraudDetection', order);
141-
var orderPlacementStatus = checkoutHelper.placeOrder(order, fraudDetectionStatus);
142-
143-
if (orderPlacementStatus.error) {
144-
return next(new Error('Could not place order'));
145-
}
146-
147-
var config = {
148-
numberOfLineItems: '*'
149-
};
150-
var orderModel = new OrderModel(order, { config: config });
151-
if (!req.currentCustomer.profile) {
152-
var passwordForm = server.forms.getForm('newPasswords');
153-
passwordForm.clear();
154-
res.render('checkout/confirmation/confirmation', {
155-
order: orderModel,
156-
returningCustomer: false,
157-
passwordForm: passwordForm
158-
});
159-
} else {
160-
res.render('checkout/confirmation/confirmation', {
161-
order: orderModel,
162-
returningCustomer: true
163-
});
164-
}
165-
return next();
166-
}
167-
16814
// eslint-disable-next-line
16915
server.use('Submit', csrfProtection.generateToken, function (req, res, next) {
17016
var order;
17117
if (!empty(req.querystring.order_id)) {
17218
order = OrderMgr.getOrder(req.querystring.order_id);
17319
} else {
174-
order = OrderMgr.getOrder(session.privacy.order_id);
20+
order = OrderMgr.getOrder(session.privacy.orderId);
17521
}
17622
if (!empty(order) && !empty(order.orderToken)) {
17723
// eslint-disable-next-line
@@ -192,17 +38,17 @@ server.use('Submit', csrfProtection.generateToken, function (req, res, next) {
19238
var providerResult = Provider.Check(order);
19339
if (!empty(providerResult)) {
19440
if (providerResult.pending) {
195-
reviewOrder(providerResult.Order.orderNo, req, res, next);
41+
COHelpers.reviewOrder(providerResult.Order.orderNo, req, res, next);
19642
return next();
19743
} if (providerResult.load3DRequest) {
19844
res.render('cart/payerAuthenticationRedirect');
19945
return next();
20046
} if (providerResult.submit) {
201-
submitOrder(providerResult.Order.orderNo, req, res, next);
47+
COHelpers.submitOrder(providerResult.Order.orderNo, req, res, next);
20248
return next();
20349
} if (providerResult.error) {
20450
var args = { Order: providerResult.Order };
205-
failOrder(args);
51+
COHelpers.failOrder(args);
20652
res.redirect(URLUtils.https('Checkout-Begin', 'stage', 'payment', 'payerAuthError', dw.web.Resource.msg('payerauthentication.carderror', 'cybersource', null)));
20753
return next();
20854
} if (providerResult.cancelfail) {
@@ -232,18 +78,18 @@ server.use('Submit', csrfProtection.generateToken, function (req, res, next) {
23278
}
23379
}
23480
} else if (!empty(paymentInstrument) && paymentInstrument.paymentMethod === 'DW_APPLE_PAY') {
235-
submitApplePayOrder(order, req, res, next);
81+
COHelpers.submitApplePayOrder(order, req, res, next);
23682
}
23783
});
23884

23985
server.get('SilentPostSubmitOrder', csrfProtection.generateToken, function (req, res, next) {
24086
var orderId = session.privacy.orderId;
241-
submitOrder(orderId, req, res, next);
87+
COHelpers.submitOrder(orderId, req, res, next);
24288
});
24389

24490
server.get('SilentPostReviewOrder', csrfProtection.generateToken, function (req, res, next) {
24591
var orderId = session.privacy.orderId;
246-
reviewOrder(orderId, req, res, next);
92+
COHelpers.reviewOrder(orderId, req, res, next);
24793
});
24894

24995
server.get('SubmitOrderConformation', csrfProtection.generateToken, function (req, res, next) {

0 commit comments

Comments
 (0)