」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 透過二維碼獲得付款

透過二維碼獲得付款

發佈於2024-08-01
瀏覽:181

Get paid in QR

不,不是像素,而是欧元。

不,不能使用信用卡。

是的,用电话。

动机

如果您销售产品或服务,获得报酬是一个明显的要求。

如今信用卡为王,无论如何在网上都很好。

您拥有大量的支付网关,可以为您处理信用卡、Google 或 Apple Pay。

当然是要收费的。

在实体店里,您会得到一个信用卡终端。

有些银行可以向您出售更便宜的 Android 应用程序,将您的手机变成 CC 终端。

这是值得考虑的,特别是如果您每天只处理几笔付款。

这些选项几乎涵盖了典型消费场景中的所有情况。

一个人上网或进入实体店购买一堆产品或理发。

但是,还有更多。

  1. 如果您是需要处理小额付款的非营利组织或公民组织怎么办。
  2. 如果您是一家 B2B 公司并且您的客户希望通过直接转账付款怎么办。
  3. 或者,如果您只是不想支付约 2-3% 的信用卡付款费用,该怎么办。

在所有这些情况下,在欧盟,答案是 SEPA。

更具体地说,SEPA 信用转账。

或者是它更年轻但速度更快的兄弟 SEPA 即时信用转账。

SEPA 信用转账

如果您不熟悉这个名字,不用担心,它是同样的旧电汇。

例如。您告诉银行从您的帐户中提取资金并存入其他人的帐户。

过去需要填写纸质表格,现在只需在移动银行应用程序中点击几下即可。

但是,我们现在拥有标准化的国际银行帐号 - IBAN。

使汇款变得超级容易在欧盟甚至世界各地的任何地方。

通过 SEPA 即时付款,您的资金可在几秒钟内到达。

但是,但是IBAN太长了,简直可怕。

众所周知,人们不擅长输入东西,所以如果你得到正确的数量,你会很高兴,忘记额外的注释。

所有这些问题都可以通过二维码轻松解决。

您的客户可以用手机扫描它们,检查金额并在银行应用程序中单击“付款”。

随着加入 SEPA 即时信用转账计划的银行名单不断增加,您的钱眨眼间就到账的机会很高。

在以后的博客中,我们将介绍如何监视您的银行帐户上的收款。

例如,自动生成和发送发票。

我来教你如何生成斯洛伐克和捷克的二维码。

我想让这个列表更长,所以如果您知道在您的国家如何制作二维码,请告诉我。

QR 斯洛伐克

斯洛伐克银行已就名为 Pay by Square 的通用标准达成一致。

甚至还有一个可以在在线场景中使用的url schema。

例如。用户单击链接,他们的银行应用程序将启动,并填写所有付款信息。

遗憾的是,这些无法互操作(2024 年)。

我来教你如何在NodeJS中生成二维码。

app.get("/api/paybysquare", mustAuth, async (req, res, next) => {
    try {
        const body = req.query.content as string;
        const model = JSON.parse(body);
        const content = await generate(model);
        const qrStream = new PassThrough();
        const result = await toFileStream(qrStream, content,
            {
                type: 'png',
                width: 200,
                errorCorrectionLevel: 'H'
            }
        );

        qrStream.pipe(res);
    } catch (ex) {
        next(ex);
    }
});

生成方法来自 bysquare 库。

你可以像往常一样使用 npm 安装它 npm i bysquare

要获取可以在浏览器或发票文档中使用的 PNG 图像,我们调用如下方法。

interface IBySquareModel {
    IBAN: string;
    Amount: number;
    CurrencyCode: string; // must be "EUR",
    VariableSymbol: string;
    Payments: number; // must be 1,
    PaymentOptions: number; // must be 1,
    BankAccounts: number; // must be 1,
    PaymentNote?: string; // optional note
}

const BySquareQR = (payModel: IBySquareModel) => {
    return 透過二維碼獲得付款
}

在付款中添加描述性消息通常非常有帮助。

这是一些简单的代码,可以规范客户端名称。

这将删除变音符号,将 Ján Kováč 转换为 Jan Kovac.

应该仍然完全可读,并确保银行系统不会搞砸。

    const paymentMessage = customerName?.normalize("NFKD").replace(/[\u0300-\u036f]/g, "").substring(0, 100) || "";

QR 捷克共和国

尽管捷克共和国或捷克共和国迄今为止(2024年)抵制欧元,但他们也有二维码计划。

他们甚至还有我们可以使用的免版税代码生成器。
现在,出于安全原因,您可能仍然想自己生成它。

const czQrLink = "https://api.paylibo.com/paylibo/generator/image?iban="   iban   "&amount="   
czkPrice   "&currency=CZK&vs="   vsym   
"&message="   message;

const CzQrImage = (czQrLink: string) => {
    return 透過二維碼獲得付款
}

国际的

遗憾的是,目前还没有国际或欧洲的 QR 标准。

因此,您必须根据用户所在的国家/地区显示正确的二维码。

如果您希望从捷克共和国付款,请记住捷克二维码仅适用于捷克克朗(捷克货币 CZK)。

或者,如果您位于捷克共和国,并且希望从斯洛伐克付款,则二维码仅适用于欧元。

下面的代码可以帮助您计算正确的货币金额。

首先我们从央行获取当前的参考汇率。

然后我们根据产品价格和货币计算欧元和捷克克朗的价格。

const getExchangeRate = async () => {
    const now = new Date();
    const dt = new Date(now.getFullYear(), now.getMonth(), now.getDate() - 1).toISOString().substring(0, 10);

    const url = "https://nbs.sk/export/sk/exchange-rate/"   dt   "/xml";
    const dat  = { url: url }
    const opts = {
        headers: {
            'Content-Type': 'application/json'
        },
        method: "POST",
        body: JSON.stringify(dat)
    }

    const resp = await fetch("/api/httpfetch", opts);
    const xml = await resp.text();

    const parser = new DOMParser();
    const xmlDoc = parser.parseFromString(xml, "text/xml");
    const node = xmlDoc.querySelector("Cube [currency='CZK']");
    if (node) {
        const attr = node.getAttribute("rate");
        if (attr) {
            const num = attr.replace(/\s/, "").replace(",", ".");
            return  num;
        }
    }
    return undefined;
}

    // basePrice is the amount to be paid, for the products or services
    // currencyCode is the currency the products or services are sold in.
    const czkRate = await getExchangeRate();

    const eurPrice = currencyCode === "EUR" ? basePrice : (Math.ceil(basePrice / czkRate * 100) / 100).toFixed(2);
    const czkPrice = currencyCode === "CZK" ? basePrice : (Math.ceil(basePrice * czkRate * 100) / 100).toFixed(2);

得到报酬

尝试从发票中读取印刷错误的 IBAN,甚至输入超长的 IBAN 都非常烦人。

你必须非常小心,检查三遍,因为这是钱,更是如此。

我们开发软件是为了让我们的生活更轻松,而用于支付的二维码非常适合这个目标。

我希望您发现这些信息有用,如果您对您的国家二维码方案有一些建议,请按照我的方式拍摄。

黑客快乐!

版本聲明 本文轉載於:https://dev.to/chuliomartinez_ebd2d8009bdec/get-paid-in-qr-2dkp?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3