独立站支付接入最反直觉的一点:Stripe 账号注册完,你拿到的不是收款能力,是一个只能模拟交易的sandbox。想收真钱,得先回头把账户设置一项项填完,账户资料激活之后,它才从sandbox切到live。PayPal 那边也一样,上线集成和在美国以外测试集成都要求Business账户。这两条写在官方规则里,绕不过去。PayPal 在中国大陆的注册条件以官方为准。
所以这事有先后顺序:主体和账户先落地,密钥和接口再跟上,sandbox跑通才谈上线。顺序搞反,最常见的结局是代码写完了,卡在账户资料那一步,网站挂着一个收不了钱的按钮。
- 两条通道:Stripe 走 Dashboard 建 Payment Link 或者写 Checkout Session,PayPal 走 Developer Dashboard 拿 client ID 和 client secret 换 access token,再接支付按钮。
- 硬门槛:Stripe 注册页只为其在中国大陆以外注册的法律实体提供服务,可选境外实体注册地 45 个;PayPal 上线和境外测试要 Business 账户。
- 费率:Stripe 美国境内卡 2.9% + 30¢,PayPal 美国站 PayPal Checkout 3.49% 加固定费,一笔 100 美元境内交易两边差 0.78 美元。
- 测试:Stripe 用测试密钥配 4242 4242 4242 4242 这类测试卡,PayPal 用 sandbox 端点和 sandbox 账户,两边都不碰真钱。
本文目录
Stripe 和 PayPal 在独立站里各管什么,为什么两个都要接
Stripe 管的是卡这条通道。它的 Checkout 有三种支付 UI,都基于 Checkout Sessions API,其中 Full page 被标为 Recommended,维护成本标的是 Low。Stripe 还支持 100 多种支付方式,也支持 135 种以上货币的本地化定价,客户在结账页看到的是自己熟悉的币种。想先弄明白这家公司做什么的,可以看 Stripe是什么 这一篇。
PayPal 管的是另一套付款习惯。它的接口走 REST,用 OAuth 2.0 access token 认证,返回 HTTP 响应码和 JSON 格式的响应。client ID 标识一个应用,只拿 client ID 就能得到 PayPal 支付按钮和标准的信用卡、借记卡字段;client secret 用来认证 client ID,调接口时拿这两个换 access token,再把这个 token 放进请求头。
两个都接的理由很实际。有人习惯直接输卡号,有人账户里躺着一笔余额,结账时先找那个蓝色按钮,找不到就关页面走了。两条通道一起摆出来,等于把两种付款习惯都接住,代价是两套后台、两套密钥、两套测试流程,出问题要分开查。
还有一条底线得先说清:注册用真实主体、真实资料,能开在哪个地区按官方支持列表判断。这一步省下来的时间,后面都会加倍还回去,账户被冻结的时候,损失的不只是手续费。
接入前要准备什么:主体、账户、密钥三样
主体这一层,Stripe 注册页写得直接:「我们支持中国大陆企业拓展海外业务,并为其在中国大陆以外注册的法律实体提供服务。」注册时要选境外实体注册所在的国家或地区,这个选择决定可用的产品和服务、结算设置还有合规要求。注册页列出的可选境外实体注册地共 45 个,包含美国、英国、日本、新加坡、中国香港特别行政区。
PayPal 的门槛卡在账户类型上。官方写明,上线集成和在美国以外测试集成,都需要 PayPal Business 账户。个人账户能登录、能收款,但走到上线这一步会卡住,前面做的测试等于白跑。
账户注册本身不复杂。Stripe 分三步:输入邮箱、全名、国家并设置密码;填企业资料;在 Dashboard 点 Verify your email,验证邮件会发到你的邮箱。账户还会生成一个账户 ID,跟账户名称不是一回事,在 Account and Personal details 里能查到。PayPal 开发者账号注册完会收到一封验证邮件,要回复邮件才算激活,几分钟没收到就去看垃圾箱和拦截记录。注册的细节写在 PayPal注册教程 里。
密钥这一层最容易出事。Stripe 的要求是别把密钥写进代码,也别把 live 密钥放进源码或者纳入版本控制的配置文件,live 密钥要存密钥库或环境变量。PayPal 的要求是 client secret 必须保管好,调接口之前把 CLIENT_ID:CLIENT_SECRET 做 Base64 编码。
回查的顺序也简单。邮箱没验证,账户就还停在 sandbox 那一步,收真钱要先完成账户设置。先把账户设置走完,再谈写代码,这个顺序别调换。
怎么做:Stripe 与 PayPal 分步接入
Stripe 无代码路线:建一个 Payment Link
还没写代码,先用 Payment Links 跑通收款最快,适合先在网站上挂个按钮试单。

