Commit e7d59da2577400259b22bcc83f590b2cfffa2d43

Authored by Adhidarma Hadiwinoto
1 parent ada1b7aad5
Exists in master

require url

Showing 1 changed file with 1 additions and 0 deletions Inline Diff

partner-kospinjasa.js
1 var winston = require('winston'); 1 var winston = require('winston');
2 var soap = require('soap'); 2 var soap = require('soap');
3 var crypto = require('crypto'); 3 var crypto = require('crypto');
4 var strftime = require('strftime'); 4 var strftime = require('strftime');
5 var fs = require("fs"); 5 var fs = require("fs");
6 var whiskers = require("whiskers"); 6 var whiskers = require("whiskers");
7 var http = require("http"); 7 var http = require("http");
8 var url = require("url");
8 9
9 process.chdir(__dirname); 10 process.chdir(__dirname);
10 var soapTemplate = fs.readFileSync("message.xml"); 11 var soapTemplate = fs.readFileSync("message.xml");
11 12
12 var max_retry = 10; 13 var max_retry = 10;
13 var sleep_before_retry = 5000; 14 var sleep_before_retry = 5000;
14 15
15 var config; 16 var config;
16 var callbackReport; 17 var callbackReport;
17 var aaa; 18 var aaa;
18 var logger; 19 var logger;
19 var options; 20 var options;
20 21
21 function start(_config, _callbackReport, options) { 22 function start(_config, _callbackReport, options) {
22 config = _config; 23 config = _config;
23 callbackReport = _callbackReport 24 callbackReport = _callbackReport
24 25
25 if (options && options.aaa) { 26 if (options && options.aaa) {
26 aaa = options.aaa; 27 aaa = options.aaa;
27 } 28 }
28 29
29 if (options && options.logger) { 30 if (options && options.logger) {
30 logger = options.logger; 31 logger = options.logger;
31 } else { 32 } else {
32 logger = new winston.Logger({ 33 logger = new winston.Logger({
33 transports: [ 34 transports: [
34 new (winston.transports.Console)() 35 new (winston.transports.Console)()
35 ] 36 ]
36 }); 37 });
37 } 38 }
38 } 39 }
39 40
40 function topupRequest(task, retry) { 41 function topupRequest(task, retry) {
41 if (retry === undefined) { 42 if (retry === undefined) {
42 retry = max_retry; 43 retry = max_retry;
43 } 44 }
44 45
45 var remoteProduct = task.remoteProduct.split(','); 46 var remoteProduct = task.remoteProduct.split(',');
46 var params = { 47 var params = {
47 userName: config.h2h_out.userid, 48 userName: config.h2h_out.userid,
48 productCode: remoteProduct[0] , 49 productCode: remoteProduct[0] ,
49 terminal: 'terminal0', 50 terminal: 'terminal0',
50 transactionType: '50', 51 transactionType: '50',
51 billNumber: createBillNumber(task.destination), 52 billNumber: createBillNumber(task.destination),
52 amount: remoteProduct[1], 53 amount: remoteProduct[1],
53 bit61: createBillNumber(task.destination), 54 bit61: createBillNumber(task.destination),
54 reff: task.requestId, 55 reff: task.requestId,
55 timeStamp: strftime('%d-%m-%Y %H:%M:%S', new Date()) 56 timeStamp: strftime('%d-%m-%Y %H:%M:%S', new Date())
56 } 57 }
57 58
58 var signature = createSignature(params, config.h2h_out.password); 59 var signature = createSignature(params, config.h2h_out.password);
59 params.signature = signature; 60 params.signature = signature;
60 61
61 topupRequestSoapDIY(task, params, retry); 62 topupRequestSoapDIY(task, params, retry);
62 } 63 }
63 64
64 function topupRequestSoap(task, params, retry) { 65 function topupRequestSoap(task, params, retry) {
65 66
66 soap.createClient(config.h2h_out.partner, function(err, soapClient) { 67 soap.createClient(config.h2h_out.partner, function(err, soapClient) {
67 68
68 var _params = { 69 var _params = {
69 userName: params.userName, 70 userName: params.userName,
70 signature: params.signature, 71 signature: params.signature,
71 productCode: params.productCode, 72 productCode: params.productCode,
72 terminal: params.terminal, 73 terminal: params.terminal,
73 transactionType: params.transactionType, 74 transactionType: params.transactionType,
74 billNumber: params.billNumber, 75 billNumber: params.billNumber,
75 amount: params.amount, 76 amount: params.amount,
76 bit61: params.bit61, 77 bit61: params.bit61,
77 reff: params.reff, 78 reff: params.reff,
78 timeStamp: params.timeStamp 79 timeStamp: params.timeStamp
79 } 80 }
80 81
81 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params}); 82 logger.info('Requesting to service', {url: config.h2h_out.partner, params: _params});
82 83
83 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) { 84 soapClient.apih2h.apih2hPort.billpayment({ inputCheck: _params }, function(err, result) {
84 85
85 logger.info('Got response', {lastRequest: soapClient.lastRequest}); 86 logger.info('Got response', {lastRequest: soapClient.lastRequest});
86 87
87 if (err) { 88 if (err) {
88 logger.warn('Error requesting service', {err: err}); 89 logger.warn('Error requesting service', {err: err});
89 callbackReport(task.requestId, '68', 'something wrong'); 90 callbackReport(task.requestId, '68', 'something wrong');
90 return; 91 return;
91 } 92 }
92 93
93 var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value; 94 var responseMessageToST24 = result.outputParameter.resultCode.$value + ' - ' + result.outputParameter.resultDesc.$value;
94 95
95 logger.info('Got result: ' + responseMessageToST24, {result: result}); 96 logger.info('Got result: ' + responseMessageToST24, {result: result});
96 97
97 callbackReport(task.requestId, '68', responseMessageToST24); 98 callbackReport(task.requestId, '68', responseMessageToST24);
98 }); 99 });
99 }); 100 });
100 } 101 }
101 102
102 function topupRequestSoapDIY(task, params, retry) { 103 function topupRequestSoapDIY(task, params, retry) {
103 var message = whiskers.render(soapTemplate, params); 104 var message = whiskers.render(soapTemplate, params);
104 logger.verbose("Generating SOAP message", {message: message}); 105 logger.verbose("Generating SOAP message", {message: message});
105 106
106 var partnerUrl = url.parse(config.h2h_out.partner); 107 var partnerUrl = url.parse(config.h2h_out.partner);
107 var postRequest = { 108 var postRequest = {
108 host: partnerUrl.hostname, 109 host: partnerUrl.hostname,
109 path: partnerUrl.path, 110 path: partnerUrl.path,
110 port: partnerUrl.port, 111 port: partnerUrl.port,
111 method: "POST", 112 method: "POST",
112 headers: { 113 headers: {
113 'Content-Type': 'application/soap', 114 'Content-Type': 'application/soap',
114 'Content-Length': Buffer.byteLength(message) 115 'Content-Length': Buffer.byteLength(message)
115 } 116 }
116 }; 117 };
117 118
118 logger.info('POST to partner', {postRequest: postRequest}); 119 logger.info('POST to partner', {postRequest: postRequest});
119 var req = http.request(postRequest, function( res ) { 120 var req = http.request(postRequest, function( res ) {
120 121
121 logger.verbose('Request status code: ' + res.statusCode ); 122 logger.verbose('Request status code: ' + res.statusCode );
122 var buffer = ""; 123 var buffer = "";
123 124
124 res.on( "data", function( data ) { 125 res.on( "data", function( data ) {
125 buffer = buffer + data; 126 buffer = buffer + data;
126 }); 127 });
127 128
128 res.on( "end", function( data ) { 129 res.on( "end", function( data ) {
129 topupResponseHandler(buffer, task); 130 topupResponseHandler(buffer, task);
130 }); 131 });
131 132
132 }); 133 });
133 134
134 req.on('error', function(e) { 135 req.on('error', function(e) {
135 logger.warn('problem with request: ' + e.message); 136 logger.warn('problem with request: ' + e.message);
136 callbackReport(task.requestId, '68', e.message); 137 callbackReport(task.requestId, '68', e.message);
137 138
138 topupRequestRetry(task); 139 topupRequestRetry(task);
139 }); 140 });
140 141
141 req.write(message); 142 req.write(message);
142 req.end(); 143 req.end();
143 } 144 }
144 145
145 function topupResponseHandler(response, task) { 146 function topupResponseHandler(response, task) {
146 logger.verbose('Got response', {response: response, task: task}); 147 logger.verbose('Got response', {response: response, task: task});
147 callbackReport(task.requestId, '68', 'Got response'); 148 callbackReport(task.requestId, '68', 'Got response');
148 } 149 }
149 150
150 function topupRequestRetry(task) { 151 function topupRequestRetry(task) {
151 task.retry--; 152 task.retry--;
152 153
153 if (task.retry > 0) { 154 if (task.retry > 0) {
154 logger.info('Retrying in ' + sleepBeforeRetry + 's'); 155 logger.info('Retrying in ' + sleepBeforeRetry + 's');
155 setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry); 156 setTimeout(topupRequest, sleepBeforeRetry * 1000, task, task.retry);
156 } 157 }
157 else { 158 else {
158 logger.warn('Maximum retry for pending status exceeded', {task: task}); 159 logger.warn('Maximum retry for pending status exceeded', {task: task});
159 } 160 }
160 } 161 }
161 162
162 163
163 164
164 165
165 function createSignature(params, password) { 166 function createSignature(params, password) {
166 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex'); 167 var passwordHash = crypto.createHash('sha256').update(password).digest().toString('hex');
167 168
168 var plain = 169 var plain =
169 params.userName 170 params.userName
170 + passwordHash 171 + passwordHash
171 + params.productCode 172 + params.productCode
172 + params.terminal 173 + params.terminal
173 + params.transactionType 174 + params.transactionType
174 + params.billNumber 175 + params.billNumber
175 + params.amount 176 + params.amount
176 + params.reff 177 + params.reff
177 + params.timeStamp; 178 + params.timeStamp;
178 179
179 var result = crypto.createHash('sha1').update(plain).digest().toString('hex'); 180 var result = crypto.createHash('sha1').update(plain).digest().toString('hex');
180 181
181 if (logger) { 182 if (logger) {
182 logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password}); 183 logger.verbose('Calculating signature', {plain: plain, result: result, params: params, password: password});
183 } 184 }
184 185
185 return result; 186 return result;
186 } 187 }
187 188
188 function createBillNumber(destination) { 189 function createBillNumber(destination) {
189 return ("0000000000000" + destination).slice(-13); 190 return ("0000000000000" + destination).slice(-13);
190 } 191 }
191 192
192 exports.start = start; 193 exports.start = start;
193 exports.topupRequest = topupRequest; 194 exports.topupRequest = topupRequest;
194 exports.createSignature = createSignature; 195 exports.createSignature = createSignature;
195 exports.createBillNumber = createBillNumber; 196 exports.createBillNumber = createBillNumber;
196 197