node-paytmpg 6.4.7 → 7.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/README.MD +132 -182
  2. package/app/views/layouts/index.hbs +7 -7
  3. package/app/views/result.hbs +1 -1
  4. package/dist/app/controllers/adapters/open_money.js +400 -0
  5. package/dist/app/controllers/adapters/paytm.js +34 -0
  6. package/{app → dist/app}/controllers/adapters/payu.js +208 -239
  7. package/dist/app/controllers/checksum/PaytmChecksum.js +118 -0
  8. package/dist/app/controllers/checksum/checksum.js +158 -0
  9. package/dist/app/controllers/checksum/crypt.js +117 -0
  10. package/dist/app/controllers/checksum/server.js +130 -0
  11. package/dist/app/controllers/payment.controller.js +1089 -0
  12. package/dist/app/controllers/static/loadingsvg.js +54 -0
  13. package/dist/app/controllers/user.controller.js +53 -0
  14. package/dist/app/models/index.js +2 -0
  15. package/dist/app/routes/payment_route.js +46 -0
  16. package/dist/app/utils/buildConfig.js +210 -0
  17. package/dist/app/utils/utils.js +20 -0
  18. package/dist/app/views/home.hbs +22 -0
  19. package/dist/app/views/init.hbs +98 -0
  20. package/dist/app/views/layouts/index.hbs +53 -0
  21. package/dist/app/views/result.hbs +33 -0
  22. package/dist/index.js +119 -0
  23. package/dist/package.json +67 -0
  24. package/dist/public/css/style.css +455 -0
  25. package/dist/public/js/index.js +283 -0
  26. package/dist/public/layer_checkout.js +38 -0
  27. package/dist/public/pay.png +0 -0
  28. package/dist/public/start.png +0 -0
  29. package/dist/public/start2.png +0 -0
  30. package/dist/public/stat.png +0 -0
  31. package/dist/public/test.html +24 -0
  32. package/dist/public/test.html~ +24 -0
  33. package/package.json +29 -6
  34. package/public/test.html~ +24 -0
  35. package/.github/workflows/codeql-analysis.yml +0 -71
  36. package/.github/workflows/nodejs.yml +0 -24
  37. package/.github/workflows/npm-publish.yml +0 -23
  38. package/Dockerfile +0 -9
  39. package/app/controllers/adapters/open_money.js +0 -515
  40. package/app/controllers/checksum/PaytmChecksum.js +0 -94
  41. package/app/controllers/checksum/checksum.js +0 -154
  42. package/app/controllers/checksum/crypt.js +0 -98
  43. package/app/controllers/checksum/server.js +0 -132
  44. package/app/controllers/np_user.controller.js +0 -89
  45. package/app/controllers/payment_controller.js +0 -1295
  46. package/app/models/np_multidbplugin.js +0 -111
  47. package/app/models/np_transaction.model.js +0 -16
  48. package/app/models/np_user.model.js +0 -12
  49. package/app/routes/payment_route.js +0 -73
  50. package/app.yaml +0 -18
  51. package/example.js +0 -34
  52. package/index.js +0 -90
  53. package/lib/config/buildConfig.js +0 -113
  54. package/lib/config/defaults.js +0 -37
  55. package/lib/config/validator.js +0 -103
  56. package/lib/services/database.service.js +0 -153
  57. package/lib/utils/id-generator.js +0 -30
  58. package/lib/utils/sanitizer.js +0 -25
