Stripe Connect:客户和帐户之间有啥区别?

Posted

技术标签:

【中文标题】Stripe Connect:客户和帐户之间有啥区别?【英文标题】:Stripe Connect: What's the difference between Customers and Accounts?Stripe Connect:客户和帐户之间有什么区别? 【发布时间】:2017-03-06 19:53:18 【问题描述】:

目前,似乎 Connect 的 Accounts 完成了 Customers 所做的一切,例如可以将银行卡直接添加到Accounts 帐户。因此,仅仅为用户创建一个Accounts 对象似乎就足够了,但是有没有一种情况我必须创建一个Customers 对象?

例如,在教程 (https://stripe.com/docs/connect/payments-fees) 中,TOKEN 可以简单地提供 Accounts 可发布密钥:

stripe.charges.create(
  amount: 1000,
  currency: 'usd',
  source: TOKEN,
  destination: CONNECTED_STRIPE_ACCOUNT_ID
);

为了澄清,source 是从哪里提取资金,destination 是资金将流向哪里?并且资金会存入destination的默认银行账户?

另外,当Accounts 通过 API 创建时,新连接的帐户是否可以通过平台的仪表板查看?还可以查看交易和余额?

最后,转账时,不明确来源,是否意味着资金将从平台账户余额中提取?

var stripe = require('stripe')(PLATFORM_SECRET_KEY);
stripe.transfers.create(
  
    amount: 1000,
    currency: "usd",
    destination: "default_for_currency"
  ,
  stripe_account: CONNECTED_STRIPE_ACCOUNT_ID
);

将接受/赞成答案。提前谢谢你。

【问题讨论】:

【参考方案1】:

在开发平台时,您通常对两个功能感兴趣:支付收款。 Stripe 将这些函数分为两种不同的对象类型。

帐户

Account 是一个对象,代表您向其付款的用户。一个帐户可以附加一个External Account一个银行帐户,或者在某些情况下,一个借记卡)。出于合规原因,帐户需要提供一些个人信息来验证用户的身份。

您可以将三种类型的帐户连接到平台:

Standard(以前称为Standalone),它们是普通的 Stripe 帐户。您通过基于 OAuth 的流程将 Standard Stripe 帐户连接到您的平台。 Custom(以前的 Managed),让您可以更好地控制 用户体验,但需要更多工作:您完全通过 API 控制自定义帐户,并负责构建仪表板、注册表单和其他帐户管理界面。 Express 帐户,介于标准和自定义之间。 Stripe 为 Express 用户提供了一个简单的注册表单和一个精简的仪表板。

https://stripe.com/docs/connect/connecting-to-accounts

客户

Customer 是一个对象,您可以在其中保存信用额度、银行账户、比特币接收器等,然后从中收取/付款。 https://stripe.com/docs/api#customers

Stripe 提供了创建Customer 对象的功能,如果您想存储卡并在未来对其进行收费。如果您只对一次性交易感兴趣,您可以简单地获取并使用通过 Checkout / Stripe.js / mobile sdk 和您的可发布密钥获得的令牌。

您可以在此处找到使用令牌进行一次性付款和客户的付款流程示例,https://stripe.com/docs/charges

需要明确的是,没有办法向客户对象付款或从附加到帐户的银行帐户或借记卡中扣款。


在你的第一个例子中:

source 是一个令牌,tok_xxxyyyyzzz,通常通过 Stripe.js / Checkout / mobile SDK 获得,您将传递给您的后端。如果您将源保存到帐户上的Customer,则可以传递customer: cus_xxxyyyzzz,而不是对Customer 收取默认的source

https://stripe.com/docs/connect/payments-fees#charging-through-the-platform

destination 是您希望资金流过的Account。使用destination 充电最常用于自定义帐户。以这种方式收费时,资金将从您的平台转移到destination 账户的余额。如果该账户设置为自动转账,当这些资金可用于转账时,资金将自动转入其默认银行账户。

流程如下所示:

Charge (token or customer on Platform) -> Platform Balance -> Custom Account Balance (destination) -> Custom Account Bank Account

