跳到内容

如何在 Next.js 网站中接受加密货币付款

了解如何为 Next.js 构建加密货币结账,涵盖支付方案、账单创建、Webhook 验证、订单状态、安全测试与上线优化。

Payora11 分钟阅读EN · RU · UK · ES · DE · FR · IT · PL · PT · HI · ZH
如何在 Next.js 网站中接受加密货币付款

了解支付流程和要求

如果你想了解如何在 Next.js 网站上接受加密货币付款,先弄清流程,而不是急着写代码。加密货币结账通常分为 4 个环节:创建订单、显示付款请求、监测区块链,并在验证通过后才将订单标记为已付款。

听起来简单,实际却往往没那么简单。

在 Next.js 网站上“接受加密货币付款”,并不意味着你的应用要自己持有加密货币。多数情况下,网站会为客户创建付款请求,客户从钱包转账,再由支付服务或你自己的后端确认转账。可靠的结账流程还需要设置超时时间,因为上午 10 点合理的报价,20 分钟后可能就不再合适了。

你还需要确定要支持哪些网络和资产。接受 Ethereum、Polygon 和 BNB Chain 上 USDT 的商店,与只接受某条链上 BTC 的网站,面对的并不是同一类工作。网络选择会影响手续费、确认时间,以及客户需要使用哪种钱包。如果客户选错网络,款项可能会到账,但你却无法将它与订单对应起来。

有一个实用的检验标准:首次购物的客户能否在 2 分钟内完成结账?如果不能,就说明流程还需要改进。一个钱包、一笔金额、一个明确的地址、一个清晰的状态页面——这才是用户期待的清晰体验。

选择加密货币支付服务商或钱包集成方案

构建加密货币结账,大致有 3 种方式:第一,使用服务商提供的托管结账;第二,直接集成钱包,由应用调用钱包库;第三,在用户和区块链之间接入支付网关。每种方式的搭建成本都不同,合适的选择取决于你更看重速度、掌控力,还是两者兼顾。

托管结账通常上线最快。你创建一张账单,将客户引导至托管页面,再由服务商负责检测付款。直接集成钱包可以让支付体验更贴合产品,但通常需要编写更多代码、处理更多边缘情况,也要承担更多付款确认责任。支付网关则介于两者之间;对于电商场景,它往往是更务实的选择,因为它可以创建账单、跟踪确认状态并提供 webhook。

选择之前,请核对 5 项内容:支持的币种、支持的链、是否支持 webhook、账单有效期,以及服务商要求你编写多少后端代码。如果你正在为商店比较方案,可以先看看电商加密货币支付网关指南,它从商家的角度梳理了同一个选择问题。为自由职业者提供账单和付款链接的服务商,也可能更适合这类需求,因此自由职业者加密货币支付网关这一角度也值得关注。

补充一点:如果服务商声称支持“所有主流资产”,请让对方提供准确清单。“所有”说法含糊不清;“支持 3 条网络上的 BTC、ETH 和 USDC”才是你能据此做决定的信息。

为支付配置 Next.js 项目

先从清晰的应用结构开始。在使用 Next.js App Router 的项目中,将支付逻辑放在服务端路由或 Server Actions 中,并确保密钥不会暴露给客户端。一份实用的Next.js 加密货币支付集成教程会从简单结构开始:1 个商品页面、1 个结账表单、1 个用于创建账单的 API 路由,以及 1 个用于接收支付事件的 webhook 路由。

环境变量应包含支付服务商的密钥、webhook 密钥,以及可以安全暴露在浏览器中的公开 API 配置。不要把密钥放在客户端组件里。这种错误可能导致整个账户遭殃,而且代价可能很快就会变得高昂。

如果服务商提供 SDK,只在服务端安装和使用。如果它提供的是普通 HTTP 接口,也同样可行。核心思路不变:浏览器请求 Next.js 后端创建付款请求,再由后端与服务商通信。浏览器绝不能自行判定订单已付款。

如果团队之前处理的是银行卡支付,整体结构与 Stripe 流程并没有太大不同,只是验证步骤有所区别。如果这个对比对你有帮助,可以先阅读如何从 Stripe 迁移过来,再规划 API 路由。原型阶段一个 API 路由就够了;等你加入重试、退款和订单状态历史记录后,可能需要 3 或 4 个路由。

在 Next.js 中创建结账界面

结账界面可以是商品卡片、购物车页面,也可以是启动付款的简单按钮。在 Next.js 客户端组件中,按钮通常会将订单详情发送到服务端路由,等待响应,然后将客户重定向到付款页面,或显示钱包付款说明。

表单要简短。商品名称、金额、电子邮箱,再加上可选的订单备注,通常就足够了。如果你要求填写 9 个字段,预计会有更多用户中途放弃;如果只需填写 3 个,用户就能更快完成。即使最终支付结果相同,30 秒完成结账也比花 3 分钟体验好得多。

付款按钮的操作要一目了然:“使用加密货币付款”,而不是“继续”或“下一步”。这类标签没有说明接下来会发生什么。用户点击按钮后,调用后端获取付款请求,然后在同一个界面中显示钱包地址、二维码和金额。

一种实用做法是在加载付款说明时,仍然显示订单摘要。这样,客户可以同时看到具体商品和准确金额。如果付款金额按美元固定、实际却要用价格波动较大的资产支付,这样做能减少混淆。

