Commit 7da6f68074f2b78e2912114919c18cd64c5f31ae

Authored by Adhidarma Hadiwinoto
1 parent 342d268acc
Exists in master

coba diy tanpa header xml

Showing 2 changed files with 3 additions and 5 deletions Inline Diff

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