vnbankqr
Version:
Generate QR data for QR payment method in Viet Nam
101 lines (100 loc) • 6.58 kB
JavaScript
import { FieldID, ProviderFieldID, ConsumerFieldID, AdditionDataFieldID } from './constants/Fields.js';
import { addField, checksum, padStart } from './utils/Utils.js';
import Country from './constants/Country.js';
import Currency from './constants/Currency.js';
class VNBankQR {
constructor(configs) {
this.version = (configs === null || configs === void 0 ? void 0 : configs.version) || "01";
this.initMethod = (configs === null || configs === void 0 ? void 0 : configs.initMethod) || "11";
this.country = (configs === null || configs === void 0 ? void 0 : configs.country) || Country.VIET_NAM;
this.currency = (configs === null || configs === void 0 ? void 0 : configs.currency) || Currency.VND;
}
generate(transaction) {
let qrData = "";
this.transaction = transaction;
qrData = addField(qrData, FieldID.VERSION, this.version);
qrData = addField(qrData, FieldID.INIT_METHOD, this.initMethod);
qrData = this.addMerchantFields(qrData, transaction);
qrData = this.addTransactionFields(qrData, transaction);
qrData = this.addProviderFields(qrData, transaction);
qrData = this.addAdditionDataFields(qrData, transaction);
qrData = this.addChecksumFields(qrData);
return qrData;
}
addAdditionDataFields(qrData, transaction) {
let additionObj = transaction === null || transaction === void 0 ? void 0 : transaction.additionData;
let consumer = transaction === null || transaction === void 0 ? void 0 : transaction.consumer;
if (additionObj) {
let newValue = "";
let additionData = "";
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.billNumber) {
additionData = addField(additionData, AdditionDataFieldID.BILL_NUMBER, additionObj === null || additionObj === void 0 ? void 0 : additionObj.billNumber);
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.mobileNumber) {
additionData = addField(additionData, AdditionDataFieldID.MOBILE_NUMBER, additionObj === null || additionObj === void 0 ? void 0 : additionObj.mobileNumber);
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.storeLabel) {
additionData = addField(additionData, AdditionDataFieldID.STORE_LABEL, additionObj === null || additionObj === void 0 ? void 0 : additionObj.storeLabel);
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.loyalNumber) {
additionData = addField(additionData, AdditionDataFieldID.LOYALTY_NUMBER, additionObj === null || additionObj === void 0 ? void 0 : additionObj.loyalNumber);
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.referenceLabel) {
additionData = addField(additionData, AdditionDataFieldID.REFERENCE_LABEL, additionObj === null || additionObj === void 0 ? void 0 : additionObj.referenceLabel);
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.customerLabel) {
additionData = addField(additionData, AdditionDataFieldID.CUSTOMER_LABEL, additionObj === null || additionObj === void 0 ? void 0 : additionObj.customerLabel);
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.terminalLabel) {
additionData = addField(additionData, AdditionDataFieldID.TERMINAL_LABEL, additionObj === null || additionObj === void 0 ? void 0 : additionObj.terminalLabel);
}
if ((additionObj === null || additionObj === void 0 ? void 0 : additionObj.transactionPurpose) || (consumer === null || consumer === void 0 ? void 0 : consumer.message)) {
additionData = addField(additionData, AdditionDataFieldID.TRANSACTION_PURPOSE, (additionObj === null || additionObj === void 0 ? void 0 : additionObj.transactionPurpose) || (consumer === null || consumer === void 0 ? void 0 : consumer.message));
}
if (additionObj === null || additionObj === void 0 ? void 0 : additionObj.additionDataRequest) {
additionData = addField(additionData, AdditionDataFieldID.ADDITION_CONSUMER_DATA_REQUEST, additionObj === null || additionObj === void 0 ? void 0 : additionObj.additionDataRequest);
}
if (additionData.length > 0) {
newValue = addField(qrData, FieldID.ADDITION_DATA, additionData);
return newValue;
}
}
return qrData;
}
addTransactionFields(qrData, transaction) {
let consumer = transaction.consumer;
let currency = (consumer === null || consumer === void 0 ? void 0 : consumer.currency) || this.currency;
let amount = consumer.amount;
let newValue = addField(qrData, FieldID.CURRENCY, currency);
newValue = addField(newValue, FieldID.TRANSACTION_AMOUNT, amount + "");
return newValue;
}
addProviderFields(qrData, transaction) {
let provider = transaction.provider;
let newValue = addField(qrData, FieldID.COUNTRY_CODE, provider.country);
newValue = addField(newValue, FieldID.PROVIDER_NAME, provider.name);
newValue = addField(newValue, FieldID.PROVIDER_CITY, provider.city);
return newValue;
}
addMerchantFields(qrData, transaction) {
let consumer = transaction.consumer;
let provider = transaction.provider;
let receiverInfo = "";
let providerInfo = "";
receiverInfo = addField(receiverInfo, ConsumerFieldID.BANK_BIN, consumer.merchantBankBin);
receiverInfo = addField(receiverInfo, ConsumerFieldID.BANK_NUMBER, consumer.merchantBankNumber);
providerInfo = addField(providerInfo, ProviderFieldID.GUID, provider.guid);
providerInfo = addField(providerInfo, ProviderFieldID.DATA, receiverInfo);
providerInfo = addField(providerInfo, ProviderFieldID.SERVICE, provider.service);
let newValue = addField(qrData, provider.id, providerInfo);
newValue = addField(newValue, FieldID.PROVIDER_CATEGORY_CODE, provider.category);
return newValue;
}
addChecksumFields(qrData) {
let crcChecksum = checksum(qrData + FieldID.CRC + "04");
crcChecksum = padStart(crcChecksum, 4);
let newValue = addField(qrData, FieldID.CRC, crcChecksum);
return newValue;
}
}
export default VNBankQR;