Insights·2026-08-06

Creem — 当 Toss 和 Stripe 都走不通时的收款方案

Creem 是一个由平台代替卖家承担销售主体身份的 Merchant of Record(MoR)收款平台。顾客在法律上不是向你购买,而是向 Creem 购买,作为交换,Creem 承担 190 多个税务辖区的税额计算、代收与申报,以及退款与拒付处理。费率为每笔成功交易 3.9% + 0.40 美元,没有月费也没有开通费。创建商品后拿到 product ID,把它填进代码就能打开收银台;付款完成后,你上传的文件会自动发送给买家。完全不写代码,只分享支付链接也能开始销售。

보라색 배경에 SELL SOFTWARE GLOBALLY라는 문구와 CREEM 로고, 아이스크림 마스코트가 있는 Creem 공식 배너
Creem 공식 배너 (creem.io) — 판매 주체를 대신 지는 머천트 오브 레코드

为什么没有选国内支付服务商

为了给正在开发的服务接入收款,我向 Toss Payments 提交了六次商户申请,六次都被拒。而六次里只有一次给了理由。最后一次只回了"审核中",其余四次至今不知道为什么被拒。发卡机构的审核标准不公开,所以不会告知具体项目。被拒六次却有五次不知道原因,这就是这套审核的性质。问题不在补材料,而在无法预判能否通过,因此连再申请的计划都立不起来。

下一个候选是 Stripe。但韩国主体无法开设 Stripe 账户。Stripe 官方的国家支持页面列出了 32 个欧洲国家,亚太地区包含澳大利亚、中国香港、日本、马来西亚、新西兰、新加坡和泰国,印度与印度尼西亚标注为邀请制,而韩国既不在支持名单也不在邀请名单中(2026-08-06 核对)。

两件事叠加,可选项就变窄了。国内路径卡在审核,Stripe 卡在国别。剩下的是海外 MoR 平台,Creem 是其中之一。

补一句:这是制度问题,不是技术问题。代码写得再好,拿不到收款合约,服务就收不到钱。用 Vibe Coding 把登录和功能都做完的项目,通常正好停在这一步。

项目Toss PaymentsStripeCreem
在韩国开户需通过商户审核支持国家名单中无韩国注册后创建店铺
销售主体卖家本人卖家本人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 等查询参数。

.env
CREEM_API_KEY=creem_test_your_api_key
CREEM_WEBHOOK_SECRET=whsec_your_webhook_secret
NEXT_PUBLIC_APP_URL=http://localhost:3000
安装
npm install @creem_io/nextjs
app/api/checkout/route.ts
import { Checkout } from "@creem_io/nextjs";

export const GET = Checkout({
  apiKey: process.env.CREEM_API_KEY!,
  testMode: true,
  defaultSuccessUrl: "/success",
});
app/page.tsx
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 是订阅解除的瞬间。分别用来开通、保持和收回访问权限。

app/api/webhooks/creem/route.ts
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。在商品页和付款确认邮件里加一句,多数情况就解决了。