const
config = require('config'),
crypto = require('crypto'),
https = require('https'),
request = require('request'),
CryptoJS = require("crypto-js"),
url = require('url'),
requestPromise = require("request-promise"),
endpoint = require("@runkit/runkit/json-endpoint/1.0.0");
const APP_MAC_ID = "";
const APP_MAC_KEY = "";
const APP_ID = "";
const SERVER = "https://staging.lcp.points.com/v1";
function randomString(len, charSet) {
charSet = charSet || 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var randomString = '';
for (var i = 0; i < len; i++) {
var randomPoz = Math.floor(Math.random() * charSet.length);
randomString += charSet.substring(randomPoz, randomPoz + 1);
}
return randomString;
}
function getLCPAuthHeader(macId, macKey, method, urlString, data) {
var d = new Date();
var n = d.getTime()+10000 + "";
var ts = n.substring(0, n.length - 3);
var nonce = randomString(8);
var urlReader = url.parse(urlString);
var ext = "";
if ("GET" != method && data !== undefined) {
ext = CryptoJS.SHA1("application/json" + JSON.stringify(data));
}
macKey = macKey.replace(new RegExp("-", 'g'), "+").replace(new RegExp("_", 'g'), "/");
var normalizedRequestString = ts + "\n" + nonce + "\n" + method + "\n" + urlReader.pathname + "\n" + urlReader.hostname + "\n443\n" + ext + "\n";
var secret = CryptoJS.enc.Base64.parse(macKey);
var mac = CryptoJS.HmacSHA1(normalizedRequestString, secret).toString(CryptoJS.enc.Base64);
var header = "MAC id=\"" + macId + "\", ts=\"" + ts + "\", nonce=\"" + nonce + "\", ext=\"" + ext + "\", mac=\"" + mac + "\"";
return header;
}
exports.endpoint = async function(request, response) {
if (request.method == "GET") {
var html = await requestPromise('https://rawgit.com/Points/javascript-widgets/master/ampbuy.html');
response.end(html);
} else {
var body = [];
request.on('data', function(chunk) {
body.push(chunk);
}).on('end', async function() {
body = JSON.parse(Buffer.concat(body).toString());
console.log(body);
var memberId = "AY225715";
var firstName = "Test";
var lastName = "Test";
var email = "mihnea@points.com";
var lpId = "9464f854-0821-4336-ac6a-80504097b289";
var amount = 5000;
var currency = "USD";
var mvRequest = {
memberId: memberId,
firstName: firstName,
lastName: lastName
};
var mvResponse = {
balance: 0,
email: email,
memberId: memberId,
firstName: firstName,
lastName: lastName
}
var mvDelegateRequest = {
memberValidation: mvRequest,
memberValidationResponse: mvResponse,
application: SERVER+"/apps/"+APP_ID
}
console.log("MV DELEGATES");
var authHeader = getLCPAuthHeader(APP_MAC_ID, APP_MAC_KEY, "POST", SERVER+"/lps/"+lpId+"/mv-delegates/", mvDelegateRequest);
var mvDelegatesResponse = await requestPromise({
uri: SERVER+'/lps/'+lpId+'/mv-delegates/',
method: 'POST',
headers: {
'Authorization': authHeader,
'Content-Type': 'application/json'
},
json: mvDelegateRequest,
simple: false
});
var session = {
"channel": "ampemail",
"clientIpAddress": "0.0.0.0",
"clientUserAgent": "AMP EMAIL",
"referralCode": "AMP EMAIL"
};
var user = {
"memberValidation":mvDelegatesResponse.memberValidation
};
var messageData = {
"offerTypes": ["BUY"],
"session": session,
"user": user
};
var authHeader = getLCPAuthHeader(APP_MAC_ID, APP_MAC_KEY, "POST", SERVER+"/offer-sets/", messageData);
var offerSet = await requestPromise({
uri: SERVER+'/offer-sets/',
method: 'POST',
headers: {
'Authorization': authHeader,
'Content-Type': 'application/json'
},
json: messageData
});
var selectedTier = null;
if (offerSet !== undefined && offerSet.offers !== undefined && offerSet.offers.length > 0) {
var offer = offerSet.offers[0];
for (var i = 0; i < offer.pricing.tiers.length; i++) {
var tier = offer.pricing.tiers[i];
if (amount >= tier.minOfRange && amount <= tier.maxOfRange) {
selectedTier = tier;
break;
}
}
}
console.log("TIER "+selectedTier);
var buyRequest = {};
buyRequest.clientIpAddress = "0.0.0.0";
buyRequest.clientUserAgent = "AMP EMAIL";
buyRequest.language = "en-US";
buyRequest.offerSet = offerSet.links.self.href;
buyRequest.type = "BUY";
buyRequest.user = {
memberValidation: mvDelegatesResponse.memberValidation,
memberId: memberId,
firstName: firstName,
lastName: lastName,
email: email
};
buyRequest.session = {
clientIpAddress: "0.0.0.0",
clientUserAgent: "AMP EMAIL"
}
var orderDetails = {};
orderDetails.basePoints = amount;
if (selectedTier.bonusType == "percentage") {
orderDetails.bonusPoints = amount * selectedTier.bonusAmount/100;
}
orderDetails.offer = offerSet.offers[0].links.self.href;
orderDetails.selectedTier = selectedTier;
orderDetails.touchpoint = "storefront";
buyRequest.orderDetails = orderDetails;
var payment = {};
payment.type = "creditCard";
payment.currency = currency;
payment.billingInfo = {
cardName: "Visa",
cardNumber: body.paymentDetails.details.cardNumber,
cardType: "VISA",
city: body.paymentDetails.details.billingAddress.city,
country: body.paymentDetails.details.billingAddress.country,
expirationMonth: parseInt(body.paymentDetails.details.expiryMonth),
expirationYear: parseInt(body.paymentDetails.details.expiryYear),
firstName: firstName,
lastName: lastName,
phone: body.paymentDetails.details.billingAddress.phone.substring(1),
securityCode: body.paymentDetails.details.cardSecurityCode,
state: body.paymentDetails.details.billingAddress.region,
street1: body.paymentDetails.details.billingAddress.addressLine[0],
zip: body.paymentDetails.details.billingAddress.postalCode
}
payment.costs = {
baseCost: 175,
fees: [
{
amount: 13.13 ,
name: "FET-RECOVERY"
}
],
taxes: [
{
amount: 24.46,
name: "GST/HST"
}
],
totalCost: 212.59
}
buyRequest.payment = payment;
console.log("BUY" + buyRequest);
var authHeader = getLCPAuthHeader(APP_MAC_ID, APP_MAC_KEY, "POST", SERVER+"/lps/"+lpId+"/buy/", buyRequest);
var buyResponse = await requestPromise({
uri: SERVER+'/lps/'+lpId+'/buy/',
method: 'POST',
headers: {
'Authorization': authHeader,
'Content-Type': 'application/json'
},
json: buyRequest
});
response.setHeader('content-type', 'application/json');
response.end(JSON.stringify(buyResponse));
});
}
}