生成付款地址、账单或付款链接

每笔订单都应对应一个唯一的付款请求。它可以是钱包地址、付款链接,也可以是服务商提供的账单对象。所有客户共用同一个地址会让对账变得混乱,还可能带来不必要的客服工作。

对于小型商店,你可以为每笔订单生成一个新地址,并将地址、预期金额、资产和过期时间存入数据库。如果使用服务商提供的支付流程,服务商也可能返回账单 ID 和托管付款链接。无论采用哪种方式,都应在客户看到付款请求之前,将其与订单 ID 关联起来。

用清楚易懂的方式展示付款信息:资产、链、金额和收款地址。二维码很方便,但不能取代文字。有些钱包扫描二维码的效果不佳,也有用户会手动复制粘贴。清晰显示地址,始终是最后一道保障。

如果你需要为服务或账单提供基于地址的收款方式,相关做法与自由职业者加密货币支付网关一文中介绍的类似。一次性订单通常使用付款链接更方便;如果你需要记录付款历史并发送提醒,单独的账单记录会更合适。

确认区块链付款并更新订单状态

许多团队在付款确认这一步容易掉以轻心。钱包显示转账待处理时,不要就把订单标记为已付款;也不要只相信浏览器。你的后端应直接检查区块链上的交易,或接收支付服务商发送的签名 webhook,以此验证付款。

常见流程并不复杂:服务商检测到付款后,向你的 Next.js 路由发送 webhook;服务器验证签名后,再更改订单状态。围绕加密货币支付 webhook 如何验证,关键是先确认请求确实来自可信的支付服务商,再处理其中的付款事件。如果你要自行实现这一步,就需要检查交易哈希、收款地址、资产、金额,以及你的策略要求的确认数。交易看起来真实,并不意味着它已经最终确认。

使用包含 3 种状态的订单模型:待处理、已确认、已付款。待处理表示付款请求已创建;已确认表示区块链已检测到付款,且交易达到所需的确认数;已付款则表示应用已更新履约或访问权限。请将这些状态分开,因为客服需要知道客户是在等待、已通过验证,还是已经收到商品或服务。

如果你的技术栈中使用了 webhook,每次都要验证。关于如何验证 Payora 的签名 webhook一文很有参考价值,即便你不用 PHP 也一样,因为核心原理相同:拒绝无法证明来自服务商的消息。这项验证就能有效拦截伪造的付款成功事件。

处理边缘情况、安全问题和测试

加密货币结账出错的方式比银行卡结账更多。报价可能过期,客户可能在错误的网络上转账,钱包可能少付一点,浏览器也可能在流程中途刷新。每种情况都需要有相应处理方式,并为用户明确指出接下来的操作。

报价过期后,不要让订单一直悬而未决。如果付款链接的有效期是 15 分钟,就要清楚显示倒计时,并在链接过期后创建新的付款请求。对于转错网络的款项,应提供客服处理渠道,因为资金可能已经到账,只是没有进入应用预期的位置。对于少付的情况,可以选择接受、拒绝或标记为人工审核,但必须在上线前制定好规则,而不是等到收到第一起投诉后才考虑。

安全措施不可或缺。将密钥保存在仅供服务端使用的环境变量中。验证 webhook 签名。只存储必要的付款数据。如果记录交易 ID,应对调试不需要的敏感信息进行屏蔽。正式接收付款前,先在测试网或服务商的沙盒环境中进行测试。若需要实用的检查清单,可以先阅读如何测试加密货币支付,再连接真实钱包。

别忘了处理重复事件。有些服务商会重试 webhook;如果处理不当,同一笔付款也可能在系统中被记录多次。更新订单的代码应具备幂等性,也就是说,同一个事件不能将同一笔订单重复标记为已付款。这道防线能帮你省下好几个小时的排查时间。

上线、监控并优化结账体验

将 Next.js 部署到 Vercel 或类似托管平台通常没有问题,但支付部分仍需特别留意。确保 webhook 端点可从公网访问、生产环境已配置环境变量,并且构建过程不依赖仅在本地存在的值。支付路由在你的电脑上运行正常、到了生产环境却失效,是很常见的问题。

日志在这里至关重要。记录账单创建、webhook 接收、验证结果和状态变更。日志要足够详细,以便从头到尾追踪单笔订单,但不要把密钥写进日志。如果客户说自己在 14:32 付款,你应该能在几秒内找到对应事件,而不是花上几个小时。

一些小的体验优化,能比预想中更有效地降低操作阻力。将金额显示两次:在订单摘要中显示一次,在付款步骤中再显示一次。账单加载后,仍要让付款按钮保持可见。在地址旁添加复制按钮。清楚显示确认进度,因为用户等待时经常会刷新页面。如果页面毫无响应,5 秒的状态更新也会让人感觉像等了 5 分钟。

接下来,真正的挑战不是完成第一笔付款,而是第二笔、第三笔,以及钱包、区块链和 Next.js 后端交界处出问题的那一笔。如果你的系统能妥善处理这 3 种情况,就能为客户提供值得信赖的结账体验。

Comments

准备开始了吗?

创建账户,并在一小时内开出第一张账单。

此页面回答的问题