为什么没有选国内支付服务商
为了给正在开发的服务接入收款,我向 Toss Payments 提交了六次商户申请,六次都被拒。而六次里只有一次给了理由。最后一次只回了"审核中",其余四次至今不知道为什么被拒。发卡机构的审核标准不公开,所以不会告知具体项目。被拒六次却有五次不知道原因,这就是这套审核的性质。问题不在补材料,而在无法预判能否通过,因此连再申请的计划都立不起来。
下一个候选是 Stripe。但韩国主体无法开设 Stripe 账户。Stripe 官方的国家支持页面列出了 32 个欧洲国家,亚太地区包含澳大利亚、中国香港、日本、马来西亚、新西兰、新加坡和泰国,印度与印度尼西亚标注为邀请制,而韩国既不在支持名单也不在邀请名单中(2026-08-06 核对)。
两件事叠加,可选项就变窄了。国内路径卡在审核,Stripe 卡在国别。剩下的是海外 MoR 平台,Creem 是其中之一。
补一句:这是制度问题,不是技术问题。代码写得再好,拿不到收款合约,服务就收不到钱。用 Vibe Coding 把登录和功能都做完的项目,通常正好停在这一步。
| 项目 | Toss Payments | Stripe | Creem |
|---|---|---|---|
| 在韩国开户 | 需通过商户审核 | 支持国家名单中无韩国 | 注册后创建店铺 |
| 销售主体 | 卖家本人 | 卖家本人 | Creem(MoR) |
| 跨境税务申报 | 卖家负责 | 卖家负责 | Creem 覆盖 190 多个辖区 |
| 退款与争议 | 卖家负责 | 卖家负责 | 由 Creem 处理 |
| 公开费率 | 按合约 | 按合约 | 3.9% + $0.40 |
Merchant of Record 到底指什么
Merchant of Record(简称 MoR)指的是向最终顾客销售商品的法律主体。Creem 文档把自身角色写成 "the legal entity responsible for selling goods or services to end customers"。也就是说,在文件上顾客不是向你购买,而是向 Creem 购买。
这正是它与普通支付网关的差别。网关只把刷卡通道借给你,销售方仍然是你,因此税务申报、退款处理、争议应对都还在你身上。MoR 则整个接手销售方的位置。
所以 Creem 承担的项目非常具体:支付处理、各市场的税务合规、销售税代收与申报、退款与拒付管理、190 多个辖区的税额计算与代收、合规发票开具、税务申报。向海外客户卖过软件的人,会明白这份清单为什么让人松一口气。单是欧盟增值税,各国的税率和申报周期就不一样。
代价有两点。一是费率高于国内刷卡手续费,二是顾客的信用卡账单上显示的是 CREEM 而不是你的服务名称。第二点被问得够多,Creem 专门给顾客做了一页 "Why did Creem charge me"。在商品页和付款确认邮件里写一句「本次付款由 Creem 处理」,大部分询问就会消失。
不写代码的最短路径
不做开发也能走到收款这一步。Creem 单独准备了无代码路径,文档里把这类用户称作 creators 与 vibe coders。
第一,在 creem.io 注册。创建账户不需要信用卡。登录后建立一个店铺。
第二,打开测试模式。在没有真实资金流动的状态下,可以把整条支付流程跑通。正式上线前保持这个状态比较稳妥。
第三,在控制台的 Products 标签创建商品,填写名称、说明和价格,在单次付款(single payment)与订阅(subscription)之间选择,并指定货币与分类。如果是电子书、模板这类以文件交付的商品,在这里上传文件。付款完成后,下载链接会自动发到买家邮箱。
第四,点击商品的 Share 按钮拿到支付链接。把这个网址贴在邮件、Instagram 简介或博客文末,都可以打开收银台。这就是不写一行代码所能到达的位置。
仅凭这条路径,电子书、模板、课程资料的销售就已经成立。它也把常见顺序反了过来:不必先做网站再接支付,可以先用链接卖,看到反馈再做网站。
用代码接入 — 以 Next.js 为例的四步
要在自己的网站里打开收银台,只需要两样东西:API 密钥和 product ID。
第一步,在控制台的 Developers 菜单取得 API 密钥,复制到项目根目录 .env 文件中,命名为 CREEM_API_KEY。这个密钥绝不能出现在前端代码或 git 仓库里,先确认 .env 已写入 .gitignore。
第二步,安装适配器。使用 Next.js 时有专用适配器,路径最短。其他框架用 TypeScript SDK(npm install creem),完全不同的语言则直接调用 REST API。
第三步,建立收银 API 路由。一个 app/api/checkout/route.ts 文件就够。测试期间保持 testMode: true,上线时改为 false。
第四步,把按钮包起来。把商品页得到的 product ID(以 prod_ 开头)传给组件,这个按钮就成了付款按钮。
执行 npm run dev 后点击按钮,Creem 收银台就会打开。测试模式下使用卡号 4111 1111 1111 1111,有效期填任意未来日期,CVC 填任意三位即可完成付款。付款结束会回到成功页面,地址栏会附上 checkout_id、order_id、customer_id、product_id 等查询参数。
CREEM_API_KEY=creem_test_your_api_key
CREEM_WEBHOOK_SECRET=whsec_your_webhook_secret
NEXT_PUBLIC_APP_URL=http://localhost:3000npm install @creem_io/nextjsimport { Checkout } from "@creem_io/nextjs";
export const GET = Checkout({
apiKey: process.env.CREEM_API_KEY!,
testMode: true,
defaultSuccessUrl: "/success",
});import { CreemCheckout } from "@creem_io/nextjs";
export default function Page() {
return (
<CreemCheckout productId="prod_YOUR_PRODUCT_ID">
<button>立即购买</button>
</CreemCheckout>
);
}用 Webhook 自动化付款之后的事
不要仅凭跳转到成功页面就放开商品。买家付款后马上关掉标签页,你的服务器就不会知道这笔付款发生过;反过来,知道成功页面地址的人也可以自己打开。正式环境要用 webhook。
Webhook 是 Creem 服务器直接告诉你的服务器「这笔付款完成了」的通道。它不经过买家浏览器,所以即便标签页关掉也会送达。
从控制台取得 webhook secret,填入 .env 的 CREEM_WEBHOOK_SECRET,再加一条路由。签名校验失败时返回 401 这一段很关键——没有它,任何人都能伪造付款完成请求把商品拿走。
先接三个事件就够。checkout.completed 是付款完成的瞬间,subscription.active 是订阅开始或续费的瞬间,subscription.canceled 是订阅解除的瞬间。分别用来开通、保持和收回访问权限。
import { NextRequest, NextResponse } from "next/server";
import { constructWebhookEventEntity } from "creem/webhooks";
export async function POST(request: NextRequest) {
const body = await request.text();
const event = await constructWebhookEventEntity(body, request.headers, {
secret: process.env.CREEM_WEBHOOK_SECRET!,
}).catch(() => null);
if (!event) {
return NextResponse.json({ error: "Invalid signature" }, { status: 401 });
}
switch (event.eventType) {
case "checkout.completed":
// 开通权限、发送邮件、更新数据库
break;
case "subscription.active":
break;
case "subscription.canceled":
// 收回权限
break;
}
return NextResponse.json({ received: true });
}正式上线前的检查项
关闭测试模式。如果直接调用 REST API,还要把地址从 test-api.creem.io 换成 api.creem.io;使用适配器时把 testMode 改为 false。忘了改,真实付款一笔都进不来,而界面看起来毫无异常。
把费率算进成本:每笔成功交易 3.9% + 0.40 美元,文档明确说明没有月费、开通费和隐藏费用。这并不比国内刷卡手续费便宜,应当理解为把税务申报、退款与争议处理转移出去的价格。固定的 0.40 美元对低客单价商品影响更大,所以一两美元的单品销售,改成组合包或订阅制更合适。
卖家资格要自己确认。Creem 的公开文档没有写明卖家可以位于哪些国家、是否需要工商登记、需要何种身份验证,也没有写结算方式与周期。「190 多个国家」指的是顾客一侧的税务辖区数量,不是卖家资格范围,本文也不做断言。注册不需要信用卡,最快的办法是先建账户,在引导页面上亲眼确认要求什么。
确认支付方式。平台以美元和国际信用卡为主,KakaoPay、NaverPay、银行转账等韩国本地方式较弱。如果买家以韩国人为主且多为小额付款,这个结构可能并不合适;反之,向海外客户销售软件或数字商品,它本来就是对口的工具。
提前说明账单显示名称,也就是上面提到的 CREEM。在商品页和付款确认邮件里加一句,多数情况就解决了。
