partner.js
3.06 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
"use strict";
const request = require('request');
const config = require('komodo-sdk/config');
const logger = require('komodo-sdk/logger');
const matrix = require('komodo-sdk/matrix');
const pull = require('komodo-sdk/gateway/pull');
const misc = require('./partner-misc');
/**
* Pembelian ke partner
*
* Merupakan fungsi mandatory yang harus dimiliki oleh setiap gateway.
*/
function buy(task) {
_requestToPartner(task, false);
}
/**
* Pemeriksaan status transaksi ke partner
* Merupakan fungsi mandatory yang harus dimiliki oleh setiap gateway.
*/
function statusCheck(task) {
_requestToPartner(task, true);
}
/**
* Mengirim request ke partner.
*
* Untuk digunakan oleh buy dan checkStatus.
*/
function _requestToPartner(task, pendingOnError) {
const requestOptions = misc.createRequestOptions(task, config);
logger.verbose('Requeting to partner', {requestOptions: requestOptions});
request.post(requestOptions, function(err, res, body) {
if (err) {
let rc = '68';
if (!pendingOnError) { rc = '91'; }
logger.warn('Error requesting to partner', {task: task, err: err})
reportToCore({
trx_id: task.trx_id,
rc: rc,
message: 'Error requesting to partner: ' + err,
handler: config.handler_name,
task: task
})
return;
}
if (res.statusCode != 200) {
let rc = '68';
logger.warn('Partner returning non 200 HTTP STATUS CODE', {task: task, http_status_code: res.statusCode})
reportToCore({
trx_id: task.trx_id,
rc: rc,
message: 'Partner returning HTTP STATUS CODE ' + res.statusCode + ' instead of 200',
handler: config.handler_name,
task: task
})
return;
}
misc.processPartnerResponseBody(body, task);
})
}
/**
* Mengirim report hasil transaksi ke CORE
*/
function reportToCore(data) {
pull.report(data);
if (data && data.task && data.rc == '68') {
let delay_ms = 60 * 1000;
if (config.auto_resend && config.auto_resend.delay_ms) {
delay_ms = Number(config.auto_resend.delay_ms);
}
let max_retry = 60;
if (config.auto_resend && config.auto_resend.max_retry) {
max_retry = Number(config.auto_resend.max_retry);
}
setTimeout(
function() {
if (data.task.remaining_retry === undefined) {
data.task.remaining_retry = max_retry;
}
if (data.task.remaining_retry--) {
logger.verbose('Got pending status, retrying', {task: data.task});
statusCheck(data.task);
}
else {
logger.verbose('Exceeding retry pending status', {task: data.task});
}
},
delay_ms
)
}
}
exports.buy = buy;
exports.statusCheck = statusCheck;
exports.reportToCore = reportToCore;