Commit 2ab9df305f41c558cf849297dc71c62e23375f84
1 parent
e00a4632fb
Exists in
master
ready to test
Showing 5 changed files with 206 additions and 0 deletions Inline Diff
.gitignore
File was created | 1 | /node_modules/ | |
2 | /config.ini | ||
3 | /logs/ | ||
4 |
README
1 | ST24 Gateway to KOMODO | ||
2 | |||
3 |
index.js
File was created | 1 | "use strict"; | |
2 | |||
3 | var aaa = require('sate24/aaa.js'); | ||
4 | var expresso = require('sate24-expresso'); | ||
5 | var logger = require('sate24/logger.js').start(); | ||
6 | var HttpServer = require('sate24/httpserver.js'); | ||
7 | var partner = require('./partner-komodo.js'); | ||
8 | |||
9 | var fs = require('fs'); | ||
10 | var ini = require('ini'); | ||
11 | var config = ini.parse(fs.readFileSync(__dirname + '/config.ini', 'utf-8')); | ||
12 | |||
13 | process.chdir(__dirname); | ||
14 | |||
15 | var logDirectory = __dirname + '/logs'; | ||
16 | fs.existsSync(logDirectory) || fs.mkdirSync(logDirectory); | ||
17 | |||
18 | var matrix = aaa.prepareMatrix(); | ||
19 | |||
20 | var options = { | ||
21 | 'aaa': aaa, | ||
22 | 'logger': logger, | ||
23 | 'config': config, | ||
24 | 'matrix': matrix, | ||
25 | } | ||
26 | |||
27 | var httpServer = HttpServer.start(config, options); | ||
28 | |||
29 | partner.start(options); | ||
30 | aaa.start(config, partner, options); | ||
31 | expresso.start(options); | ||
32 |
package.json
File was created | 1 | { | |
2 | "name": "sate24-to-komodo", | ||
3 | "version": "1.0.0", | ||
4 | "description": "ST24 Gateway to KOMODO", | ||
5 | "main": "index.js", | ||
6 | "scripts": { | ||
7 | "test": "mocha" | ||
8 | }, | ||
9 | "repository": { | ||
10 | "type": "git", | ||
11 | "url": "git@gitlab.kodesumber.com:reload97/sate24-to-komodo.git" | ||
12 | }, | ||
13 | "keywords": [ | ||
14 | "ppob", | ||
15 | "st24", | ||
16 | "payment", | ||
17 | "reload97", | ||
18 | "r97", | ||
19 | "komodo" | ||
20 | ], | ||
21 | "author": "Adhidarma Hadiwinoto <me@adhisimon.org>", | ||
22 | "license": "ISC", | ||
23 | "dependencies": { | ||
24 | "request": "^2.81.0", | ||
25 | "sate24": "git+http://gitlab.kodesumber.com/reload97/node-sate24.git", | ||
26 | "sate24-expresso": "git+http://gitlab.kodesumber.com/reload97/sate24-expresso.git" | ||
27 | } | ||
28 | } | ||
29 |
partner-komodo.js
File was created | 1 | "use strict"; | |
2 | |||
3 | const request = require('request'); | ||
4 | const resendDelay = require('sate24/resend-delay') | ||
5 | |||
6 | var config; | ||
7 | var aaa; | ||
8 | var logger; | ||
9 | |||
10 | let komodoRc = { | ||
11 | '03': '40', | ||
12 | '13': '13', | ||
13 | '14': '14', | ||
14 | '30': '40', | ||
15 | '68': '68', | ||
16 | '55': '55', | ||
17 | '91': '91', | ||
18 | '92': '40', | ||
19 | '96': '68' | ||
20 | } | ||
21 | |||
22 | function start(options) { | ||
23 | if (!options) { | ||
24 | console.log('Undefined options, terminating....'); | ||
25 | process.exit(1); | ||
26 | } | ||
27 | |||
28 | if (options.config) { | ||
29 | config = options.config; | ||
30 | } else { | ||
31 | console.log('Undefined options.config, terminating....') | ||
32 | process.exit(1); | ||
33 | } | ||
34 | |||
35 | if (options.aaa) { | ||
36 | aaa = options.aaa; | ||
37 | } else { | ||
38 | console.log('Undefined options.aaa, terminating....') | ||
39 | process.exit(1); | ||
40 | } | ||
41 | |||
42 | if (options && options.logger) { | ||
43 | logger = options.logger; | ||
44 | } else { | ||
45 | console.log('Undefined options.logger, terminating....') | ||
46 | process.exit(1); | ||
47 | } | ||
48 | |||
49 | resendDelay.init({config: config, logger: logger, topupRequest: topupAdvice}); | ||
50 | } | ||
51 | |||
52 | function callbackReport(requestId, rc, message, options) { | ||
53 | aaa.callbackReportWithPushToMongoDb(requestId, rc, message); | ||
54 | |||
55 | if (!options.task) { | ||
56 | return; | ||
57 | } | ||
58 | |||
59 | if (rc == '68') { | ||
60 | resendDelay.register(options.task); | ||
61 | } else { | ||
62 | resendDelay.cancel(options.task) | ||
63 | } | ||
64 | |||
65 | } | ||
66 | |||
67 | function topupRequest(task, pendingOnConnectError) { | ||
68 | aaa.insertTaskToMongoDb(task); | ||
69 | |||
70 | const requestOptions = { | ||
71 | url: config.h2h_out.partner, | ||
72 | qs: { | ||
73 | terminal_name: config.h2h_out.username, | ||
74 | password: config.h2h_out.password, | ||
75 | product_name: task.remoteProduct, | ||
76 | destination: task.destination, | ||
77 | request_id: task.requestId | ||
78 | } | ||
79 | } | ||
80 | |||
81 | request(requestOptions, function(err, response, body) { | ||
82 | if (err) { | ||
83 | logger.warn('Error requesting to partner', {err: err}); | ||
84 | |||
85 | let rc = '68'; | ||
86 | |||
87 | if (err.syscall == 'connect' && !pendingOnConnectError) { | ||
88 | rc = '91'; | ||
89 | } | ||
90 | callbackReport(task.requestId, rc, 'Error requesting to partner: ' + err); | ||
91 | return; | ||
92 | } | ||
93 | |||
94 | if (response.statusCode != 200) { | ||
95 | let rc = '68'; | ||
96 | |||
97 | callbackReport(task.requestId, rc, 'Partner returning HTTP status code ' + response.statusCode + ', not 200'); | ||
98 | return; | ||
99 | } | ||
100 | |||
101 | let result = parsePartnerMessage(body); | ||
102 | if (!result) { | ||
103 | callbackReport(task.requestId, '40', 'Error parsing response from partner. Partner response: ' + body); | ||
104 | return; | ||
105 | } | ||
106 | |||
107 | let st24Rc = '68'; | ||
108 | |||
109 | if (komodoRc[result.rc]) { | ||
110 | st24Rc = komodoRc[result.rc]; | ||
111 | } | ||
112 | |||
113 | let st24Message = result.message; | ||
114 | if (result.sn) { | ||
115 | st24Message = 'SN=' + result.sn + '; ' + st24Message; | ||
116 | } | ||
117 | |||
118 | callbackReport(task.requestId, st24Rc, st24Message); | ||
119 | }) | ||
120 | } | ||
121 | |||
122 | function topupAdvice(task) { | ||
123 | topupRequest(task, true); | ||
124 | } | ||
125 | |||
126 | function parsePartnerMessage(partner_message) { | ||
127 | let result; | ||
128 | try { | ||
129 | result = JSON.parse(partner_message); | ||
130 | |||
131 | } | ||
132 | catch(e) { | ||
133 | result = null; | ||
134 | } | ||
135 | |||
136 | return result; | ||
137 | } | ||
138 | |||
139 | |||
140 | exports.start = start; | ||
141 | exports.topupRequest = topupRequest; | ||
142 | exports.topupAdvice = topupAdvice; | ||
143 |