如果您需要更好地控制资金从自定义帐户的余额转移到其银行帐户,您可以将自定义帐户设置为手动转账。在此处阅读更多相关信息,https://stripe.com/docs/connect/bank-transfers#payout-information


如果您正在创建 Custom Accounts 或用户正在通过 OAuth 流程连接他们的 Standard Accounts,他们应该可以在您的仪表板中查看:https://dashboard.stripe.com/applications/users

如果您想了解关联账户余额的具体详细信息,您需要拨打电话以检索他们的余额或余额交易,同时使用 Stripe 账户标头(他​​们的账户 ID,例如 acct_xxxyyyyzzzz )

https://stripe.com/docs/connect/authentication#authentication-via-the-stripe-account-header https://stripe.com/docs/api#balance_history


最后,您提供的示例是传递 Stripe-Account 标头 stripe_account: CONNECTED_STRIPE_ACCOUNT_ID,因此它发生在关联账户上 --- 它将资金从关联账户的余额转移到其默认银行账户。如果您的关联帐户正在进行手动转账,则将使用此选项。

此处概述了您从平台余额转移到关联账户的方式。 https://stripe.com/docs/connect/special-case-transfers#transferring-to-another-stripe-account

正如“特殊情况转移”的名称所暗示的那样,这些Platform -> Connected Account 转移只应在有限的情况下发生(目前没有办法从关联账户 -> 平台转移资金)。

ripe = require('stripe')(PLATFORM_SECRET_KEY);
stripe.transfers.create(
  
    amount: 1000,
    currency: 'usd',
    destination: CONNECTED_STRIPE_ACCOUNT_ID,
    source_transaction: CHARGE_ID
  
);

总体而言,构建一个满足您需求的 Connect 流程可能是一项复杂但有益的工作 --- 如果您对具体细节感到困惑,我建议您与 Stripe 的支持人员聊天,https://support.stripe.com/email

【讨论】:

真的很欣赏深入的洞察力。需要澄清一下,将stripe_account: CONNECTED_STRIPE_ACCOUNT_ID 放在请求标头中是否意味着我代表该特定帐户行事?但是如果我只是放destination参数,我只是在充当平台?此外,我尝试在标题中使用"stripe_account": "acct_128vxaLwTNBjRk7o" 的第二个示例,但收到以下错误"Must provide source or customer."。认为在标题中提供stripe_account 是作为来源?提前谢谢你 是的,没错,当您使用stripe_account: CONNECTED_STRIPE_ACCOUNT_ID 时,您代表该帐户行事。平台上正在发生destination 收费,资金正在(自动)转移到destination。传递“stripe_account”有效地使操作发生在那个帐户上。帐户永远不是您可以收费的来源。 "Must provide source or customer." 表示您需要提供来源,如果您将stripe_account 传递为acct_128vxaLwTNBjRk7o,则它必须是acct_128vxaLwTNBjRk7o 帐户上的客户或令牌。 信息量很大 - 我从中获得的信息比从官方文档中获得的要多得多。 这是很好的解释,比官方文档中的概述要好得多。无论如何,我仍然有一个问题 - 当我创建卡令牌时,我可以在创建费用时在“源”中使用它,但是你提到如果这个令牌分配给客户,那么应该只能使用客户 ID 'cus_xxxx'。但是它总是无法声称“没有这样的令牌:cus_xxxx”。 @ArturSkrzydło 确保在您的收费请求中将客户 ID 传递给 customer 属性,而不是 source。 stripe.com/docs/… 如果您仍然遇到问题,则可能是 1) 使用了不正确的 API 密钥,2) 如果您使用的是 Connect,您可能会尝试使用错误的帐户访问客户(例如,客户位于在您的平台上,但您在关联帐户等上提出请求)。

以上是关于Stripe Connect:客户和帐户之间有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Firebase Cloud Functions 创建 Stripe Connect 帐户

Java 中 给一个object 赋值属性, 既可以用构造函数的方式,也可以用setXXXX()的方式,而它们之间有啥区

Stripe、Stripe Payments、Connect、关联账户、拆分支付

条纹复制客户

Stripe Connect:在Stripe Connect中,谁将支付Stripe费用,如何确定?

Stripe API:您如何找到跨境转账到 Connect 账户的汇率和外币金额?