- 进 Dashboard,打开 Payment Links 页面,点 +New。
- 选一个已有产品,或者点 +Add a new product,把产品详情填完点 Add product。
- 点 Create link,链接生成后可以放邮件、短信、社交媒体,同一根链接能重复用。
链接是托管在 Stripe 那边的页面,你的网站只要放一个按钮跳过去,不用碰接口。缺点也明显:产品改了要回后台改,想按订单做逻辑处理就没有空间。
Stripe 代码路线:Checkout Session 五步走
- 在服务端加一个端点创建 Checkout Session。line_items 设价格和币种,success_url 设支付完成后的跳转地址,integration_identifier 用来分组追踪这批订单。
- 建一个 HTML 页面,结账按钮提交到你刚写的服务端端点,客户点完会被重定向到会话返回的地址。
- 成功页托管在自己网站上,并把创建端点里的 success_url 改成指向它。客户付完钱要看到自己站上的成功页,不是别人的页面。
- 监听 checkout.session.completed 事件做履约。只靠 Checkout 成功页触发发货、开通会员不可靠,客户关掉页面事件照样会发,页面不一定回得来。
- 结账页地址要以 https:// 开头,集成才能工作。测试阶段可以不用 HTTPS,收真钱之前必须启用。
集成不动的时候,排查有固定顺序:打开浏览器开发者工具的 Network 标签,点一次结账按钮,看有没有发出打到服务端端点的 POST /create-checkout-session 请求,状态码是不是 200,再在按钮点击的监听里 console.log(session) 看返回的数据对不对。三步走完,问题出在页面还是出在服务端,基本就分清了。
Stripe 测试:四张测试卡够用
测试要用测试 API 密钥,所有接口调用都换成测试密钥,混用是上线后收不到钱的头号原因。
- 4242 4242 4242 4242:支付成功,不需要认证。有效期填任意未来日期,CVC 填任意 3 位数字,邮编填任意值。
- 4000 0025 0000 3155:需要认证的卡支付,用来验证 3DS 流程。
- 4000 0000 0000 9995:被拒付,返回 insufficient_funds 这类拒付码,用来验证失败提示。
- 6205 5000 0000 0000 004:UnionPay 卡,卡号长度 13 到 19 位可变。
付完之后去 Dashboard 的 Transactions 页面找这笔支付,列表里能看到就算成功。再去确认 webhook 端点收到了 checkout.session.completed 事件,事件没到,履约那一步就是空的,客户付了钱你这边什么都不动。
PayPal 接入:拿密钥,换 token
- 登录 Developer Dashboard,选 Apps & Credentials。新账户在 REST API apps 区自带一个 Default Application,要另建就点 Create App。
- 复制这个应用的 client ID 和 client secret。
- 把 CLIENT_ID:CLIENT_SECRET 做 Base64 编码,POST 到 https://api-m.sandbox.paypal.com/v1/oauth2/token,带上 grant_type=client_credentials。
- 返回里会有 access token 和这个 token 有效的秒数。调接口时在 authorization header 里写 Bearer 加 token,过期就再调一次 /v1/oauth2/token 换新的。
调不通的时候先看两件事:端点是不是 sandbox 那一个,Base64 编码的是不是 client ID 和 client secret 拼起来那一整串。这两处对了再去看应用权限,否则会在错误的方向上耗很久。
PayPal sandbox:模拟账户在哪里看
sandbox 是一个自包含的虚拟测试环境,模拟真实的生产环境,不碰任何真实 PayPal 账户。它的接口功能和线上一致,但关账户、出月度账单、存配送偏好、PayPal Shops 支持这些不适用于 sandbox,别拿这几项当 bug 查。
开发者账户默认带 2 个 sandbox 账户,一个个人账户用来买,一个企业账户用来卖,两边的登录信息都会给到你。登录 Developer Dashboard,选 Testing Tools 下的 Sandbox Accounts,找到账户点右侧的 ⋮,选 View/Edit Account,就能看到模拟邮箱和系统生成的密码。测试阶段每个接口请求都要用 sandbox 端点和 sandbox 账户信息,混进一个真实账户就会失败。
想看交易状态,用 sandbox 账户登录 https://www.sandbox.paypal.com/ ,上面才是这笔模拟交易的记录。想先不动代码摸摸接口,可以在 Postman 里试:fork PayPal 的 collection,在 Variables 的 CURRENT VALUE 列填 client_id 和 client_secret,点 Save,脚本会自己生成和管理 access_token。建订单选 Orders 下的 Create Order 点 Send,成功返回 201,响应里有 approve 链接,用 sandbox 个人账户登录打开;再复制订单 id 填到 Variables 的 order_id,选 Orders 下的 Capture payment for order 点 Send,成功同样返回 201。
功能跑通、没有 bug 之后,更新 API 凭据和端点目标,才算真的上线。
上线切换:sandbox 到 live 的四件事
Stripe 这边,账户资料激活之后,账户会从 sandbox 模式切到 live 模式。上线前在 Account settings 里填企业类型、税务信息、企业信息、个人验证信息、客户可见信息,比如账单上显示的 statement descriptor;再添加银行账户确认打款去向,设置两步验证,核对完点 Agree and submit。
然后把测试的 publishable 和 secret 密钥换成 live 密钥。这一条没有捷径,用测试密钥处理不了真实支付。PayPal 那边同理,把 sandbox 端点和 sandbox 凭据换成生产的端点和凭据。Stripe 的结账页地址要走 https,收真钱之前这条必须满足。
费率与限制:一笔 100 美元交易两边各扣多少
两家不是同一种计价结构,直接比百分比容易看错。PayPal 的固定费按收款币种不同,美元 0.49,欧元 0.39,英镑 0.39,日元 49.00,港币 3.79。下面这张表按美国站、美元结算、一笔 100 美元的交易来算。
| 项目 | Stripe(美国境内卡) | PayPal(美国站) |
|---|---|---|
| 标准费率 | 2.9% + 30¢ 每笔成功交易 | 3.49% + fixed fee(PayPal Checkout、Guest Checkout) |
| 国际交易加收 | 国际卡 +1.5%,需要货币兑换时 +1% | 国际交易 +1.50% |
| 一笔 100 美元境内交易实扣 | 3.20 美元 | 3.98 美元 |
| 一笔 100 美元国际卡或国际 PayPal 交易 | 4.70 美元(未计货币兑换 1%) | 5.48 美元 |
同一笔境内交易,PayPal 那边多扣 0.78 美元;换到国际交易,两家的加收比例一样,差距还是落在基础费率上。Stripe 这边没有 setup fees、monthly fees 这类固定收费。PayPal 的费率页标注最后更新日期是 2026 年 11 月 4 日,费率会调整,下单前先看这个日期。算得更细的写在 PayPal手续费 那一篇。
三个限制要知道。Checkout Session 默认创建后 24 小时过期,客户拿着超过 24 小时的链接付款会失败。PayPal 的 access token 有效期看返回里的 expires_in,官方示例里是 31668 秒,这个数会变,别写死成常量。Stripe 自定义域名是付费功能,$10 每月,每个账户只支持一个,用在 Stripe-hosted Checkout、Payment Links 和客户门户上,不能用 example.com/checkout 这种路径形式,必须是现有域名的子域名,这个功能也不支持 Managed Payments。
账户本身还有一层规则,大陆个人收款的部分看 PayPal大陆个人收款新规,接之前先对一遍自己的账户类型。
常见误区和排查顺序
排查顺序先定下来:先看密钥环境对不对,是测试的还是 live 的;再看请求有没有打到正确的端点;最后看账户状态和后台记录。按这个顺序走,多数问题在第一步就能定位,反过来从代码猜,容易白改一整天。
- 拿真实卡号在 live 模式测支付。Stripe 服务协议明确禁止用真实支付方式信息在 live 模式测试,被查到是账户层面的麻烦。
- 把卡号直接写进接口调用或者服务端代码。官方不推荐这么做,即使在测试环境,上线时也可能不符合 PCI 合规。
- 自己托管 Stripe.js,或者把它打进 bundle。要始终从 js.stripe.com 直接加载,这是合规要求,不是性能优化。
- 只靠成功页触发发货、开通会员。要监听 checkout.session.completed 事件,成功页只是一个页面,客户可能根本回不来。
- 用测试环境做压力测试。可能撞上速率限制。
- 一张测试卡从头用到尾。卡级状态会影响后面的测试,独立场景换一张卡,结果才干净。
- 自定义域名一直卡在 Adding。那是在等 DNS 记录验证,验证通过后 Stripe 才签发 TLS 证书、配置 CDN 路由。用 nslookup 查 CNAME 和 TXT,DNS 服务商更新最长等 10 分钟,部分服务商要求 CNAME 值末尾带点,TXT 值在输出里找不到就再等一会重跑命令。
- PayPal 验证邮件没到就反复注册。先看垃圾箱和拦截记录,几分钟内没收到在正常范围内。
- sandbox 里看不到交易。用 sandbox 账户登录 sandbox 测试站点看,那上面的记录才是模拟交易的记录。
还有一条跟钱直接相关:PayPal 收款会碰到拒付和争议,处理按官方政策走。
Stripe 和 PayPal 到底选哪个,什么情况两个都上
只看费率,境内卡 Stripe 低一档,PayPal Checkout 那一档要高一些。但 PayPal 走标准信用卡和借记卡是另一档更低的费率,比它自己的 Checkout 便宜,具体按哪个算,看结账页给客户的是哪个按钮。国际交易两家都在基础费率上加收,加的比例一样,差还是差在基础费率上。
看覆盖,两家的活不一样。Stripe 支持 100 多种支付方式,也支持 135 种以上货币的本地化定价,卡这条路的适配做得细;PayPal 覆盖的是本来就有 PayPal 账户的人,这部分人结账时认那个按钮,看不到就走。客户主要在欧美,PayPal 那一栏别省。
看接入成本。没有开发资源就走 Payment Links,或者用现成建站平台的插件接 Stripe 支付,能跑起来就行;有开发资源就走 Checkout Session 加 REST API,控制权在自己手上,后面加促销码、改成功页、接 webhook 都方便,出问题也能自己查。
什么情况两个都上:客单价不低、客户分布跨几个国家、结账页想少丢单,两个通道一起摆出来最省事,维护两套的成本比丢单的成本低。觉得两套太麻烦,替代方案可以看 Lemon Squeezy 和 Gumroad是什么;钱怎么进出这一层,总览在 国外常见收款方式。
接支付的代码和测试用例,AI 能帮到哪几步
接支付这件事里,AI 省时间的地方在写草稿和列清单,不在替你开户、替你点提交。下面四步可以交给它做。
- 把两家的接入步骤整理成一份对照清单,标出哪些步骤在后台点、哪些要写代码。这一步做完,你立刻知道自己卡在哪一层。
- 按 Checkout Session 的参数说明生成创建会话的服务端端点草稿,line_items、success_url、integration_identifier 三个参数按官方字段名写,不要自己改名。
- 按 OAuth 2.0 流程生成换 access token 的请求草稿,把 Base64 编码和 token 过期重取这两步写进注释。
- 把测试卡号、测试场景、预期结果整理成一张用例表,上线前逐条打勾。
下面三条提示词是本文给的示例,不是官方模板,复制过去按自己的字段改。
提示词一:按 Stripe 官方文档的 Checkout Sessions API,写一个创建 Checkout Session 的服务端端点示例,参数包含 line_items(价格与币种)、success_url、integration_identifier,并说明每个参数的作用。不要写任何密钥明文。
提示词二:按 PayPal REST API 的 OAuth 2.0 流程,写一段用 client ID 和 client secret 换 access token 的请求示例,说明 CLIENT_ID:CLIENT_SECRET 需要 Base64 编码,以及 token 过期后怎么重新申请。
提示词三:把我给你的这四组 Stripe 测试卡号和场景整理成测试用例表,分别是支付成功无需认证、需要认证、被拒付、UnionPay 可变长度这四种。每行给出卡号、场景、预期结果,最后加一列备注写这张卡适合验证什么。
有三件事必须你自己动手做,一件都替不了。一是在 Stripe Dashboard 的 Account settings 里把企业类型、税务信息、企业信息、个人验证信息、客户可见信息一项项填完,添加银行账户,最后点 Agree and submit。二是在 PayPal Developer Dashboard 的 Apps & Credentials 里建应用,把 client ID 和 client secret 复制进自己服务器的环境变量。三是在 Dashboard 的 Transactions 页和 sandbox 站点上亲眼看这笔测试交易在不在、状态对不对,再决定是继续修还是切 live 密钥。
整理两家文档的步骤对照、把字段名逐个核对一遍,这类活猎者出海的AI Agent 做得比人快,剩下的判断还是你的。
常见问题
Stripe 注册需要什么条件?
要有一个在中国大陆以外注册的法律实体,注册时选境外实体注册地,这个选择决定能用的产品和结算方式。流程是填邮箱、全名、国家、密码,再填企业资料,最后到 Dashboard 点 Verify your email。每个地区具体要交什么材料,按注册页当时的提示准备。
独立站怎么接入 PayPal?
在 Apps & Credentials 里建应用,拿 client ID 和 client secret,Base64 编码后换成 access token,再用 Bearer 调接口。先在 sandbox 用模拟账户跑通全流程,再换生产端点和 live 凭据。上线集成和在美国以外测试都要 Business 账户。
Stripe 和 PayPal 哪个费率低?
美国站同一笔境内交易,Stripe 卡那一档比 PayPal Checkout 便宜一点。但 PayPal 走标准信用卡和借记卡又是更低的一档,看结账页给客户的是哪个产品。国际交易两家都在基础费率上加收,比例一样。
不用开发者能接 Stripe 吗?
可以。在 Dashboard 的 Payment Links 页面建一个链接,放到邮件、短信或者网站上就行。用现成建站平台搭站的,装个插件也能接,不用自己写接口。
没有开发者账号能试 PayPal 的接口吗?
可以在 Postman 里试,fork PayPal 的 collection,在 Variables 里填 client_id 和 client_secret,access_token 由脚本管理。真要上线集成,还是得有 Business 账户。
Stripe 自定义域名多久能生效?
DNS 记录建好之后,服务商更新最长等 10 分钟。记录验证通过,Stripe 会在它那边开通域名,就绪时发邮件和后台通知。域名停在 Adding 状态就是在等这一步,不用反复删了重建。
支付接完只代表站能收钱了,后面还有内容和流量两件事。猎者出海的AI Agent 上线后每周给一张改稿单,说清改哪几篇、先改哪一篇,收款这条线跑稳了,精力才腾得出来做别的。

发表评论