Copy //Global variables
//----------------requirejs declaration-----------------------------------------------------------------------------
requirejs.config({
baseUrl: '',
paths: {
CryptoJS:"CryptoJS/components/core-min",
CryptoJSMD5:"CryptoJS/rollups/md5",
CryptoJSAES:"CryptoJS/rollups/aes",
CryptoJSBase64:"CryptoJS/components/enc-base64",
CryptoJSModeECB:"CryptoJS/components/mode-ecb",
Uint8Array:"CryptoJS/components/Uint8Array",
md5tool: "ottpay_md5tool",
}
});
//-----------------------initialization--------------------------------------------------------------------------------
require(['md5tool','CryptoJSMD5','CryptoJSAES','CryptoJSBase64',
'CryptoJSModeECB','Uint8Array'],
function(md5tool, CryptoJSMD5, CryptoJSAES,CryptoJSBase64,
CryptoJSModeECB,Uint8Array){
$(document).ready(function(){
get_exchangerate();
});
});
//------------------------api call, retrieve get_exchangerate-----------------------------------------
function get_exchangerate(){
return new Promise(function(resolve, reject){
var newtool = new ottpay_md5tool();
var md5_str = newtool.getMD5StrFromJson('{"fee_type":"CAD"}');
var data_str = newtool.getDataStrFromJson('{"fee_type":"CAD"}');
var key = login_bean.sign_key.toString().toUpperCase();
console.log("sign-key: "+key);
var encrypted = newtool.encrypted(data_str,key,md5_str);
//console.log("test 1 encrypt: "+encrypted);
//var request = {"action":"EX_RATE_QUERY","version":"1.3.4","terminal_no":Constants.TERMINIAL_NO,"data":encrypted,"md5":md5_str}
var request = {"action":"EX_RATE_QUERY","version":"1.0","terminal_no":Constants.TERMINIAL_NO,"data":encrypted,"md5":md5_str};
console.log("request="+JSON.stringify(request));
postAjax(Constants.API_URL,JSON.stringify(request)).then(
function(responseText){
//console.log("get_exchangerate, response text="+responseText);
var response = JSON.parse(responseText);
if(response["rsp_code"]==="SUCCESS"){
//console.log("data after decipher="+newtool.decipher(response["data"],key,response["md5"]));
var exchange_rate = JSON.parse(newtool.decipher(response["data"],key,response["md5"]));
//console.log("exchange_rate", exchange_rate["rate"]);
resolve( exchange_rate["rate"]);
}else{
console.log("Error in getting exchange rate, "+response["rsp_code"]);
reject("-1");
}
},
function(error){
console.log("Get exchange rate error, ", error);
reject("-1");
});
});
//------------------------util, generic post method-----------------------------------------------------------------
function postAjax(url, data) {
return new Promise( function(resolve, reject){
var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject("Microsoft.XMLHTTP");
xhr.open('POST', url);
xhr.onload = function(){
if(xhr.readyState>3 && xhr.status==200){
resolve(xhr.responseText)
}
else{
switch(xhr.status) {
case 404:
reject(Error('Server not found'));
break;
case 500:
reject(Error('Server error'));
break;
case 0:
reject(Error('Request aborted'));
break;
default:
reject(Error('Unknown error ' + status));
}
}
}
xhr.onerror=function(){
reject(Error("Page load error"));
}
xhr.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
xhr.setRequestHeader('Content-Type', 'application/json;charset=UTF-8');
xhr.send(data);
return xhr;
});
}
}
/**
* Wrapper of CryptoJS for ottpay
* CopyRight: OTT PAY Inc.
*
*/
function ottpay_md5tool () {
this.MSstring = "";
}
ottpay_md5tool.prototype = {
getDataStrFromJson : function(jsonObject) {
return jsonObject.toString();
},
getMD5StrFromJson : function(jsonObject) {
var dataStr = this.sort(jsonObject);
//console.log('sorted str='+dataStr);
var md5Str = this.getMD5String(dataStr).toString().toUpperCase();
return md5Str;
},
sort: function(jsonObject){
//console.log('To sort jsonObject = '+jsonObject.toString());
var obj = JSON.parse(jsonObject);
//get sorted keylist
var keylist = [];
for(var key in obj){
//console.log('to sort, key='+key);
keylist.push(key);
}
keylist.sort();
//console.log('to sort, keylist='+keylist);
//get return str by retrieving value according to sorted key
var return_str = "";
for(var keyidx=0; keyidx<keylist.length; keyidx++ ){
var value_idx = obj[keylist[keyidx]];
if((typeof value_idx)=="number"){
return_str += obj[keylist[keyidx]].toString()+".0";
}else{
return_str += obj[keylist[keyidx]];
}
}
//console.log('after sort, return_str = '+return_str);
return return_str;
},
getMD5String: function(dataStr) {
return CryptoJS.MD5(dataStr);
},
decipher: function(orgData, key, md5) {
//console.log("To decrypt data = " + orgData);
//console.log("To decrypt md5 = " + md5);
//console.log("To decrypt key = " + key);
var data = orgData.replace(/[\r\n' ']/g, '');
//var data = orgData.replace(/[' ']/g, '');
var aesKeyStr = CryptoJS.MD5(md5.concat(key)).toString().substring(8, 24).toUpperCase();
//console.log("decrypt aes key = " + aesKeyStr);
var dataArray = CryptoJS.enc.Base64.parse(data);
var keyArray = CryptoJS.enc.Utf8.parse(aesKeyStr);
var decrypted = CryptoJS.AES.decrypt({ciphertext: dataArray}, keyArray, {mode: CryptoJS.mode.ECB});
//console.log("decrypted_Utf8",decrypted.toString(CryptoJS.enc.Utf8));
//console.log("decrypted_u8array",this.hex2a(CryptoJS.enc.u8array.stringify(decrypted)));
//var stb_u8array = this.sort(this.hex2a(CryptoJS.enc.u8array.stringify(decrypted)));
//var calmd5 = this.getMD5String(stb_u8array).toString();
//console.log("calculated u8array md5 = " + calmd5);
var stb_utf8 = this.sort(decrypted.toString(CryptoJS.enc.Utf8));
var calmd5 = this.getMD5String(stb_utf8).toString();
//console.log("calculated utf8 md5 = " + calmd5);
if (calmd5.toUpperCase()==md5.toUpperCase()) {
return decrypted.toString(CryptoJS.enc.Utf8);
} else {
//alert("check sign fail");
console.log("check sign fail");
return JSON.stringify({error:"-1"});
}
},
/**
* Encryption
*
* @param data json
* @param key
* @param md5
* @return
*/
encrypted: function(data, key, md5) {
var aesKeyStr = CryptoJS.MD5(md5.concat(key)).toString().substring(8, 24).toUpperCase();
//console.log("in encrypted, aes key = " + aesKeyStr);
var dataArray = CryptoJS.enc.Utf8.parse(data);
var keyArray = CryptoJS.enc.Utf8.parse(aesKeyStr);
var encrypt = CryptoJS.AES.encrypt(dataArray, keyArray, {mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7});
//console.log("encrypted, encrypt = " + encrypt.toString());
return encrypt.toString();
},
hex2a: function(hex) {
//var str = '';
//for (var i = 0; i < hex.length; i++)
// str += String.fromCharCode(hex[i]);
//str += String.fromCharCode(parseInt(hex.substr(i, 2), 16));
//return str;
var encodedString = String.fromCharCode.apply(null, hex);
return encodedString;
},
decipher_array: function(orgData, key, md5) {
//console.log("decrypt data = " + orgData);
//console.log("decrypt md5 = " + md5);
//console.log("decrypt key = " + key);
var data = orgData.replace(/[\r\n' ']/g, '');
var aesKeyStr = CryptoJS.MD5(md5.concat(key)).toString().substring(8, 24).toUpperCase();
//console.log("decrypt aes key = " + aesKeyStr);
var dataArray = CryptoJS.enc.Base64.parse(data);
var keyArray = CryptoJS.enc.Utf8.parse(aesKeyStr);
var decrypted = CryptoJS.AES.decrypt({ciphertext: dataArray}, keyArray, {mode: CryptoJS.mode.ECB});
//console.log("decrypted",this.hex2a(CryptoJS.enc.u8array.stringify(decrypted)));
var stb = this.sortarray(this.hex2a(CryptoJS.enc.u8array.stringify(decrypted)));
//console.log("stb="+stb.toString());
var calmd5 = this.getMD5String(stb).toString();
//console.log("calculated md5 = " + calmd5);
if (calmd5.toUpperCase()==md5.toUpperCase()) {
return decrypted.toString(CryptoJS.enc.Utf8);
} else {
//alert("check sign fail");
console.log("check sign fail");
return JSON.stringify({error:"-1"});
}
},
sortarray: function(jsonObject){
//console.log('jsonObject = '+jsonObject.toString());
var obj = JSON.parse(jsonObject);
//get sorted keylist
var keylist = [];
for(var key in obj){
//console.log('to sort, key='+key);
keylist.push(key);
}
keylist.sort();
//console.log('to sort, keylist='+keylist);
//get return str by retrieving value according to sorted key
var return_str = "";
for(var keyidx=0; keyidx<keylist.length; keyidx++ ){
//console.log('after sort, key = '+keylist[keyidx]);
//console.log('after sort, obj = '+JSON.stringify(obj[keylist[keyidx]]));
if(obj[keylist[keyidx]]==""||obj[keylist[keyidx]]==null){
return_str +="[]";
}else{
var tmp_str = JSON.stringify(obj[keylist[keyidx]]);
return_str += tmp_str.replace(/":"/g, '=').replace(/","/g, ', ').replace(/"/g,'').replace(/},{/g,'}, {');
}
}
//console.log('after sort, return_str = '+return_str);
return return_str;
},
}