cordova-plugin-konnectedpay
Version:
A Cordova plugin to accept payments using the KonnectedPay payment gateway.
228 lines (194 loc) • 7.53 kB
JavaScript
/***
* Copyright 2015 Nexstream Sdn Bhd
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
***/
;
var argscheck = require('cordova/argscheck'),
exec = require('cordova/exec');
// Config ----------------------------------------------------------------------
var URL_KONNECTEDPAY = "https://pay.appxtream.com";
var REQ_FIELDS_REQPAYMENT = [
"merchantId", "clientSecret", "amount", "transId", "currencyCode",
"fullName", "email", "userId"
];
var REQ_FIELDS_GETTOKENS = [
"merchantId", "clientSecret", "userId"
];
var REQ_FIELDS_DELETETOKEN = [
"clientSecret", "userId", "token"
];
// Helpers ---------------------------------------------------------------------
var checkFields = function (reqFields, obj)
{
reqFields.forEach(function (field) {
if(obj[field] === undefined) {
throw new Error("'"+field+"' is undefined");
}
})
}
// API implementation ----------------------------------------------------------
var KonnectedPay = function () {};
KonnectedPay.prototype = {
requestPayment: function (params, success, error)
{
var errCb = function (resp)
{
if(typeof resp == "string") {
error({
status: "Error",
desc: resp,
})
} else if(resp === -9999) {
error({
status: "Cancelled",
desc: "User cancelled",
})
} else {
error(resp)
}
}
try {
// Check parameters
argscheck.checkArgs("ofF", "KonnectedPay.requestPayment", arguments);
checkFields(REQ_FIELDS_REQPAYMENT, params)
if(typeof params.amount.toFixed !== "function") {
throw new Error("'amount' must be numeric");
}
var nparams = {
merchantId: ""+params.merchantId,
clientSecret: ""+params.clientSecret,
amount: params.amount.toFixed(2),
transId: ""+params.transId,
currencyCode: ""+params.currencyCode,
fullName: ""+params.fullName,
email: ""+params.email,
userId: ""+params.userId,
token: params.token === undefined ? undefined : ""+params.token,
}
if(params.rememberCard !== undefined) {
nparams.rememberCard = params.rememberCard ? "1" : "0"
} else {
nparams.rememberCard = "1"
}
// Call native SDKs
exec(success, errCb, "KonnectedPay", "requestPayment", [nparams]);
} catch (e) {
// Call error callback asynchronously if parameters are incorrect
setTimeout(function () {
error({
status: "Incorrect usage",
desc: e.message,
});
}, 0);
}
},
getTokens: function (params, success, error)
{
var downloadTokens = function (url)
{
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
switch(req.readyState) {
case 4: // DONE
if(req.status < 200 || req.status >= 300) {
error("Failed to retrieve tokens");
} else {
try {
var obj = JSON.parse(this.responseText);
if(obj === null) obj = [];
if(typeof obj != "object" || !(obj instanceof Array)) {
throw new Error("Response should be an array")
}
} catch (e) {
error((e && e.message) || "Invalid response from server");
return;
}
success(
obj.map(function (card) {
return {
token: card.token,
maskCard: card.maskCard,
maskCardType: card.maskCardType,
};
})
);
}
break;
}
};
req.open("GET", url);
req.send();
};
try {
// Check parameters
argscheck.checkArgs("ofF", "KonnectedPay.getTokenListUrl", arguments);
checkFields(REQ_FIELDS_GETTOKENS, params)
// Call native SDKs
exec(
downloadTokens,
function (err) {
if(err && err.message !== undefined) error(err.message)
else error()
},
"KonnectedPay",
"getTokenListUrl",
[{
merchantId: ""+params.merchantId,
clientSecret: ""+params.clientSecret,
userId: ""+params.userId,
}]
);
} catch (e) {
// Call error callback asynchronously if parameters are incorrect
setTimeout(function () { error(e.message); }, 0);
}
},
deleteToken: function (params, success, error)
{
var deleteToken = function (url)
{
var req = new XMLHttpRequest();
req.onreadystatechange = function () {
switch(req.readyState) {
case 4: // DONE
if(req.status >= 200 && req.status < 300) {
success();
} else {
var obj;
try { obj = JSON.parse(this.responseText) }
catch (e) {}
error((obj && obj.error) || "Failed to delete token");
}
break;
}
};
req.open("DELETE", url);
req.send();
};
try {
// Check parameters
argscheck.checkArgs("ofF", "KonnectedPay.deleteToken", arguments);
checkFields(REQ_FIELDS_DELETETOKEN, params);
var url = URL_KONNECTEDPAY
+ "/payment/token/" + encodeURIComponent(params.userId)
+ "/" + encodeURIComponent(params.token)
+ "?clientSecret=" + encodeURIComponent(params.clientSecret);
deleteToken(url);
} catch (e) {
// Call error callback asynchronously if parameters are incorrect
setTimeout(function () { error(e.message); }, 0);
}
},
};
module.exports = new KonnectedPay();