@@ -1,1295 +0,0 @@
1
- var packageInfo = require('../../package.json')
2
- const checksum_lib = require('./checksum/checksum.js');
3
- var request = require('request')
4
- var Transaction;
5
- var IDLEN = 10;
6
- var nodeBase64 = require('nodejs-base64-converter');
7
- var RazorPay = require('razorpay');
8
- var OpenMoney = require('./adapters/open_money')
9
- var PayU = require('./adapters/payu')
10
- const PaytmChecksum = require('./checksum/PaytmChecksum.js');
11
- const { stat } = require('fs');
12
- const { config } = require('process');
13
- const path = require('path');
14
-
15
- let loadingSVG = ` <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="margin:auto;background:#fff;display:block;" width="200px" height="200px" viewBox="0 0 100 100" preserveAspectRatio="xMidYMid">
16
- <g transform="rotate(0 50 50)">
17
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
18
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.9166666666666666s" repeatCount="indefinite"></animate>
19
- </rect>
20
- </g><g transform="rotate(30 50 50)">
21
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
22
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.8333333333333334s" repeatCount="indefinite"></animate>
23
- </rect>
24
- </g><g transform="rotate(60 50 50)">
25
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
26
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.75s" repeatCount="indefinite"></animate>
27
- </rect>
28
- </g><g transform="rotate(90 50 50)">
29
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
30
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.6666666666666666s" repeatCount="indefinite"></animate>
31
- </rect>
32
- </g><g transform="rotate(120 50 50)">
33
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
34
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.5833333333333334s" repeatCount="indefinite"></animate>
35
- </rect>
36
- </g><g transform="rotate(150 50 50)">
37
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
38
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.5s" repeatCount="indefinite"></animate>
39
- </rect>
40
- </g><g transform="rotate(180 50 50)">
41
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
42
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.4166666666666667s" repeatCount="indefinite"></animate>
43
- </rect>
44
- </g><g transform="rotate(210 50 50)">
45
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
46
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.3333333333333333s" repeatCount="indefinite"></animate>
47
- </rect>
48
- </g><g transform="rotate(240 50 50)">
49
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
50
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.25s" repeatCount="indefinite"></animate>
51
- </rect>
52
- </g><g transform="rotate(270 50 50)">
53
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
54
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.16666666666666666s" repeatCount="indefinite"></animate>
55
- </rect>
56
- </g><g transform="rotate(300 50 50)">
57
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
58
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="-0.08333333333333333s" repeatCount="indefinite"></animate>
59
- </rect>
60
- </g><g transform="rotate(330 50 50)">
61
- <rect x="47" y="24" rx="3" ry="6" width="6" height="12" fill="#0097a7">
62
- <animate attributeName="opacity" values="1;0" keyTimes="0;1" dur="1s" begin="0s" repeatCount="indefinite"></animate>
63
- </rect>
64
- </g>
65
- </svg>`
66
-
67
- function sanitizeRequest(body) {
68
-
69
- if (body.amount)
70
- body.amount = parseFloat(body.amount);
71
- if (body.TXN_AMOUNT)
72
- body.amount = parseFloat(body.TXN_AMOUNT);
73
- }
74
-
75
- module.exports = function (app, callbacks) {
76
- var config = (app.get('np_config'))
77
- var useController = require('./np_user.controller.js')(app, callbacks);
78
-
79
- var razorPayInstance;
80
- var openMoneyInstance = new OpenMoney(config);
81
- var payuInstance = new PayU(config)
82
-
83
- if (config.razor_url) {
84
- razorPayInstance = new RazorPay({ key_id: config.KEY, key_secret: config.SECRET })
85
- }
86
- if (config.open_money_url) {
87
- openMoneyInstance = new OpenMoney(config);
88
- }
89
- if (config.payu_url) {
90
- payuInstance = new PayU(config);
91
- }
92
-
93
- let usingMultiDbOrm = false;
94
- if (config.db_url) {
95
- Transaction = require('../models/np_transaction.model.js');
96
- usingMultiDbOrm = false;
97
-
98
- } else if (app.multidborm) {
99
- const sample = {
100
- orderId: "string",
101
- cusId: "string",
102
- time: 1770051201752,
103
- timeStamp: 1770051201752,
104
- status: "string",
105
- name: "string",
106
- email: "string",
107
- phone: "string",
108
- amount: 1,
109
- pname: "string",
110
- extra: "stringlarge",
111
- TXNID: "27118670199",
112
- returnUrl: "string"
113
- }
114
- Transaction = require('../models/np_multidbplugin.js')('nptransactions', app.multidborm, sample);
115
- Transaction.db = app.multidborm;
116
- Transaction.modelname = 'nptransactions'
117
- Transaction.idFieldName = 'orderId'
118
- app.NPTransaction = Transaction;
119
- usingMultiDbOrm = true;
120
-
121
- }
122
-
123
- var module = {};
124
-
125
- var config = (app.get('np_config'))
126
- function makeid(length) {
127
- var text = "";
128
- var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
129
-
130
- for (var i = 0; i < length; i++)
131
- text += possible.charAt(Math.floor(Math.random() * possible.length));
132
-
133
- return text;
134
- }
135
-
136
- const viewRoot = config.templateDir
137
- ? config.templateDir
138
- : path.join(__dirname, '..', 'views');
139
- var vp = config.resolved_view_path || (viewRoot.endsWith(path.sep) ? viewRoot : viewRoot + path.sep)
140
-
141
- module.home = (req, res) => {
142
-
143
- packageInfo.repository.url = packageInfo.repository.url.replace('git+', '')
144
- res.render(vp + "home.hbs", packageInfo)
145
-
146
-
147
- }
148
-
149
- module.init = async function (req, res) {
150
-
151
- if (!req.body.ORDER_ID && !req.body.EMAIL && req.query?.to) {
152
- let toData = JSON.parse(nodeBase64.decode(req.query.to));
153
- req.body.NAME = toData.NAME
154
- req.body.EMAIL = toData.EMAIL
155
- req.body.TXN_AMOUNT = toData.TXN_AMOUNT
156
- req.body.MOBILE_NO = toData.MOBILE_NO
157
- req.body.ORDER_ID = toData.ORDER_ID || toData.ORDERID
158
- req.body.PRODUCT_NAME = toData.PRODUCT_NAME
159
- req.body.RETURN_URL = toData.RETURN_URL
160
- }
161
-
162
- sanitizeRequest(req.body);
163
- let gotAllParams = true;
164
- let checkedFields = ['TXN_AMOUNT', 'PRODUCT_NAME', 'MOBILE_NO', 'NAME', 'EMAIL']
165
- if (req.body !== undefined) {
166
-
167
- for (var i = 0; i < checkedFields.length; i++) {
168
-
169
- if (req.body[checkedFields[i]] === undefined) {
170
- gotAllParams = false;
171
- break;
172
- }
173
-
174
- }
175
- }
176
- else {
177
- gotAllParams = false;
178
- }
179
-
180
- // console.log(req.body)
181
-
182
- if ((req.body.ORDER_ID !== undefined && req.body.ORDER_ID.length > 2)
183
- &&
184
- (req.body.CUST_ID !== undefined && req.body.CUST_ID.length > 2)) {
185
- // console.log('redirect')
186
- // console.log(req.body)
187
- var params = {};
188
-
189
- params['MID'] = req.body.MID;
190
- params['WEBSITE'] = req.body.WEBSITE;
191
- params['CHANNEL_ID'] = req.body.CHANNEL_ID;
192
- params['INDUSTRY_TYPE_ID'] = req.body.INDUSTRY_TYPE_ID;
193
- params['ORDER_ID'] = req.body.ORDER_ID || req.body.ORDERID;
194
- params['CUST_ID'] = req.body.CUST_ID;
195
- params['TXN_AMOUNT'] = req.body.TXN_AMOUNT;
196
- params['CALLBACK_URL'] = req.body.CALLBACK_URL + "?order_id=" + req.body.ORDER_ID;
197
- params['EMAIL'] = req.body.EMAIL;
198
- params['MOBILE_NO'] = req.body.MOBILE_NO;
199
- params['PRODUCT_NAME'] = req.body.PRODUCT_NAME;
200
- params['NAME'] = req.body.NAME;
201
-
202
- if (config.paytm_url) {
203
-
204
- let initTxnbody = {
205
- "requestType": "Payment",
206
- "mid": params['MID'],
207
- "websiteName": params['WEBSITE'],
208
- "orderId": params['ORDER_ID'],
209
- "callbackUrl": params['CALLBACK_URL'],
210
- "txnAmount": {
211
- "value": params['TXN_AMOUNT'],
212
- "currency": params['CURRENCY'] || "INR",
213
- },
214
- "userInfo": {
215
- "custId": params['CUST_ID'],
216
- "mobile": params['MOBILE_NO'],
217
- "firstName": params['NAME'],
218
- "email": params['EMAIL']
219
- }
220
- };
221
- if (config.mode) {
222
- initTxnbody["enablePaymentMode"] = JSON.parse(config.mode)
223
- }
224
-
225
- let checksum = await PaytmChecksum.generateSignature(JSON.stringify(initTxnbody), config.KEY)
226
- let initTxnUrl = config.paytm_url + `/theia/api/v1/initiateTransaction?mid=${params['MID']}&orderId=${params['ORDER_ID']}`;
227
-
228
- request.post(
229
- initTxnUrl,
230
- {
231
- json: {
232
- "body": initTxnbody,
233
- "head": {
234
- "signature": checksum,
235
- "channelId": params['CHANNEL_ID']
236
- }
237
- }
238
- },
239
- function (error, response, body) {
240
-
241
- if (!error && response.statusCode != undefined
242
- && response.statusCode != NaN &&
243
- response.statusCode == 200 &&
244
- body.body &&
245
- body.body.resultInfo &&
246
- body.body.resultInfo.resultStatus == "S") {
247
-
248
- let paytmJsToken = {}
249
- paytmJsToken.CALLBACK_URL = params['CALLBACK_URL']
250
- paytmJsToken.ORDERID = params['ORDER_ID']
251
- paytmJsToken.ORDER_ID = params['ORDER_ID']
252
- paytmJsToken.CANCELLED = "cancelled"
253
- paytmJsToken.TOKEN = body.body.txnToken
254
- paytmJsToken.TXN_AMOUNT = params['TXN_AMOUNT']
255
- paytmJsToken.MID = params['MID']
256
- paytmJsToken.CALLBACK_URL = params['CALLBACK_URL']
257
- paytmJsToken.CALLBACK_URL = params['CALLBACK_URL']
258
-
259
-
260
-
261
- let paytmJsCheckouHtml = `<html>
262
- <head>
263
- <title>Merchant Checkout</title>
264
- <meta name="viewport" content="width=device-width, height=device-height, initial-scale=1.0, maximum-scale=1.0"/>
265
-
266
- </head>
267
- <body>
268
- <center>
269
- <h1>Please donot close this page or press the back button. Processing...</h1>
270
- ${loadingSVG}
271
- </center>
272
- <form id="cancelform" action="${params['CALLBACK_URL']}" method="post">
273
- <input type="hidden" name="TXNID" value="na"/>
274
- <input type="hidden" name="STATUS" value="TXN_FAILURE"/>
275
- <input type="hidden" name="CANCELLED" value="cancelled"/>
276
- <input id="RESPMSG" type="hidden" name="RESPMSG" value=""/>
277
- <input type="hidden" name="ORDERID" value="${params["ORDER_ID"]}"/>
278
- </form>
279
-
280
-
281
- <script>
282
-
283
- function getBodyColor(color){
284
- const hex = color.replace('#', '');
285
- const c_r = parseInt(hex.substr(0, 2), 16);
286
- const c_g = parseInt(hex.substr(2, 2), 16);
287
- const c_b = parseInt(hex.substr(4, 2), 16);
288
- const brightness = ((c_r * 299) + (c_g * 587) + (c_b * 114)) / 1000;
289
- // console.log(brightness , brightness > 155 ? "#fff" : "#1a1a1c")
290
- return brightness > 155 ? "#1a1a1c" : "#ffffff";
291
- }
292
-
293
- function shadeColor(color, percent) {
294
-
295
- var R = parseInt(color.substring(1,3),16);
296
- var G = parseInt(color.substring(3,5),16);
297
- var B = parseInt(color.substring(5,7),16);
298
-
299
- R = parseInt(R * (100 + percent) / 100);
300
- G = parseInt(G * (100 + percent) / 100);
301
- B = parseInt(B * (100 + percent) / 100);
302
-
303
- R = (R<255)?R:255;
304
- G = (G<255)?G:255;
305
- B = (B<255)?B:255;
306
-
307
- var RR = ((R.toString(16).length==1)?"0"+R.toString(16):R.toString(16));
308
- var GG = ((G.toString(16).length==1)?"0"+G.toString(16):G.toString(16));
309
- var BB = ((B.toString(16).length==1)?"0"+B.toString(16):B.toString(16));
310
-
311
- return "#"+RR+GG+BB;
312
- }
313
-
314
- function failTxn(reason) {
315
- var form = document.getElementById("cancelform");
316
- var element2 = document.getElementById("RESPMSG");
317
- element2.value=reason;
318
- form.submit();
319
- }
320
- function onScriptLoad(){
321
- var config = {
322
- "root": "",
323
- "flow": "DEFAULT",
324
- "style": {
325
- // "bodyColor": shadeColor("${config.theme_color}",+40),
326
- "themeBackgroundColor": "${config.theme_color}",
327
- "themeColor": getBodyColor("${config.theme_color}"),
328
- "headerBackgroundColor": "${config.theme_color}",
329
- "headerColor": getBodyColor("${config.theme_color}")
330
- },
331
- "data": {
332
- "orderId": "${params['ORDER_ID']}", /* update order id */
333
- "token": "${body.body.txnToken}", /* update token value */
334
- "tokenType": "TXN_TOKEN",
335
- "amount": "${params['TXN_AMOUNT']}" /* update amount */
336
- },
337
- "handler": {
338
- "notifyMerchant": function(eventName,data){
339
- // console.log("notifyMerchant handler function called");
340
- // console.log("eventName => ",eventName);
341
- // console.log("data => ",data);
342
- if(eventName == "APP_CLOSED"){
343
- failTxn(eventName)
344
- }
345
- }
346
- }
347
- };
348
-
349
- if(window.Paytm && window.Paytm.CheckoutJS){
350
- window.Paytm.CheckoutJS.onLoad(function excecuteAfterCompleteLoad() {
351
- // initialze configuration using init method
352
- window.Paytm.CheckoutJS.init(config).then(function onSuccess() {
353
- // after successfully updating configuration, invoke JS Checkout
354
- window.Paytm.CheckoutJS.invoke();
355
- }).catch(function onError(error){
356
- // console.log("error => ",error);
357
- failTxn(error.message)
358
- });
359
- });
360
- }
361
- }
362
- </script>
363
- <script type="application/javascript" crossorigin="anonymous" src="${config.paytm_url}/merchantpgpui/checkoutjs/merchants/${params['MID']}.js" onload="onScriptLoad();" crossorigin="anonymous"></script>
364
-
365
-
366
- </body>
367
- </html>`
368
- if (res.token) {
369
- res.token(paytmJsToken)
370
- }
371
- return res.send(paytmJsCheckouHtml)
372
-
373
- }
374
- else {
375
- console.log('ERROR:::', error, '\n', body);
376
- res.status(500)
377
- var form_fields = "";
378
- let errorResp = {
379
- TXNID: "na",
380
- STATUS: "TXN_FAILURE",
381
- CANCELLED: "cancelled",
382
- ORDERID: params["ORDER_ID"]
383
- }
384
- for (var x in errorResp) {
385
- form_fields += "<input type='hidden' name='" + x + "' value='" + errorResp[x] + "' >";
386
- }
387
- form_fields += "<input type='hidden' name='CHECKSUMHASH' value='" + checksum + "' >";
388
- if (res.token) {
389
- res.token(undefined)
390
- }
391
- res.writeHead(200, { 'Content-Type': 'text/html' });
392
- res.write(`<html>
393
-
394
- <head>
395
- <title>Merchant Checkout Error</title>
396
- </head>
397
-
398
- <body>
399
- <center>
400
- <h1>Something went wrong. Please wait you will be redirected automatically...</h1>
401
- </center>
402
- <form method="post" action="${params['CALLBACK_URL']}" name="f1">${form_fields}</form>
403
- <script type="text/javascript">document.f1.submit();</script>
404
- </body>
405
-
406
- </html>`);
407
- res.end();
408
-
409
- }
410
- }
411
- );
412
-
413
- }
414
- else if (config.razor_url) {
415
-
416
- let fail = `<div style="display:none">
417
-
418
- <form method="post" action="${params['CALLBACK_URL']}" id="fail">
419
- <input name="razorpay_order_id" value="${params['ORDER_ID']}" hidden="true"/>
420
- </form>
421
- </div>`;
422
- let html = `
423
- <script src="https://checkout.razorpay.com/v1/checkout.js"></script>
424
- <script>
425
- var options = {
426
- "key": "${config.KEY}",
427
- "amount": "${parseFloat(params['TXN_AMOUNT']) * 100}",
428
- "currency": "INR",
429
- "name": "${params['PRODUCT_NAME']}",
430
- "description": "Order # ${params['ORDER_ID']}",
431
- "image": "${config.logo}",
432
- "order_id": "${params['ORDER_ID']}",
433
- "callback_url": "${params['CALLBACK_URL']}",
434
- "prefill": {
435
- "name": "${params['NAME']}",
436
- "email": "${params['EMAIL']}",
437
- "contact": "${params['MOBILE_NO']}"
438
- },
439
- "theme": {
440
- "color": "${config.theme_color}"
441
- },
442
- "modal": {
443
- "ondismiss": function(){
444
- document.getElementById("fail").submit()
445
- }
446
- }
447
- };
448
- var rzp1 = new Razorpay(options);
449
-
450
- rzp1.open();
451
- </script>`;
452
-
453
- res.writeHead(200, { 'Content-Type': 'text/html' });
454
- res.write(`<html><head><title>Merchant Checkout Page</title></head><body><center><h1>Processing ! Please do not refresh this page...</h1><br>${html}<br>${fail}<br>${loadingSVG}</center></body></html>`);
455
- res.end();
456
-
457
- }
458
- else if (config.payu_url) {
459
- const payuRequest = payuInstance.generatePaymentRequest(params);
460
- payuInstance.renderProcessingPage(params, payuRequest, res, loadingSVG);
461
- }
462
- else if (config.open_money_url) {
463
- try {
464
- let pmttoken = await openMoneyInstance.generatePaymentToken(params);
465
- openMoneyInstance.renderProcessingPage(params, pmttoken, res, loadingSVG);
466
-
467
- var myquery = { orderId: params['ORDER_ID'] };
468
- Transaction.findOne(myquery, function (err, objForUpdate) {
469
-
470
- objForUpdate.extra = JSON.stringify({
471
- layer_pay_token_id: pmttoken.tokenid
472
- });
473
-
474
- var newvalues = { $set: objForUpdate };
475
- Transaction.updateOne(myquery, newvalues, function (err, saveRes) {
476
- let status = 'Updated TXNID'
477
- });
478
-
479
- }, usingMultiDbOrm ? Transaction : undefined)
480
-
481
- } catch (e) {
482
- openMoneyInstance.renderError(params, e, res)
483
- }
484
- }
485
- if (callbacks && typeof callbacks.onStart === 'function') {
486
- callbacks.onStart(params['ORDER_ID'], params);
487
- }
488
- }
489
- else if ((req.body.ORDER_ID !== undefined && req.body.ORDER_ID.length > 2) || gotAllParams) {
490
-
491
-
492
- useController.create({ name: req.body.NAME, email: req.body.EMAIL, phone: req.body.MOBILE_NO },
493
- function (user) {
494
-
495
- //console.log(user)
496
-
497
- let onTxn = async function (txnData) {
498
-
499
-
500
- //console.log(txnData)
501
-
502
- var params = {};
503
- params['MID'] = config.MID;
504
- params['WEBSITE'] = config.WEBSITE;
505
- params['CHANNEL_ID'] = config.CHANNEL_ID;
506
- params['INDUSTRY_TYPE_ID'] = config.INDUSTRY_TYPE_ID;
507
- params['ORDER_ID'] = txnData.orderId;
508
- params['CUST_ID'] = txnData.cusId;
509
- params['TXN_AMOUNT'] = JSON.stringify(txnData.amount);
510
- params['CALLBACK_URL'] = config.host_url + '/' + config.path_prefix + '/callback'
511
- params['EMAIL'] = txnData.email;
512
- params['MOBILE_NO'] = txnData.phone;
513
- params['NAME'] = txnData.name;
514
- params['PRODUCT_NAME'] = txnData.pname;
515
-
516
-
517
- let showConfirmation =
518
- function (err, checksum) {
519
- res.render(vp + "init.hbs", {
520
- path_prefix: config.path_prefix,
521
- action:"/"+ config.path_prefix+"/init",
522
- readonly: 'readonly',
523
- BUTTON: 'Pay',
524
- NAME: params['NAME'],
525
- EMAIL: params['EMAIL'],
526
- MOBILE_NO: params['MOBILE_NO'],
527
- PRODUCT_NAME: params['PRODUCT_NAME'],
528
- TXN_AMOUNT: params['TXN_AMOUNT'],
529
- MID: params['MID'],
530
- WEBSITE: params['WEBSITE'],
531
- ORDER_ID: params['ORDER_ID'],
532
- CUST_ID: params['CUST_ID'],
533
- INDUSTRY_TYPE_ID: params['INDUSTRY_TYPE_ID'],
534
- CHANNEL_ID: params['CHANNEL_ID'],
535
- CALLBACK_URL: params['CALLBACK_URL'],
536
- CHECKSUMHASH: checksum
537
- })
538
- }
539
-
540
-
541
- if (config.paytm_url)
542
- checksum_lib.genchecksum(params, config.KEY, showConfirmation);
543
- else if (config.razor_url) {
544
- showConfirmation()
545
- } else if (config.payu_url) {
546
- showConfirmation()
547
- } else if (config.open_money_url) {
548
- showConfirmation()
549
- }
550
-
551
- };
552
-
553
-
554
-
555
-
556
- function onOrder(orderId) {
557
-
558
- var txnTask = new Transaction({
559
- orderId: orderId,
560
- cusId: user.id,
561
- time: Date.now(),
562
- timeStamp: Date.now(),
563
- status: 'INITIATED',
564
- name: user.name,
565
- email: user.email,
566
- phone: user.phone,
567
- amount: req.body.TXN_AMOUNT,
568
- pname: req.body.PRODUCT_NAME,
569
- extra: '',
570
- returnUrl: req.body.RETURN_URL || ''
571
- });
572
-
573
- return txnTask.save().then(onTxn)
574
- .catch(err => {
575
-
576
- console.log(err)
577
- if (req.body.RETURN_URL) {
578
- res.redirect(req.body.RETURN_URL + "?status=failed")
579
- return;
580
- }
581
- res.redirect('')
582
- });
583
- }
584
-
585
- if ((req.body.ORDER_ID !== undefined && req.body.ORDER_ID.length > 2)) {
586
- var myquery = { orderId: req.body.ORDER_ID };
587
- Transaction.findOne(myquery, function (err, orderData) {
588
- if (err || (!orderData)) {
589
- if (gotAllParams) {
590
- console.log("Creating new order for ", req.body.ORDER_ID)
591
- onOrder(req.body.ORDER_ID)
592
- }
593
- else {
594
- res.send({ message: "Order Not Found or missing required data: " + checkedFields.join(", "), ORDERID: req.body.ORDER_ID })
595
- }
596
- }
597
- else {
598
- onTxn(orderData);
599
- }
600
-
601
- }, usingMultiDbOrm ? Transaction : undefined);
602
- }
603
- else {
604
- let orderId;
605
- if (config.paytm_url) {
606
- orderId = "pay_" + makeid(config.id_length || IDLEN)
607
- onOrder(orderId)
608
- }
609
- else if (config.razor_url) {
610
-
611
- var options = {
612
- amount: req.body.TXN_AMOUNT * 100,
613
- currency: "INR",
614
- receipt: user.id + '_' + Date.now()
615
- };
616
-
617
-
618
- razorPayInstance.orders.create(options, function (err, order) {
619
- if (err) {
620
- res.send({ message: "An error occurred ! " + err.description })
621
- return;
622
- }
623
- orderId = order.id
624
- onOrder(orderId)
625
- })
626
- }
627
- else if (config.open_money_url) {
628
- orderId = "pay_" + makeid(config.id_length || IDLEN)
629
- onOrder(orderId)
630
- } else if (config.payu_url) {
631
- orderId = "payu_" + makeid(config.id_length || IDLEN)
632
- onOrder(orderId)
633
- }
634
-
635
-
636
-
637
- }
638
-
639
-
640
-
641
-
642
-
643
-
644
- });
645
-
646
-
647
- }
648
- else {
649
-
650
-
651
- res.render(vp + "init.hbs", {
652
-
653
- path_prefix: config.path_prefix,
654
- action:"/"+ config.path_prefix+"/init",
655
- readonly: '',
656
- check: true,
657
- BUTTON: 'Submit',
658
- NAME: (req.body.NAME === undefined ? '' : req.body.NAME),
659
- EMAIL: (req.body.EMAIL === undefined ? '' : req.body.EMAIL),
660
- MOBILE_NO: (req.body.MOBILE_NO === undefined ? '' : req.body.MOBILE_NO),
661
- PRODUCT_NAME: (req.body.PRODUCT_NAME === undefined ? '' : req.body.PRODUCT_NAME),
662
- TXN_AMOUNT: (req.body.TXN_AMOUNT === undefined ? '' : req.body.TXN_AMOUNT),
663
- MID: config.MID,
664
- WEBSITE: config.WEBSITE,
665
- ORDER_ID: '',
666
- CUST_ID: '',
667
- INDUSTRY_TYPE_ID: config.INDUSTRY_TYPE_ID,
668
- CHANNEL_ID: config.CHANNEL_ID,
669
- CALLBACK_URL: config.CALLBACK_URL,
670
- CHECKSUMHASH: ''
671
-
672
- })
673
-
674
- }
675
-
676
- }
677
-
678
- async function updateTransaction(req, res) {
679
- var orderToFind = req.body.ORDERID || req.body.ORDER_ID || req.body.ORDERId || (req.query && req.query.order_id) || req.body.ORDER_ID;
680
- var myquery = { orderId: orderToFind };
681
-
682
- let objForUpdate = null;
683
- try {
684
- // try default
685
- objForUpdate = await Transaction.findOne(myquery).catch(() => null);
686
- // try id
687
- if (!objForUpdate) objForUpdate = await Transaction.findOne({ id: orderToFind }).catch(() => null);
688
- // try uppercase key
689
- if (!objForUpdate) objForUpdate = await Transaction.findOne({ ORDERID: orderToFind }).catch(() => null);
690
- } catch (e) {
691
- // ignore lookup errors
692
- objForUpdate = objForUpdate || null;
693
- }
694
-
695
- let returnUrl = objForUpdate ? objForUpdate.returnUrl : null;
696
- if (returnUrl == 'undefined') returnUrl = undefined;
697
-
698
- if (!objForUpdate) {
699
- if (returnUrl) {
700
- let separator = returnUrl.indexOf('?') > -1 ? '&' : '?';
701
- returnUrl = returnUrl + separator + 'status=FAILED&message=txn_not_found&ORDERID=' + req.body.ORDERID;
702
- return res.redirect(returnUrl);
703
- }
704
- return res.send({ message: "Transaction Not Found !", ORDERID: req.body.ORDERID, TXNID: req.body.TXNID });
705
- }
706
-
707
- if (objForUpdate.status != ("INITIATED") && objForUpdate.status != ("TXN_PENDING") && objForUpdate.status != ("PENDING")) {
708
- objForUpdate.readonly = "readonly";
709
- objForUpdate.action = config.homepage;
710
- if (returnUrl) {
711
- let separator = returnUrl.indexOf('?') > -1 ? '&' : '?';
712
- returnUrl = returnUrl + separator + 'status=' + objForUpdate.status + '&ORDERID=' + objForUpdate.orderId + '&TXNID=' + objForUpdate.TXNID;
713
- return res.redirect(returnUrl);
714
- }
715
- else {
716
- return res.render(vp + "result.hbs", {
717
- path_prefix: config.path_prefix,
718
- ...objForUpdate
719
- });
720
- }
721
- }
722
-
723
- if (req.body.status == "paid" && !req.body.STATUS) req.body.STATUS = "TXN_SUCCESS";
724
- objForUpdate.status = req.body.STATUS;
725
- objForUpdate.TXNID = req.body.TXNID;
726
- objForUpdate.extra = JSON.stringify(req.body);
727
-
728
- var newvalues = { $set: objForUpdate };
729
- Transaction.updateOne(myquery, newvalues, function (err, saveRes) {
730
- if (err) {
731
- if (returnUrl) {
732
- let separator = returnUrl.indexOf('?') > -1 ? '&' : '?';
733
- returnUrl = returnUrl + separator + 'status=FAILED&message=update_error&ORDERID=' + req.body.ORDERID;
734
- return res.redirect(returnUrl);
735
- }
736
- return res.send({ message: "Error Occured !", ORDERID: req.body.ORDERID, TXNID: req.body.TXNID });
737
- }
738
-
739
- if (callbacks && typeof callbacks.onFinish === 'function') {
740
- callbacks.onFinish(req.body.ORDERID, objForUpdate);
741
- }
742
- objForUpdate.readonly = "readonly";
743
- objForUpdate.action = config.homepage;
744
- if (returnUrl) {
745
- let separator = returnUrl.indexOf('?') > -1 ? '&' : '?';
746
- returnUrl = returnUrl + separator + 'status=' + objForUpdate.status + '&ORDERID=' + objForUpdate.orderId + '&TXNID=' + objForUpdate.TXNID;
747
- return res.redirect(returnUrl);
748
- }
749
- res.render(vp + "result.hbs", {
750
- path_prefix: config.path_prefix,
751
- ...objForUpdate
752
- });
753
- });
754
- }
755
-
756
- module.callback = async (req, res) => {
757
- console.log("request_data ", req.originalUrl, JSON.stringify(req.body))
758
-
759
- // Normalize common order id and txn id field names (support ORDER_ID, ORDERID, etc.)
760
- try {
761
- if ((!req.body.ORDERID || req.body.ORDERID === '') && req.body.ORDER_ID) {
762
- req.body.ORDERID = req.body.ORDER_ID;
763
- }
764
- if ((!req.body.TXNID || req.body.TXNID === '') && req.body.TXN_ID) {
765
- req.body.TXNID = req.body.TXN_ID;
766
- }
767
- if ((!req.body.ORDERID || req.body.ORDERID === '') && req.query && req.query.order_id) {
768
- req.body.ORDERID = req.query.order_id;
769
- }
770
- } catch (e) {
771
- // ignore
772
- }
773
-
774
- var result = false;
775
- let isCancelled = false;
776
- if (config.paytm_url) {
777
- var checksumhash = req.body.CHECKSUMHASH;
778
- if (checksumhash) {
779
- result = checksum_lib.verifychecksum(req.body, config.KEY, checksumhash);
780
- }
781
- else {
782
- let liveStatus = await new Promise((resolve, reject) => {
783
- getStatusFromPaytm(req.body, req.body.ORDERID, (paytmResponse) => {
784
- resolve(paytmResponse)
785
- })
786
- })
787
- result = liveStatus.STATUS == req.body.STATUS;
788
- }
789
- if (req.body.STATUS == 'TXN_FAILURE' && req.body.CANCELLED == "cancelled" && req.body.TXNID) {
790
- isCancelled = true;
791
- }
792
-
793
- }
794
- else if (config.razor_url) {
795
-
796
- if (req.body.razorpay_payment_id) {
797
- result = checksum_lib.checkRazorSignature(req.body.razorpay_order_id,
798
- req.body.razorpay_payment_id,
799
- config.SECRET,
800
- req.body.razorpay_signature)
801
- if (result) {
802
- req.body.STATUS = 'TXN_SUCCESS'
803
- req.body.ORDERID = req.body.razorpay_order_id
804
- req.body.TXNID = req.body.razorpay_payment_id
805
- }
806
- }
807
- else {
808
- if (req.body.error && req.body.error.metadata && JSON.parse(req.body.error.metadata)) {
809
- let orderId = JSON.parse(req.body.error.metadata).order_id
810
- req.body.razorpay_order_id = orderId
811
- }
812
- req.body.STATUS = 'TXN_FAILURE'
813
- req.body.ORDERID = req.body.razorpay_order_id || req.query.order_id
814
- isCancelled = true;
815
- }
816
- }
817
- else if (config.payu_url) {
818
- const payuRest = await payuInstance.verifyResult(req);
819
- result = payuRest.valid;
820
- req.body.STATUS = payuRest.STATUS;
821
- req.body.TXNID = payuRest.TXNID;
822
- req.body.ORDERID = payuRest.ORDERID || req.query.order_id;
823
- req.body.extras = payuRest.data;
824
- result = true;
825
- isCancelled = payuRest.cancelled;
826
- }
827
- else if (config.open_money_url) {
828
- let openRest = await openMoneyInstance.verifyResult(req);
829
- result = true;
830
- req.body.STATUS = openRest.STATUS
831
- req.body.TXNID = openRest.TXNID
832
- req.body.ORDERID = openRest.ORDERID || req.query.order_id
833
- req.body.extras = openRest.data
834
- }
835
-
836
-
837
- //console.log("Checksum Result => ", result, "\n");
838
- console.log("NodePayTMPG::Transaction => ", req.body.ORDERID, req.body.STATUS);
839
- //console.log(req.body)
840
-
841
- if (result || isCancelled) {
842
-
843
- updateTransaction(req, res);
844
-
845
- }
846
- else {
847
-
848
- res.send({ message: "Something went wrong ! Please try again later .", ORDERID: req.body.ORDERID, TXNID: req.body.TXNID })
849
-
850
- }
851
-
852
- }
853
-
854
- module.webhook = (req, res) => {
855
-
856
-
857
-
858
- console.log("request_data ", req.originalUrl, JSON.stringify(req.body))
859
-
860
- if (config.paytm_url) {
861
- module.callback(req, res)
862
- }
863
- else if (config.razor_url) {
864
- let events = ["payment.captured", "payment.pending", "payment.failed"]
865
- if (req.body.event && events.indexOf(req.body.event) > -1) {
866
- if (req.body.payload &&
867
- req.body.payload.payment &&
868
- req.body.payload.payment.entity) {
869
-
870
- let entity = req.body.payload.payment.entity;
871
- let razorpay_order_id = entity.order_id;
872
- let razorpay_payment_id = entity.id;
873
- let status = entity.status;
874
- let event = req.body.event;
875
- console.log(`Razorpay webhook payment order=${razorpay_order_id} payid=${razorpay_payment_id} status=${status}`)
876
-
877
- let reqBody = req.rawBody, signature = req.headers["x-razorpay-signature"];
878
-
879
- result = RazorPay.validateWebhookSignature(reqBody, req.headers['x-razorpay-signature'], config.SECRET)
880
- req.signatureVerified = result;
881
- if (result) {
882
- if (event == events[0]) {
883
- req.body.STATUS = "TXN_SUCCESS";
884
- }
885
- else if (event == events[1]) { //pending
886
- req.body.STATUS = "TXN_PENDING";
887
- }
888
- else { // failed
889
- req.body.STATUS = "TXN_FAILURE";
890
- }
891
- req.body.ORDERID = razorpay_order_id;
892
- req.body.TXNID = razorpay_payment_id;
893
- setTimeout(() => {
894
- updateTransaction(req, res)
895
- }, 3000)
896
- }
897
- else {
898
- res.status(401)
899
- res.send({ message: "Invalid Rzpay signature" })
900
- }
901
- }
902
- else {
903
- res.status(400)
904
- res.send({ message: "Invalid Payload" })
905
- }
906
- }
907
- else {
908
- res.status(400)
909
- res.send({ message: "Unsupported event : " + req.body.event })
910
- }
911
- }
912
- else if (config.payu_url) {
913
- payuInstance.processWebhook(req, res, updateTransaction)
914
- }
915
- else if (config.open_money_url) {
916
- openMoneyInstance.processWebhook(req, res, updateTransaction)
917
- }
918
- }
919
-
920
- module.createTxn = (req, res) => {
921
-
922
- // mandayory field
923
- const requiredFields = ['NAME', 'EMAIL', 'MOBILE_NO', 'TXN_AMOUNT', 'PRODUCT_NAME'];
924
- const checkedFields = [];
925
- let gotAllParams = true;
926
- requiredFields.forEach(field => {
927
- if (!req.body[field]) {
928
- gotAllParams = false;
929
- checkedFields.push(field);
930
- }
931
- })
932
- if (!gotAllParams) {
933
- res.status(400).send({ message: "Missing required fields", missing: checkedFields });
934
- return;
935
- }
936
-
937
- useController.create({ name: req.body.NAME, email: req.body.EMAIL, phone: req.body.MOBILE_NO },
938
- async function (user) {
939
-
940
-
941
- let id;
942
- if (config.paytm_url) {
943
- id = "pay_" + makeid(config.id_length || IDLEN)
944
- }
945
- else if (config.razor_url) {
946
-
947
- var options = {
948
- amount: req.body.TXN_AMOUNT * 100,
949
- currency: "INR",
950
- receipt: user.id + '_' + Date.now()
951
- };
952
- let order = await razorPayInstance.orders.create(options);
953
- id = order.id;
954
- }
955
- else if (config.payu_url) {
956
- id = "payu_" + makeid(config.id_length || IDLEN)
957
- }
958
- else if (config.open_money_url) {
959
- id = "pay_" + makeid(config.id_length || IDLEN)
960
- }
961
-
962
- var txnTask = new Transaction({
963
- id: id,
964
- orderId: id,
965
- cusId: user.id,
966
- time: Date.now(),
967
- status: 'INITIATED',
968
- name: user.name,
969
- email: user.email,
970
- phone: user.phone,
971
- amount: req.body.TXN_AMOUNT,
972
- pname: req.body.PRODUCT_NAME,
973
- returnUrl: req.body.RETURN_URL || '',
974
- extra: (req.body.EXTRA || '')
975
-
976
- });
977
-
978
-
979
- txnTask.save().then(function (txn) {
980
- var urlData64 = nodeBase64.encode(JSON.stringify({
981
- NAME: txn.name,
982
- EMAIL: txn.email,
983
- MOBILE_NO: txn.phone,
984
- ORDER_ID: txn.orderId,
985
- RETURN_URL: txn.returnUrl,
986
- TXN_AMOUNT: txn.amount,
987
- PRODUCT_NAME: txn.pname
988
- }))
989
-
990
- txn.payurl = config.host_url + '/' + config.path_prefix + '/init?to=' + urlData64;
991
- res.send(txn)
992
- })
993
- .catch(err => {
994
-
995
- console.log(err)
996
-
997
- res.redirect('')
998
- });
999
-
1000
-
1001
- });
1002
-
1003
-
1004
-
1005
- };
1006
-
1007
- module.createTxnToken = (req, res) => {
1008
-
1009
-
1010
- module.createTxn(req, {
1011
- send: function (createTxnResult) {
1012
-
1013
- // console.log(createTxnResult)
1014
-
1015
- req.body.NAME = createTxnResult.name
1016
- req.body.EMAIL = createTxnResult.email
1017
- req.body.MOBILE_NO = createTxnResult.phone
1018
- req.body.ORDER_ID = createTxnResult.orderId
1019
- req.body.RETURN_URL = createTxnResult.returnUrl
1020
- module.init(req, {
1021
- render: (renderPath, initResultRender) => {
1022
- // console.log(initResultRender)
1023
- req.body = initResultRender
1024
-
1025
- module.init(req, {
1026
- send: (initResult) => {
1027
-
1028
- },
1029
- status: (status) => {
1030
- console.log('status', status)
1031
-
1032
- },
1033
- token: (tokenData) => {
1034
- if (!tokenData) {
1035
- res.status(500)
1036
- res.send('Something went wrong. Please try again later.')
1037
- }
1038
- else {
1039
- tokenData.payurl = createTxnResult.payurl;
1040
- res.send(tokenData)
1041
- }
1042
- },
1043
- render: (renderPath2, init2ResultRender) => {
1044
- console.log('init2ResultRender', init2ResultRender)
1045
- },
1046
- end: (initResultWrite) => {
1047
- console.log('initResultWrite', initResultWrite)
1048
- },
1049
- write: (initResultWrite) => {
1050
- console.log('initResultWrite', initResultWrite)
1051
- },
1052
- writeHead: (initResultWriteHead) => {
1053
- console.log('initResultWriteHead', initResultWriteHead)
1054
- }
1055
-
1056
- })
1057
-
1058
- }
1059
- })
1060
- },
1061
- redirect: res.redirect
1062
- })
1063
-
1064
-
1065
- };
1066
-
1067
- // optional user
1068
- module.getTransactions = async (req, res) => {
1069
- // parameters can be from query or body
1070
- // MID, MOBILE_NO, PRODUCT_NAME, EMAIL, NAME, limit, offset
1071
- const params = { ...(req.query || {}), ...(req.body || {}) };
1072
-
1073
- // Basic authz guard if caller supplies MID and it mismatches current config
1074
- if (params.MID && config.MID && params.MID !== config.MID) {
1075
- return res.status(403).send({ message: 'MID mismatch' });
1076
- }
1077
-
1078
- // Build query map from incoming fields to db columns
1079
- const query = {};
1080
- const fieldMap = {
1081
- MOBILE_NO: 'phone',
1082
- PRODUCT_NAME: 'pname',
1083
- EMAIL: 'email',
1084
- NAME: 'name',
1085
- ORDER_ID: 'orderId',
1086
- ORDERID: 'orderId',
1087
- STATUS: 'status'
1088
- };
1089
-
1090
- Object.keys(fieldMap).forEach((key) => {
1091
- if (params[key]) {
1092
- query[fieldMap[key]] = params[key];
1093
- }
1094
- });
1095
-
1096
- // Pagination
1097
- const limit = Math.min(parseInt(params.limit, 10) || 20, 100);
1098
- const offset = Math.max(parseInt(params.offset, 10) || 0, 0);
1099
-
1100
- try {
1101
- let transactions = [];
1102
-
1103
- if (usingMultiDbOrm) {
1104
- const all = await Transaction.db.get(Transaction.modelname, query, {
1105
- sort: [{ field: 'time', order: 'DESC' }]
1106
- });
1107
- const safeAll = Array.isArray(all) ? all : [];
1108
- transactions = safeAll.slice(offset, offset + limit);
1109
- }
1110
- else {
1111
- transactions = await Transaction.find(query)
1112
- .sort({ time: -1 })
1113
- .skip(offset)
1114
- .limit(limit)
1115
- .lean();
1116
- }
1117
-
1118
- return res.send({
1119
- limit,
1120
- offset,
1121
- count: transactions.length,
1122
- transactions
1123
- });
1124
- }
1125
- catch (err) {
1126
- console.log('getTransactions error', err);
1127
- return res.status(500).send({ message: 'Failed to fetch transactions', error: err.message });
1128
- }
1129
- }
1130
-
1131
-
1132
- module.status = (req, res) => {
1133
-
1134
- if (!req.body.ORDERID && req.query.ORDERID) {
1135
- req.body.ORDERID = req.query.ORDERID
1136
- }
1137
- if (!req.body.ORDER_ID && req.query.ORDER_ID) {
1138
- req.body.ORDER_ID = req.query.ORDER_ID
1139
- }
1140
- if(!req.body.ORDER_ID && req.body.ORDERID){
1141
- req.body.ORDER_ID = req.body.ORDERID
1142
- }
1143
- if(!req.body.ORDER_ID){
1144
- return res.status(400).send({ message: "Missing ORDER_ID" })
1145
- }
1146
- var myquery = { orderId: req.body.ORDER_ID };
1147
- Transaction.findOne(myquery, async function (err, orderData) {
1148
-
1149
-
1150
- if (err) {
1151
- res.send(err)
1152
- return
1153
- }
1154
- else if (!orderData) {
1155
- res.send({ message: "Order Not Found or not initiated yet!", ORDER_ID: req.body.ORDER_ID })
1156
- return
1157
- }
1158
- if (orderData.status === "INITIATED") {
1159
-
1160
- var params = {}
1161
- params["MID"] = config.MID;
1162
- params["ORDERID"] = req.body.ORDER_ID;
1163
-
1164
- async function onStatusUpdate(paytmResponse) {
1165
- if (paytmResponse.TXNID.length > 4) {
1166
- orderData.status = paytmResponse.STATUS;
1167
- orderData.extra = JSON.stringify(paytmResponse);
1168
-
1169
- var newvalues = { $set: orderData };
1170
- Transaction.updateOne(myquery, newvalues, function (err, saveRes) {
1171
-
1172
- if (err) {
1173
- res.send({ message: "Error Occured !", ORDERID: paytmResponse.ORDERID, TXNID: paytmResponse.TXNID })
1174
- }
1175
- else {
1176
- if (callbacks && typeof callbacks.onFinish === 'function') {
1177
- callbacks.onFinish(req.body.ORDER_ID, orderData);
1178
- }
1179
- res.send(paytmResponse)
1180
- }
1181
- });
1182
- }
1183
- else {
1184
- res.send(orderData)
1185
-
1186
- }
1187
- }
1188
-
1189
- if (config.paytm_url) {
1190
- getStatusFromPaytm(params, req.body.ORDER_ID, onStatusUpdate)
1191
- }
1192
- else if (config.razor_url) {
1193
- let result = await razorPayInstance.orders.fetch(req.body.ORDER_ID)
1194
- result.ORDERID = req.body.ORDER_ID
1195
- if (result.status == 'paid' && result.amount_due == 0) {
1196
- result.STATUS = 'TXN_SUCCESS'
1197
- let payments = await razorPayInstance.orders.fetchPayments(req.body.ORDER_ID)
1198
- payments.items.forEach(item => {
1199
- if (item.status == 'captured') {
1200
- result.TXNID = item.id
1201
- }
1202
- });
1203
- result.payments = payments;
1204
-
1205
- onStatusUpdate(result)
1206
- }
1207
- else {
1208
- res.send(orderData);
1209
- }
1210
- }
1211
- else if (config.payu_url) {
1212
- let result = await payuInstance.getPaymentStatus(req.body.ORDER_ID)
1213
- if (result && result.transaction_details && result.transaction_details[req.body.ORDER_ID]) {
1214
- let txn = result.transaction_details[req.body.ORDER_ID];
1215
- let status = 'TXN_FAILURE'
1216
- if (txn.status == 'success') {
1217
- status = 'TXN_SUCCESS'
1218
- }
1219
- else if (txn.status == 'pending') {
1220
- status = 'TXN_PENDING'
1221
- }
1222
- onStatusUpdate({
1223
- STATUS: status,
1224
- ORDERID: req.body.ORDER_ID,
1225
- TXNID: txn.mihpayid || txn.txnid,
1226
- payu: txn
1227
- })
1228
- }
1229
- else {
1230
- res.send(orderData);
1231
- }
1232
- }
1233
- else if (config.open_money_url) {
1234
- let extras = JSON.parse(orderData.extra)
1235
- if (!extras || !extras.layer_pay_token_id) {
1236
- res.status(500)
1237
- return res.send({ message: 'An unexpected error occured. No payment token exists' })
1238
- }
1239
- let result = await openMoneyInstance.getPaymentStatus(extras.layer_pay_token_id)
1240
- result = JSON.parse(result)
1241
- result.ORDERID = req.body.ORDER_ID
1242
- if (result.status == 'paid' || result.status == 'captured') {
1243
- result.STATUS = 'TXN_SUCCESS'
1244
- result.TXNID = result.id
1245
- onStatusUpdate(result)
1246
- }
1247
- else if (result.status == 'pending' || result.status == 'attempted') {
1248
- result.STATUS = 'TXN_PENDING'
1249
- result.TXNID = result.id
1250
- onStatusUpdate(result)
1251
- }
1252
- // else if (result.status == 'failed' || result.status == 'cancelled') {
1253
- // result.STATUS = 'TXN_FAILED'
1254
- // result.TXNID = result.id
1255
- // onStatusUpdate(result)
1256
- // }
1257
- else {
1258
- res.send(orderData);
1259
- }
1260
- }
1261
-
1262
- }
1263
- else {
1264
- res.send(orderData);
1265
- }
1266
-
1267
-
1268
- }, usingMultiDbOrm ? Transaction : undefined);
1269
-
1270
-
1271
- }
1272
-
1273
- function getStatusFromPaytm(params, orderId, cb) {
1274
- checksum_lib.genchecksum(params, config.KEY, function (err, checksum) {
1275
-
1276
- request.post(
1277
- config.paytm_url + "/order/status",
1278
- { json: { MID: config.MID, ORDERID: orderId, CHECKSUMHASH: checksum, } },
1279
- function (error, response, body) {
1280
-
1281
- if (!error && response.statusCode == 200) {
1282
- var paytmResponse = JSON.parse(JSON.stringify(body))
1283
- cb(paytmResponse)
1284
- }
1285
- else {
1286
- console.log('ERROR:::', error, '\n', response);
1287
- cb({ message: "Error Occured !", ORDERID: orderId })
1288
- }
1289
- }
1290
- );
1291
- });
1292
- }
1293
-
1294
- return module;
1295
- }