ipayafrica
Version:
Integrates ipay africa payment gateway in your [node/io].js applications
179 lines (170 loc) • 6.81 kB
JavaScript
var http=require('http');
var https=require('https');
var crypto=require('crypto');
var querystring = require('querystring');
var unirest = require('unirest');
exports.IpayAfrica=function(options){
var self=this;
this.live=0;
this.vid="demo";
this.hash_key="demoCHANGED";
this.transaction={
validate:function(params,callb){self.transaction_search(params,callb)}
,mobilemoney:function(params,callb){self.transaction_mobilemoney(params,callb)}
,search:function(params,callb){self.transaction_search(params,callb)}
,push_mpesa:function(params,callb){self.transaction_push_mpesa(params,callb)}
,push_airtel:function(params,callb){self.transaction_push_airtel(params,callb)}
,refund:function(params,callb){self.transaction_refund(params,callb)}
};
this.init(options);
}
Object.assign(exports.IpayAfrica.prototype,{
init:function(options){
var _options=Object.assign({},this,options);
var valid_keys=['live','vid','hash_key'];
valid_keys.map((key)=>{if(options[key]!=="undefined")this[key]=_options[key];});
////////////
return this;
}
,transact:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['live','oid','inv','amount','tel','eml','vid','curr','p1','p2','p3','p4','cst','cbk'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transact")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
,transaction_search:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['oid','vid'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transaction/search")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
,transaction_mobilemoney:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['sid','vid'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transact/mobilemoney")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
,transaction_validate:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['account','amount','oid','sid','mpesa','paybill','airtel','airtel_paybill'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transaction/search")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
,transaction_push_mpesa:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['phone','vid','sid'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transact/push/mpesa")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
,transaction_push_airtel:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['phone','vid','sid'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transact/push/airtel")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
,transaction_refund:function(data,callb){
var req={},key_order="",to_be_hashed="",hash="",_query={},_query_str="";
key_order=['code','vid'];
to_be_hashed=createHashString(this,key_order,data);
hash=craeteHash(this,{algo:'sha256'},to_be_hashed);//console.log(hash);
_query=Object.assign({},data,{hash:hash});
_query_str=createQueryStr(this,key_order,_query);
_query_str+="&hash="+hash+"";
req = unirest.post("https://apis.ipayafrica.com/payments/v2/transaction/refund")
.headers({
'Content-Type': 'application/x-www-form-urlencoded'
}).send(_query_str).end(res => {
if (res.error)callb(res);
else callb(false,res);
});
////////////
return this;
}
});
function createHashString(_class,key_order,data){
var y="";
key_order.map((key)=>{if(typeof data[key]!=="undefined")y+=data[key];});
return y;
}
function craeteHash(_class,options,dataStr){
var _options=Object.assign({},{algo:"md5"},options);
return crypto.createHmac(_options.algo,_class.hash_key).update(dataStr,'utf8').digest('hex');
}
function createQueryStr(_class,key_order,req){//remove unwanted characters in datastr from ipay unwanted characters
var datastr="";
key_order.map((key)=>{if(datastr!="")datastr+="&";datastr+=key+"="+req[key];});
return datastr;
//or return querystring.stringify(req);
}