Copy require('dotenv').config();
const axios = require('axios');
const fs = require('fs');
const FormData = require('form-data');
const KycDocTypes = {
idCardFront: 'idCardFront',
idCardBack: 'idCardBack',
selfie: 'selfie',
driverDocFront: 'driverDocFront',
driverDocBack: 'driverDocBack',
};
const URL = process.env.URL || 'https://api-dev-services.alfredpay.app/api/v1';
const API_KEY = process.env.API_KEY;
const API_SECRET = process.env.API_SECRET;
const COUNTRY_WITHDRAWAL = process.env.COUNTRY_WITHDRAWAL || 'ARG';
const BUSINESS_TO = process.env.BUSINESS_TO;
const METHOD_WITHDRAWAL = process.env.METHOD_WITHDRAWAL || 'BANK';
const TYPE = process.env.TYPE;
const files = {
[KycDocTypes.idCardFront]: process.env.ID_CARD_FRONT_PATH,
[KycDocTypes.idCardBack]: process.env.ID_CARD_BACK_PATH,
[KycDocTypes.selfie]: process.env.SELFIE_PATH,
[KycDocTypes.driverDocFront]: process.env.DRIVER_DOC_FRONT_PATH,
[KycDocTypes.driverDocBack]: process.env.DRIVER_DOC_BACK_PATH,
};
let token = '';
function getHeaders(token) {
return {
Authorization: `Bearer ${token}`,
'Content-Type': 'application/json',
'api-key': API_KEY,
'api-secret': API_SECRET,
};
}
async function makeRequest(method, url, body, token) {
try {
const response = await axios({
method,
url,
data: body,
headers: getHeaders(token),
});
return response.data;
} catch (error) {
console.error(`Failed to make request: ${error?.response?.data?.message} `);
throw error?.response?.data?.message ?? error.message;
}
}
async function getInitTransaction() {
const body = {
type: TYPE,
balance: 11,
currency: 'USDC',
user: '@JohnDoe',
chain: 'stellar',
};
const response = await makeRequest(
'POST',
`${URL}/third-party-service/my-info`,
body,
token,
);
const url = response.data.url;
const urlSplit = url.split('/');
const urlParam = urlSplit[urlSplit.length - 1];
return urlParam;
}
async function loginSofKyc(initialTransaction) {
const body = {
initial_transaction: initialTransaction,
phonenumber: '+4915156889665',
email: 'Name@gmail.com',
firstname: 'John',
lastname: 'Doe',
address: 'Muinura 33(5',
country: 'MEX',
city: 'Ciudad de México',
zipcode: 11650,
birthday: '1984-07-07',
};
const response = await makeRequest(
'POST',
`${URL}/third-party-service/login-sof-kyc`,
body,
token,
);
token = response.data.token;
return token;
}
async function uploadDocument(token, docPath, docType) {
try {
const url = `${URL}/third-party-service/kyc/upload-document`;
const formData = new FormData();
formData.append('doc', await fs.createReadStream(docPath), {
filename: docPath.split('/').pop(),
});
formData.append('docType', docType);
const config = {
method: 'PUT',
url: url,
headers: {
...formData.getHeaders(),
Authorization: `Bearer ${token}`,
'api-key': API_KEY,
'api-secret': API_SECRET,
},
data: formData,
};
console.log('upload document docType:', docType);
const response = await axios(config);
return response.data;
} catch (error) {
console.error(
`Failed to update document: ${error?.response?.data?.message} `,
);
throw error?.response?.data?.message ?? error.message;
}
}
async function paymentMethod(initTransaction) {
const body = {
initial_transaction: initTransaction,
phonenumber: '+4915100089665',
email: 'Name@gmail.com',
fullname: 'John Doe',
address: 'Muinurax 35',
country: 'MEX',
city: 'Ciudad de México',
countrywithdraw: COUNTRY_WITHDRAWAL,
};
const response = await makeRequest(
'POST',
`${URL}/third-party-service/payment-method`,
body,
token,
);
return response.data;
}
async function verificationPhone() {
const body = {
ref: userData.phoneNumber,
};
const data = await makeRequest(
'POST',
`${URL_CORE}/transacction/phone/withdrawl`,
body,
token,
);
return data;
}
async function submitTransaction(initTransaction, exchangeFactor) {
const body = {
amount: 10,
withdrawlPhone: '+4915156889665',
businessInitTx: initTransaction,
BusinessTo: BUSINESS_TO,
exchangeId: exchangeFactor,
typeProcesor: METHOD_WITHDRAWAL,
};
const response = await makeRequest(
'POST',
`${URL}/third-party-service/submit-transaction`,
body,
token,
);
return response.data;
}
async function updateBankUser() {
const body = {
id: '323',
bankName: 'Banco Ciudad',
bankNumber: '020000110000520139425',
bankAccountOwner: 'John',
countryCode: 'ARG',
DNI: '41586849',
typeId: 'NONE',
};
const response = await makeRequest(
'POST',
`${URL}/third-party-service/update-bank`,
body,
token,
);
return response.data;
}
async function updateInvoice(invoice) {
const body = {
status: 'approved',
};
// change the status of the invoice only to 'approve'
const response = await makeRequest(
'PUT',
`${URL}/third-party-service/invoice/${invoice}`,
body,
token,
);
return response.data;
}
async function getInvoice(invoice) {
const response = await makeRequest(
'GET',
`${URL}/third-party-service/invoice/${invoice}`,
);
return response.data;
}
async function main() {
try {
const initTransaction = await getInitTransaction();
console.log('Init Transaction:', initTransaction);
const loginSofKycResult = await loginSofKyc(initTransaction);
console.log('Login Sof Kyc:', loginSofKycResult);
const paymentMethodResult = await paymentMethod(initTransaction);
console.log('Payment Method Result:', paymentMethodResult);
const uploadDocuments = Object.keys(files).map((docType) =>
uploadDocument(token, files[docType], docType),
);
await Promise.all(uploadDocuments);
if (METHOD_WITHDRAWAL === 'ATM') {
await verificationPhone(initTransaction);
}
const submitTransactionResult = await submitTransaction(
initTransaction,
paymentMethodResult?.exchangeFactor?.id,
);
console.log('Submit Transaction Result:', submitTransactionResult);
const updateBank = await updateBankUser();
console.log('updateBank', updateBank);
const updateInvoiceUser = await updateInvoice(
submitTransactionResult?.invoice?.id,
);
console.log('updateInvoiceUser', updateInvoiceUser);
const invoice = await getInvoice(submitTransactionResult?.invoice?.id);
console.log('Invoice', invoice);
} catch (error) {
console.error('Error:', error);
throw error;
}
}
main();