Commit 1e63f374193d04ff7db95d5d698a8901bb12e289
1 parent
385d8ff594
Exists in
master
Number on amount and ending_balance
Showing 2 changed files with 4 additions and 4 deletions Inline Diff
lib/callback/handler-prepaid.js
1 | const MODULE_NAME = 'CALLBACK.HANDLER-PREPAID'; | 1 | const MODULE_NAME = 'CALLBACK.HANDLER-PREPAID'; |
2 | 2 | ||
3 | const logger = require('komodo-sdk/logger'); | 3 | const logger = require('komodo-sdk/logger'); |
4 | const report = require('../report/prepaid'); | 4 | const report = require('../report/prepaid'); |
5 | const getFromReq = require('../get-from-params-body-qs'); | 5 | const getFromReq = require('../get-from-params-body-qs'); |
6 | const translateRc = require('../translate-rc'); | 6 | const translateRc = require('../translate-rc'); |
7 | 7 | ||
8 | module.exports = (req, res) => { | 8 | module.exports = (req, res) => { |
9 | const { xid } = res.locals; | 9 | const { xid } = res.locals; |
10 | res.json({ | 10 | res.json({ |
11 | status: 'OK', | 11 | status: 'OK', |
12 | error: null, | 12 | error: null, |
13 | ts: new Date(), | 13 | ts: new Date(), |
14 | xid, | 14 | xid, |
15 | }); | 15 | }); |
16 | 16 | ||
17 | const rcFromRequest = getFromReq(req, 'rc'); | 17 | const rcFromRequest = getFromReq(req, 'rc'); |
18 | const translatedRc = rcFromRequest && (translateRc[rcFromRequest] || rcFromRequest); | 18 | const translatedRc = rcFromRequest && (translateRc[rcFromRequest] || rcFromRequest); |
19 | logger.verbose(`${MODULE_NAME} 2B7BE44D: RC translated`, { | 19 | logger.verbose(`${MODULE_NAME} 2B7BE44D: RC translated`, { |
20 | xid, | 20 | xid, |
21 | rcFromRequest, | 21 | rcFromRequest, |
22 | translatedRc, | 22 | translatedRc, |
23 | }); | 23 | }); |
24 | 24 | ||
25 | report(xid, { | 25 | report(xid, { |
26 | trx_id: getFromReq(req, 'request_id'), | 26 | trx_id: getFromReq(req, 'request_id'), |
27 | rc: translatedRc || '68', | 27 | rc: translatedRc || '68', |
28 | sn: getFromReq(req, 'sn'), | 28 | sn: getFromReq(req, 'sn'), |
29 | amount: getFromReq(req, 'amount'), | 29 | amount: Number(getFromReq(req, 'amount')) || undefined, |
30 | balance: getFromReq(req, 'ending_balance'), | 30 | balance: Number(getFromReq(req, 'ending_balance')) || undefined, |
31 | message: { | 31 | message: { |
32 | xid, | 32 | xid, |
33 | CALLBACK: { | 33 | CALLBACK: { |
34 | ip: req.ip, | 34 | ip: req.ip, |
35 | method: req.method, | 35 | method: req.method, |
36 | body: req.body, | 36 | body: req.body, |
37 | qs: req.query, | 37 | qs: req.query, |
38 | }, | 38 | }, |
39 | }, | 39 | }, |
40 | }); | 40 | }); |
41 | }; | 41 | }; |
42 | 42 |
lib/hit/prepaid.js
1 | const MODULE_NAME = 'HIT.PREPAID'; | 1 | const MODULE_NAME = 'HIT.PREPAID'; |
2 | 2 | ||
3 | const axios = require('axios').default; | 3 | const axios = require('axios').default; |
4 | const urljoin = require('url-join'); | 4 | const urljoin = require('url-join'); |
5 | const uniqid = require('uniqid'); | 5 | const uniqid = require('uniqid'); |
6 | 6 | ||
7 | const config = require('komodo-sdk/config'); | 7 | const config = require('komodo-sdk/config'); |
8 | const logger = require('komodo-sdk/logger'); | 8 | const logger = require('komodo-sdk/logger'); |
9 | 9 | ||
10 | const report = require('../report/prepaid'); | 10 | const report = require('../report/prepaid'); |
11 | const translateRc = require('../translate-rc'); | 11 | const translateRc = require('../translate-rc'); |
12 | const composeCallbackUrl = require('./compose-callback-url'); | 12 | const composeCallbackUrl = require('./compose-callback-url'); |
13 | const dumpReqRes = require('./dump-req-res'); | 13 | const dumpReqRes = require('./dump-req-res'); |
14 | 14 | ||
15 | module.exports = async (task, isAdvice) => { | 15 | module.exports = async (task, isAdvice) => { |
16 | const xid = uniqid(); | 16 | const xid = uniqid(); |
17 | 17 | ||
18 | logger.verbose(`${MODULE_NAME} 2272F01F: Processing task`, { | 18 | logger.verbose(`${MODULE_NAME} 2272F01F: Processing task`, { |
19 | xid, | 19 | xid, |
20 | isAdvice, | 20 | isAdvice, |
21 | task, | 21 | task, |
22 | }); | 22 | }); |
23 | 23 | ||
24 | const params = { | 24 | const params = { |
25 | request_id: task.trx_id, | 25 | request_id: task.trx_id, |
26 | terminal_name: config.partner.terminal_name, | 26 | terminal_name: config.partner.terminal_name, |
27 | password: config.partner.password, | 27 | password: config.partner.password, |
28 | destination: task.destination, | 28 | destination: task.destination, |
29 | product_name: task.remote_product, | 29 | product_name: task.remote_product, |
30 | reverse_url: composeCallbackUrl(xid, false), | 30 | reverse_url: composeCallbackUrl(xid, false), |
31 | }; | 31 | }; |
32 | 32 | ||
33 | const endpointUrl = isAdvice | 33 | const endpointUrl = isAdvice |
34 | ? urljoin(config.partner.url, '/trx-status') | 34 | ? urljoin(config.partner.url, '/trx-status') |
35 | : urljoin(config.partner.url, '/topup'); | 35 | : urljoin(config.partner.url, '/topup'); |
36 | 36 | ||
37 | let lastResponse = null; | 37 | let lastResponse = null; |
38 | 38 | ||
39 | try { | 39 | try { |
40 | logger.verbose(`${MODULE_NAME} 4AAD4F99: Going to HIT prepaid endpoint`, { | 40 | logger.verbose(`${MODULE_NAME} 4AAD4F99: Going to HIT prepaid endpoint`, { |
41 | xid, | 41 | xid, |
42 | endpointUrl, | 42 | endpointUrl, |
43 | params, | 43 | params, |
44 | }); | 44 | }); |
45 | 45 | ||
46 | const response = await axios.get(endpointUrl, { | 46 | const response = await axios.get(endpointUrl, { |
47 | headers: { | 47 | headers: { |
48 | 'User-Agent': 'KOMODO-GW-HTTPGETX', | 48 | 'User-Agent': 'KOMODO-GW-HTTPGETX', |
49 | }, | 49 | }, |
50 | timeout: config.partner.hit_timeout_ms || 60 * 1000, | 50 | timeout: config.partner.hit_timeout_ms || 60 * 1000, |
51 | params, | 51 | params, |
52 | }); | 52 | }); |
53 | 53 | ||
54 | if (!response) { | 54 | if (!response) { |
55 | const e = new Error(`${MODULE_NAME} 8CF4E04D: Empty response`); | 55 | const e = new Error(`${MODULE_NAME} 8CF4E04D: Empty response`); |
56 | e.rc = '68'; | 56 | e.rc = '68'; |
57 | e.response = response; | 57 | e.response = response; |
58 | throw e; | 58 | throw e; |
59 | } | 59 | } |
60 | 60 | ||
61 | if (!response.data) { | 61 | if (!response.data) { |
62 | const e = new Error(`${MODULE_NAME} E72B5A53: Empty response data`); | 62 | const e = new Error(`${MODULE_NAME} E72B5A53: Empty response data`); |
63 | e.rc = '68'; | 63 | e.rc = '68'; |
64 | e.response = response; | 64 | e.response = response; |
65 | throw e; | 65 | throw e; |
66 | } | 66 | } |
67 | 67 | ||
68 | if (typeof response.data !== 'object') { | 68 | if (typeof response.data !== 'object') { |
69 | const e = new Error(`${MODULE_NAME} 507680AB: Response data is not a JSON`); | 69 | const e = new Error(`${MODULE_NAME} 507680AB: Response data is not a JSON`); |
70 | e.rc = '68'; | 70 | e.rc = '68'; |
71 | e.response = response; | 71 | e.response = response; |
72 | throw e; | 72 | throw e; |
73 | } | 73 | } |
74 | 74 | ||
75 | lastResponse = response; | 75 | lastResponse = response; |
76 | 76 | ||
77 | logger.verbose(`${MODULE_NAME} E51AFBBA: Got a direct response`, { | 77 | logger.verbose(`${MODULE_NAME} E51AFBBA: Got a direct response`, { |
78 | xid, | 78 | xid, |
79 | responseBody: response.data, | 79 | responseBody: response.data, |
80 | }); | 80 | }); |
81 | 81 | ||
82 | report(xid, { | 82 | report(xid, { |
83 | trx_id: task.trx_id, | 83 | trx_id: task.trx_id, |
84 | rc: response.data.rc ? translateRc[response.data.rc] || response.data.rc | 84 | rc: response.data.rc ? translateRc[response.data.rc] || response.data.rc |
85 | : '68', | 85 | : '68', |
86 | sn: response.data.sn || null, | 86 | sn: response.data.sn || null, |
87 | amount: 0, | 87 | amount: Number(response.data.amount) || undefined, |
88 | balance: 0, | 88 | balance: Number(response.data.ending_balance) || undefined, |
89 | message: { | 89 | message: { |
90 | xid, | 90 | xid, |
91 | 'DIRECT-RESPONSE': response.data, | 91 | 'DIRECT-RESPONSE': response.data, |
92 | 'IS-ADVICE': !!isAdvice, | 92 | 'IS-ADVICE': !!isAdvice, |
93 | }, | 93 | }, |
94 | }); | 94 | }); |
95 | } catch (e) { | 95 | } catch (e) { |
96 | const rc = e.rc || '68'; | 96 | const rc = e.rc || '68'; |
97 | 97 | ||
98 | lastResponse = e.response; | 98 | lastResponse = e.response; |
99 | 99 | ||
100 | report(xid, { | 100 | report(xid, { |
101 | trx_id: task.trx_id, | 101 | trx_id: task.trx_id, |
102 | rc, | 102 | rc, |
103 | message: { | 103 | message: { |
104 | xid, | 104 | xid, |
105 | 'KOMODO-GW-ERROR': { | 105 | 'KOMODO-GW-ERROR': { |
106 | eCode: e.code, | 106 | eCode: e.code, |
107 | eMessage: e.message, | 107 | eMessage: e.message, |
108 | responseHttpStatus: e.response && e.response.status, | 108 | responseHttpStatus: e.response && e.response.status, |
109 | responseBody: e.response && e.response.data, | 109 | responseBody: e.response && e.response.data, |
110 | }, | 110 | }, |
111 | 'IS-ADVICE': !!isAdvice, | 111 | 'IS-ADVICE': !!isAdvice, |
112 | }, | 112 | }, |
113 | }); | 113 | }); |
114 | } finally { | 114 | } finally { |
115 | dumpReqRes( | 115 | dumpReqRes( |
116 | xid, | 116 | xid, |
117 | task, | 117 | task, |
118 | 'GET', | 118 | 'GET', |
119 | endpointUrl, | 119 | endpointUrl, |
120 | params, | 120 | params, |
121 | lastResponse && lastResponse.data, | 121 | lastResponse && lastResponse.data, |
122 | lastResponse && lastResponse.status, | 122 | lastResponse && lastResponse.status, |
123 | lastResponse, | 123 | lastResponse, |
124 | ); | 124 | ); |
125 | } | 125 | } |
126 | }; | 126 | }; |
127 | 127 |