Skip to content

Commit a3ed03c

Browse files
authored
Merge pull request #3 from yourpayments/secure-fields-example
Add user agreement secure field; change styles
2 parents 51d4930 + e378619 commit a3ed03c

File tree

6 files changed

+120
-80
lines changed

6 files changed

+120
-80
lines changed

assets/css/secureFields.css

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,7 @@ body {
140140
#simple-form {
141141
display: none;
142142
}
143+
144+
.no-padding-left {
145+
padding-left: 0;
146+
}

assets/css/text-security-disk.css

Lines changed: 0 additions & 3 deletions
This file was deleted.

assets/js/secureFields.js

Lines changed: 74 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
/*
22
Загрузка SDK Secure Fields
33
*/
4-
const secureFieldsJs = document.createElement('script');
5-
secureFieldsJs.src = 'https://sandbox.ypmn.ru/js/secure-fields/_sb/secure-fields.min.js';
6-
74
secureFieldsJs.addEventListener('load', () => {
8-
debug('eventListener secureFieldsJs');
5+
console.log('eventListener secureFieldsJs');
96
initPaymentProcess();
107
initPaymentProcessSimple();
118
})
@@ -23,9 +20,9 @@ let elementsTypesListened = [];
2320
Настройка Secure Fields, отображение полей Secure Fields, процесс получения одноразового токена
2421
*/
2522
function initPaymentProcess() {
26-
debug('function initPaymentProcess');
27-
debug(merchantCode);
28-
debug(sessionId);
23+
console.log('function initPaymentProcess');
24+
console.log(merchantCode);
25+
console.log(sessionId);
2926

3027
/*
3128
Создание объекта Secure Fields.
@@ -39,24 +36,24 @@ function initPaymentProcess() {
3936

4037
const fonts = [
4138
{
42-
src: 'https://fonts.googleapis.com/css?family=Source+Code+Pro',
43-
src: location.protocol + '//' + location.host + '/assets/css/text-security-disk.css'
39+
// src: 'https://fonts.googleapis.com/css?family=Source+Code+Pro'
4440
}
4541
];
4642

4743
const formElements = new PayUSecureFields.Init(auth, {
4844
fonts
4945
})
5046

51-
debug(formElements);
47+
console.log(formElements);
5248

5349
/*
5450
Добавление плейсхолдеров для полей Secure Fields.
5551
*/
5652
const placeholders = {
5753
cardNumber: '1234 1234 1234 1234',
5854
expDate: 'MM / YY',
59-
cvv: '123'
55+
cvv: '123',
56+
userAgreement: 'ru'
6057
};
6158

6259
/*
@@ -65,6 +62,13 @@ function initPaymentProcess() {
6562
document.getElementById('load').style.display = 'none';
6663
document.getElementById('form').style.display = 'flex';
6764

65+
let style = {
66+
base: {
67+
fontSize: '0.85em',
68+
lineHeight: '1.1em'
69+
}
70+
};
71+
6872
/*
6973
Отображение полей Secure Fields и подключение слушателей на поля для валидации введенных данных
7074
*/
@@ -74,6 +78,10 @@ function initPaymentProcess() {
7478
cardNumber.mount('#card-number');
7579
formValidation(cardNumber, eventsToListen, 'card-number');
7680

81+
cardNumber.on('cardInfo', (event) => {
82+
console.log('cardInfoEvent', event)
83+
});
84+
7785
const expiry = formElements.create('creditCardExpiry', {
7886
placeholders
7987
});
@@ -86,6 +94,13 @@ function initPaymentProcess() {
8694
cvv.mount('#cvv');
8795
formValidation(cvv, eventsToListen, 'cvv');
8896

97+
const userAgreement = formElements.create('userAgreement', {
98+
style,
99+
placeholders
100+
});
101+
userAgreement.mount('#user-agreement');
102+
formValidation(userAgreement, eventsToListen, 'user-agreement');
103+
89104
/*
90105
Валидация поля с именем картодержателя
91106
*/
@@ -95,7 +110,7 @@ function initPaymentProcess() {
95110
Создание токена при нажатии на кнопку формы
96111
*/
97112
document.getElementById('payment-form').addEventListener('submit', async(event) => {
98-
debug('submit');
113+
console.log('submit');
99114

100115
/*
101116
svg загрузки вместо кнопки после нажатия
@@ -116,18 +131,18 @@ function initPaymentProcess() {
116131
/*
117132
Получение и обработка ответа при создании одноразового токена
118133
*/
119-
debug('cardNumber');
134+
console.log('cardNumber');
120135

121136
const result = await PayUSecureFields.createToken(cardNumber, {additionalData});
122137

123-
debug('createToken');
124-
debug(result);
138+
console.log('createToken');
139+
console.log(result);
125140
processResult(result);
126141
} catch (err) {
127142
/*
128143
Вывод об ошибке при наличии
129144
*/
130-
debug('createTokenError - ' + err.name + ': ' + err.message);
145+
console.log('createTokenError - ' + err.name + ': ' + err.message);
131146
viewResult(false, err.name, [err.message], true);
132147
}
133148

@@ -140,16 +155,16 @@ function initPaymentProcess() {
140155
Процесс обработки результата получения токена
141156
*/
142157
function processResult(result) {
143-
debug('function processResult');
158+
console.log('function processResult');
144159

145160
if (typeof result.errors == 'object' && Object.keys(result.errors).length) {
146-
debug('createToken errors');
161+
console.log('createToken errors');
147162
viewResult(false, 'Tokenization failure', result.errors, true);
148163
return;
149164
}
150165

151166
if (result.statusCode === 'SUCCESS') {
152-
debug('createToken success');
167+
console.log('createToken success');
153168
pay(result['token']);
154169
}
155170
}
@@ -158,8 +173,8 @@ function processResult(result) {
158173
159174
*/
160175
function pay(token) {
161-
debug('function pay');
162-
debug(token);
176+
console.log('function pay');
177+
console.log(token);
163178

164179
let oneTimeTokenPaymentResult = jsonRequest(
165180
'?function=oneTimeTokenPayment&json=true',
@@ -189,35 +204,39 @@ function pay(token) {
189204
}
190205

191206
function formValidation(object, listeners, containerId) {
192-
debug('function formValidation');
207+
console.log('function formValidation');
193208

194209
let elementType = object['elementType'];
195210

196211
elementsTypesListened.push(elementType);
197212

198213
validationSuccess[elementType] = false;
199214

215+
if (elementType === 'userAgreement') {
216+
validationSuccess[elementType] = true;
217+
}
218+
200219
let container = document.getElementById(containerId);
201220
let validationContainer = document.getElementById(containerId + '-validation');
202221

203222
listeners.forEach( function(listener) {
204223

205224
object.on(listener, (event) => {
206-
debug('listener');
207-
debug(object);
208-
debug(event);
225+
console.log('listener');
226+
console.log(object);
227+
console.log(event);
209228

210229
if (event['statusCode'] === 'SUCCESS' && event['empty'] === false) {
211-
debug('SUCCESS');
230+
console.log('SUCCESS');
212231

213232
container.classList.remove( 'is-invalid');
214233
validationContainer.innerHTML = '';
215234

216235
validationSuccess[elementType] = true;
217236
} else {
218-
debug('ERROR');
237+
console.log('ERROR');
219238

220-
debug(event['errors']);
239+
console.log(event['errors']);
221240

222241
container.classList.add('is-invalid');
223242
validationContainer.innerHTML = '';
@@ -227,7 +246,7 @@ function formValidation(object, listeners, containerId) {
227246
for (const key in event['errors']) {
228247
let error = event['errors'][key];
229248
validationContainer.innerHTML += error + '<br/>';
230-
debug(error);
249+
console.log(error);
231250
}
232251

233252
if (event['empty'] === true && elementType === 'cvv') {
@@ -242,7 +261,7 @@ function formValidation(object, listeners, containerId) {
242261
}
243262

244263
function cardHolderValidation() {
245-
debug('function cardHolderValidation');
264+
console.log('function cardHolderValidation');
246265

247266
let cardHolderEventsToListen= eventsToListen;
248267
cardHolderEventsToListen.push('input');
@@ -257,23 +276,23 @@ function cardHolderValidation() {
257276
let validationContainer = document.getElementById('cardholder-name-validation');
258277

259278
cardHolderEventsToListen.forEach( function(listener) {
260-
debug('listener');
261-
debug('cardHolder');
262-
debug(listener);
279+
console.log('listener');
280+
console.log('cardHolder');
281+
console.log(listener);
263282

264283
let cardHolderInput = document.getElementById('cardholder-name');
265284

266285
cardHolderInput.addEventListener(listener, () => {
267286

268287
if (cardHolderInput.value !== '') {
269-
debug('SUCCESS');
288+
console.log('SUCCESS');
270289

271290
container.classList.remove( 'is-invalid');
272291
validationContainer.innerHTML = '';
273292

274293
validationSuccess[elementType] = true;
275294
} else {
276-
debug('ERROR');
295+
console.log('ERROR');
277296

278297
container.classList.add('is-invalid');
279298
validationContainer.innerHTML = 'Holder\'s name is mandatory field';
@@ -287,30 +306,30 @@ function cardHolderValidation() {
287306
}
288307

289308
function changeButtonAbility() {
290-
debug('function changeButtonAbility');
309+
console.log('function changeButtonAbility');
291310

292-
debug(elementsTypesListened);
311+
console.log(elementsTypesListened);
293312

294313
for (const key in elementsTypesListened) {
295314
let elementType = elementsTypesListened[key];
296315

297-
debug(elementType);
298-
debug(validationSuccess[elementType]);
316+
console.log(elementType);
317+
console.log(validationSuccess[elementType]);
299318

300319
if (validationSuccess[elementType] === false) {
301-
debug('disable button');
320+
console.log('disable button');
302321
document.getElementById('pay_button').disabled = true;
303322
return;
304323
}
305324

306325
}
307326

308-
debug('enable button');
327+
console.log('enable button');
309328
document.getElementById('pay_button').disabled = false;
310329
}
311330

312331
function jsonRequest(url, method, requestData, responseType, successCallback) {
313-
debug('function jsonRequest: ' + url);
332+
console.log('function jsonRequest: ' + url);
314333

315334
let xhr = new XMLHttpRequest();
316335
xhr.open(method, url, false);
@@ -322,29 +341,29 @@ function jsonRequest(url, method, requestData, responseType, successCallback) {
322341
let status = xhr.status;
323342

324343
if (status === 200) {
325-
debug('jsonRequest success');
326-
debug(xhr.response);
344+
console.log('jsonRequest success');
345+
console.log(xhr.response);
327346

328347
successCallback(JSON.parse(xhr.response));
329348
jsonRequestResult = true;
330349
} else {
331-
debug('jsonRequest error');
332-
debug('Error ' + xhr.status + ': ' + xhr.statusText);
350+
console.log('jsonRequest error');
351+
console.log('Error ' + xhr.status + ': ' + xhr.statusText);
333352

334353
viewResult(false, 'Request Error', [], true);
335354
}
336355
};
337356

338357
xhr.ontimeout = (e) => {
339-
debug('jsonRequest timeout error');
358+
console.log('jsonRequest timeout error');
340359
viewResult(false, 'Request Error', [], true);
341360
};
342361

343-
debug(requestData);
362+
console.log(requestData);
344363

345364
xhr.send(requestData);
346365

347-
debug(jsonRequestResult);
366+
console.log(jsonRequestResult);
348367

349368
return jsonRequestResult;
350369
}
@@ -389,10 +408,10 @@ const failureIcon = '\n' +
389408
' </svg>';
390409

391410
function viewResult(success, title, messages, hideForm = false) {
392-
debug('function viewResult');
393-
debug(success);
394-
debug(title);
395-
debug(messages);
411+
console.log('function viewResult');
412+
console.log(success);
413+
console.log(title);
414+
console.log(messages);
396415

397416
document.getElementById('bootstrap-tab-pane').innerHTML += resultBlock;
398417

@@ -418,8 +437,8 @@ function viewResult(success, title, messages, hideForm = false) {
418437
}
419438

420439
function viewRedirect(title, hideForm = false) {
421-
debug('function viewRedirect');
422-
debug(title);
440+
console.log('function viewRedirect');
441+
console.log(title);
423442

424443
document.getElementById('bootstrap-tab-pane').innerHTML += resultBlock;
425444

@@ -431,9 +450,3 @@ function viewRedirect(title, hideForm = false) {
431450
document.getElementById('load').style.display = 'none';
432451
document.getElementById('result').style.display = 'flex';
433452
}
434-
435-
function debug(message) {
436-
if (debugMode === true) {
437-
console.log(message);
438-
}
439-
}

0 commit comments

Comments
 (0)