unioil-loyalty-rn-app/app/components/paymaya/tokenization.js

519 lines
17 KiB
JavaScript

import AsyncStorage from '@react-native-community/async-storage'
import Base64 from './b64'
import MOBILEDB from '../../components/api/endpoints'
import DB from '../../components/storage'
const env = "SANDBOX"
// const env = "PRODUCTION"
const sandbox_api_url = "https://pg-sandbox.paymaya.com"
const prod_api_url = "https://pg.paymaya.com"
const api_url = env == "PRODUCTION" ? prod_api_url : sandbox_api_url
const prod_api_key = "pk-gEKuO5fHV3GIUQb0hTh7YChBCMJOgDLRKbw96umP14X:"
const prod_secret_key = "sk-wnNgSRT0pPPfFOBto3L2jkNDm77lpaUO00SFVmpuzvW:"
// const sandbox_api_key = "pk-pvlwGPQflkjv1J8qZEyUVYW74EPgUf8YQxPgkGl9l9n:"
// const sandbox_api_key = "pk-Z0OSzLvIcOI2UIvDhdTGVVfRSSeiGStnceqwUE7n0Ah:" //old
// const sandbox_secret_key = "sk-X8qolYjy62kIzEbr0QRK1h4b4KDVHaNcwMYk39jInSl:" //old
const sandbox_api_key = "pk-J3AtaSkYMd8MUM5lo9df7Inh6HlITq7W7Q52zBMp8X9:" //new
const sandbox_secret_key = "sk-ewLwiZgYZlfp89g0UOwgJQr0bpvqvEOxWDOUhYbByqS:" //new
const checkout_api_key = "sk-VoMzbvf3EKPJTZvR4pz9U9wVoI5cqb8YItNT92e1fe4:"
//PUBLIC TOKENS
let b64 = env == "PRODUCTION" ? Base64.btoa(prod_api_key) : Base64.btoa(sandbox_api_key)
let token = "Basic " + b64.substr(0, b64.length-1) + "="
//SECRET TOKENS
let sb64 = env == "PRODUCTION" ? Base64.btoa(prod_secret_key) : Base64.btoa(sandbox_secret_key)
let stoken = "Basic " + sb64.substr(0, sb64.length-1) + "="
//CHECKOUT TOKEN
let csb64 = Base64.btoa(checkout_api_key)
let cstoken = "Basic " + csb64.substr(0, csb64.length-1) + "="
let UNIOIL_LOGO = "https://image.winudf.com/v2/image1/Y29tLnByb2plY3QueW9uZHUuYXBwdW5pb2lsbG95YWx0eV9pY29uXzE1NzkyMDAyNDFfMDI3/icon.png?w=170&fakeurl=1";
let UNIOIL_DISPLAY_NAME = "UNIOIL PETROLEUM PHIL";
let UNIOIL_COLOR_SCHEME = "#E74610";
const Service = async (url, method, headers, data, isNewCustomization = false) => {
let Options = method == 'POST' ? {
method: method,
body: JSON.stringify(data),
headers: headers.isSecret ? {
'Content-Type': 'application/json',
'Authorization': stoken
} : isNewCustomization ? {
'Content-Type': 'application/json',
'Authorization': cstoken
} : {
'Content-Type': 'application/json',
'Authorization': token
}
} : {
method: method,
headers: headers.isSecret ? {
'Content-Type': 'application/json',
'Authorization': stoken
} : {
'Content-Type': 'application/json',
'Authorization': token
}
}
console.log(url)
return fetch(url, Options)
.then((response) => response.json())
.then((json) => {
return json
})
.catch((error) => {
console.log(json)
return error
});
}
const setDefaultCustomization = async () => {
let result = await Service(`${api_url}/checkout/v1/customizations`, "POST", {isSecret: true}, {
logoUrl: UNIOIL_LOGO,
iconUrl: UNIOIL_LOGO,
appleTouchIconUrl: UNIOIL_LOGO,
customTitle: UNIOIL_DISPLAY_NAME,
colorScheme: UNIOIL_COLOR_SCHEME,
showMerchantName: true,
hideRecieptInput: false,
redirectTimer: 30,
skipResultPage: false
})
return result
}
const setHiddenCustomization = async () => {
let result = await Service(`${api_url}/checkout/v1/customizations`, "POST", {isSecret: true}, {
logoUrl: UNIOIL_LOGO,
iconUrl: UNIOIL_LOGO,
appleTouchIconUrl: UNIOIL_LOGO,
customTitle: UNIOIL_DISPLAY_NAME,
colorScheme: UNIOIL_COLOR_SCHEME,
redirectTimer: 3,
skipResultPage: true
})
return result
}
const setNewDefaultCustomization = async () => {
let result = await Service(`${api_url}/checkout/v1/customizations`, "POST", {isSecret: true}, {
logoUrl: UNIOIL_LOGO,
iconUrl: UNIOIL_LOGO,
appleTouchIconUrl: UNIOIL_LOGO,
customTitle: UNIOIL_DISPLAY_NAME,
colorScheme: UNIOIL_COLOR_SCHEME,
showMerchantName: true,
hideRecieptInput: false,
redirectTimer: 30,
skipResultPage: false
}, true)
return result
}
const CreateCustomerPayments = async (data) => {
let result = await Service(`${api_url}/payments/v1/payments`, "POST", {isSecret: true}, data)
return result
}
const CreateCustomer = async (data) => {
let result = await Service(`${api_url}/payments/v1/customers`, "POST", {isSecret: true}, data)
return result
}
const CreateCardToken = async (data) => {
let result = await Service(`${api_url}/payments/v1/payment-tokens`, "POST", {isSecret: false}, data)
return result
}
const GetCustomerTransactionDetails = async (paymentId) => {
let result = await Service(`${api_url}/payments/v1/payments/${paymentId}`, "GET", {isSecret: true}, {})
return result
}
const GetCustomerDetails = async () => {
let url = api_url + `/payments/v1/customers/CUSTOMER_ID`
}
const GetCustomerCards = async (id) => {
let result = await Service(`${api_url}/payments/v1/customers/${id}/cards`, 'GET', {isSecret: true}, {})
return result
}
const PerformLink = async (customerId, token) => {
let result = await Service(`${api_url}/payments/v1/customers/${customerId}/cards`, "POST", {isSecret: true}, {
paymentTokenId: token, isDefault: true, redirectUrl: {success: 'unioil.com/success', failure: 'unioil.com/failure', cancel: 'unioil.com/cancel'}
})
return result
}
const DeleteCard = async (id, token) => {
let result = await Service(`${api_url}/payments/v1/customers/${id}/cards/${token}`, 'DELETE', {isSecret: true}, null)
return result
}
const Payout = async (customerId, token, amount) => {
let result = await Service(`${api_url}/payments/v1/customers/${customerId}/cards/${token}/payments`, "POST", {isSecret: true}, {
totalAmount: {amount: amount, currency: "PHP"},
redirectUrl: {success: 'unioil.com/success', failure: 'unioil.com/failure', cancel: 'unioil.com/cancel'}
})
return result
}
const NewPayout = async (token, amount) => {
let clientDetails = {
paymentTokenId: token,
totalAmount: {
amount: amount,
currency: "PHP"
},
redirectUrl: {
success: "unioil.com/success",
failure: "unioil.com/failure",
cancel: "unioil.com/cancel"
}
}
let payments = await CreateCustomerPayments(clientDetails)
payments.status = (payments?.parameters != undefined && payments?.parameters.length > 0) ? 'failed' : 'success'
return payments
}
const Register = async (client) => {
let customize = await setDefaultCustomization()
let newCustomer = await CreateCustomer(client)
let newCardToken = await CreateCardToken(client.card)
console.log("CUSTOMER CREATION", newCustomer);
console.log("CARD TOKEN CREATION", newCardToken);
if(newCustomer.code) {
return {
status: 'failed',
merchant: newCustomer
}
}
if(newCardToken.state == "AVAILABLE") {
let newRegisteredCustomer = await PerformLink(newCustomer.id, newCardToken.paymentTokenId)
console.log("LINK RESULT", newRegisteredCustomer)
if(newRegisteredCustomer) {
return {
status: 'success',
merchant: newCustomer,
card: newCardToken,
link: newRegisteredCustomer
}
} else {
return {
status: 'failed',
merchant: newCustomer,
card: newCardToken,
link: newRegisteredCustomer
}
}
} else {
return {
status: 'failed',
merchant: newCustomer,
card: newCardToken
}
}
}
const AddCard = async (card, id) => {
let customize = await setHiddenCustomization()
let newCardToken = await CreateCardToken(card)
console.log("CARD TOKEN CREATION", newCardToken);
if(newCardToken.state == "AVAILABLE") {
let newRegisteredCustomer = await PerformLink(id, newCardToken.paymentTokenId)
console.log("LINK RESULT", newRegisteredCustomer)
if(newRegisteredCustomer) {
let state = await MOBILEDB_SAVE(id, newCardToken.paymentTokenId, {})
if(state.status == 1) {
return {
status: 'success',
card: newCardToken,
link: newRegisteredCustomer,
mobile: state
}
} else {
return {
status: 'failed',
card: newCardToken,
link: newRegisteredCustomer,
mobile: state
}
}
} else {
return {
status: 'failed',
card: newCardToken,
link: newRegisteredCustomer
}
}
} else {
return {
status: 'failed',
card: newCardToken
}
}
}
const AddNewCardCustomer = async (customer_id, clientDetails) => {
let customize = await setHiddenCustomization()
let newCustomer = await CreateCustomer(clientDetails)
let newCardToken = await CreateCardToken(clientDetails.card)
if(newCustomer.code) {
return {
status: 'failed',
merchant: newCustomer
}
}
let newCustomerId = customer_id || newCustomer.id;
console.log("newCardToken: " + JSON.stringify(clientDetails));
if(newCardToken.state == "AVAILABLE") {
let newRegisteredCustomer = await PerformLink(newCustomerId, newCardToken.paymentTokenId)
if(newRegisteredCustomer) {
let state = await MOBILEDB_SAVE(newCustomerId, newCardToken.paymentTokenId, {})
if(state.status == 1) {
return {
status: 'success',
card: newCardToken,
link: newRegisteredCustomer,
mobile: state
}
} else {
return {
status: 'failed',
card: newCardToken,
link: newRegisteredCustomer,
mobile: state
}
}
} else {
return {
status: 'failed',
card: newCardToken,
link: newRegisteredCustomer
}
}
} else {
return {
status: 'failed',
card: newCardToken
}
}
}
const initDeleteCard = async (id, token, uuid) => {
let pmdel = await DeleteCard(id, token)
let mdbdel = await MOBILEDB_DELETE(uuid)
if(pmdel && mdbdel) {
return {result: 'OK', paymaya: pmdel, mobile: mdbdel}
} else {
return {result: 'FAILED', paymaya: pmdel, mobile: mdbdel}
}
}
const MOBILEDB_SAVE = async (id, token) => {
let userdata = await DB.profile()
let SESSION = await DB.session()
console.log("TO SAVE DATA", userdata.data.card_number, id, token, userdata, SESSION)
return fetch(MOBILEDB.server + "paymayatokens", {
method: "post",
body: JSON.stringify({
card_number: userdata.data.card_number,
customer_id: id,
token: token
}),
headers: {'Content-Type': 'application/json', 'Authorization': SESSION.token}
})
.then((response) => response.json())
.then((json) => {
return json;
})
.catch((error) => {
return error
});
}
const MOBILEDB_GET = async () => {
let userdata = await DB.profile()
let SESSION = await DB.session()
return fetch(`${mobiledb_get}/${userdata.data.card_number}`, {
method: "get",
body: {},
headers: {'Content-Type': 'application/json', 'Authorization': SESSION.token}
})
.then((response) => response.json())
.then((json) => {
return json;
})
.catch((error) => {
return error
});
}
const MOBILEDB_DELETE = async (uuid) => {
let userdata = await DB.profile()
let SESSION = await DB.session()
console.log("TO SAVE DATA", userdata.data.card_number, token)
return fetch(MOBILEDB.server + "paymayatokens/" + uuid, {
method: "DELETE",
headers: {'Content-Type': 'application/json', 'Authorization': SESSION.token}
})
.then((response) => response.json())
.then((json) => {
return json;
})
.catch((error) => {
return error
});
}
const AddNewCard = async (clientDetails) => {
let customize = await setHiddenCustomization()
console.log("Custom", customize)
//IF NOT, REGISTER THE CLIENT
let newCustomer = await Register(clientDetails)
if(newCustomer.status == 'success') {
//IF SUCCESSFULLY REGISTERED
console.log("REGISTER", newCustomer)
return newCustomer
}
}
const CheckOut = async (customerId, paymentToken, clientDetails, amount) => {
//CHECK IF CLIENT HAS CUSTOMER DATA
if(customerId && paymentToken) {
} else {
let customize = await setDefaultCustomization()
//IF NOT, REGISTER THE CLIENT
let newCustomer = await Register(clientDetails)
if(newCustomer.status == 'success') {
//IF SUCCESSFULLY REGISTERED
console.log("REGISTER", newCustomer)
//MUST SAVE DETAILS TO DATABASE
let state = await MOBILEDB_SAVE(newCustomer.merchant.id, newCustomer.card.paymentTokenId, newCustomer)
console.log("SAVING STATE", state)
if(state.status == 1){
//AFTER SAVING, PROCEED TO PAYOUT
let payout = await Payout(newCustomer.merchant.id, newCustomer.card.paymentTokenId, amount)
payout.status = 'success'
payout.card_number = newCustomer.link.maskedPan
return payout
}else if(state.status == 0){
return {
status: 'failed',
result: newCustomer
}
}
} else {
return {
status: 'failed',
result: newCustomer
}
}
}
}
const NewCheckout = async (details, amount) => {
let customize = await setNewDefaultCustomization()
let newCustomer = await CreateCustomer(details)
let paymentToken = await CreateCardToken(details.card)
var newCustomerResult = null
if(newCustomer.code) {
newCustomerResult = {
status: 'failed',
merchant: newCustomer
}
}
if(paymentToken.state == "AVAILABLE") {
let newRegisteredCustomer = await PerformLink(newCustomer.id, paymentToken.paymentTokenId)
if(newRegisteredCustomer) {
newCustomerResult = {
status: 'success',
merchant: newCustomer,
card: paymentToken,
link: newRegisteredCustomer
}
} else {
newCustomerResult = {
status: 'failed',
merchant: newCustomer,
card: paymentToken,
link: newRegisteredCustomer
}
}
} else {
newCustomerResult = {
status: 'failed',
merchant: newCustomer,
card: paymentToken
}
}
if(paymentToken.state == "AVAILABLE" && newCustomerResult.status == "success") {
let isSaveNewCustomerCard = await MOBILEDB_SAVE(newCustomerResult.merchant.id, newCustomerResult.card.paymentTokenId, newCustomerResult)
if(isSaveNewCustomerCard.status) {
let clientDetails = {
paymentTokenId: paymentToken.paymentTokenId,
totalAmount: {
amount: amount,
currency: "PHP"
},
...details,
redirectUrl: {
success: "unioil.com/success",
failure: "unioil.com/failure",
cancel: "unioil.com/cancel"
}
}
let payments = await CreateCustomerPayments(clientDetails)
payments.status = 'success'
payments.card_number = newCustomerResult.link.maskedPan
return payments
} else {
return {
status: 'failed',
result: isSaveNewCustomerCard.message
}
}
} else {
return {
status: 'failed',
result: paymentToken
}
}
}
export default {
initCheckOut: CheckOut,
initNewCheckout: NewCheckout,
initPayOut: Payout,
initNewPayout: NewPayout,
initAdd: AddCard,
initAddCard: AddNewCard,
initNewAddCard: AddNewCardCustomer,
initRemove: initDeleteCard,
getAccounts: GetCustomerCards,
getTransactionDetails: GetCustomerTransactionDetails
}