@foxdev/pg-orkut
Version:
simple payment gateway order kuota with qris
79 lines (65 loc) • 2.25 kB
JavaScript
import axios from "axios";
import {
getCurrentDateTimeInIndoTime,
ConvertCRC16,
generateReffId,
} from "./utils.js";
export function createPayment(scannedData, amount, timezone = "WIB") {
if (!scannedData.includes("010211") || !scannedData.includes("5802ID")) {
throw new Error("Format QRIS tidak valid");
}
const updatedQris = scannedData.slice(0, -4);
const fixedHeader = updatedQris.replace("010211", "010212");
const tag54 = `54${amount
.toString()
.length.toString()
.padStart(2, "0")}${amount}`;
const insertAfter = fixedHeader.indexOf("5802ID");
const beforeTag58 = fixedHeader.slice(0, insertAfter);
const afterTag58 = fixedHeader.slice(insertAfter);
let payload = beforeTag58 + tag54 + afterTag58;
const crc = ConvertCRC16(payload);
payload += crc;
const qr_url = `https://api.qrserver.com/v1/create-qr-code/?size=300x300&margin=10&&data=${encodeURIComponent(
payload
)}`;
const reff_id = generateReffId();
return {
qr_url,
reff_id,
nominal: amount,
created_at: getCurrentDateTimeInIndoTime(timezone),
};
}
export async function cekStatus(merchant, apiorkut, timezone = "WIB") {
if (!merchant || !apiorkut) {
throw new Error(
"Parameter tidak lengkap. Perlu 'merchant' dan 'apiorkut'."
);
}
try {
const url = `https://gateway.okeconnect.com/api/mutasi/qris/${merchant}/${apiorkut}`;
const response = await axios.get(url);
const statusData = response.data;
if (!statusData.data) {
return {
status: true,
message: "no data",
data: [],
};
}
const validateDate = getCurrentDateInIndoTime(timezone);
const currentDate = validateDate.split(" ")[0];
const filteredData = statusData.data.filter((transaction) => {
const transactionDate = transaction.date.split(" ")[0];
return transactionDate === currentDate && transaction.type === "CR";
});
return {
status: true,
message: filteredData.length === 0 ? "no data" : "success",
data: filteredData,
};
} catch (error) {
throw new Error("Terjadi kesalahan saat mengambil data dari API eksternal");
}
}