Ruby 如何获得自动付款的原始收费和退款ID

Ruby 如何获得自动付款的原始收费和退款ID,ruby,stripe-payments,stripe-connect,Ruby,Stripe Payments,Stripe Connect,Stripe connect帐户可配置为定期合并付款,例如,在我们的案例中,每月付款。对于这些每月支付,我们需要向账户所有者解释我们平台上的哪些交易(我们的情况下是预订和退款)产生了他们收到的总金额。我们将条带费用id(resp.Return id)存储在数据库中的预订(resp.Return)对象中。因此,问题归结为: 给定一个stripe帐户id,您如何获得上次付款的stripe费用和退款id列表?我与stripe的支持团队进行了广泛的交流,需要几个拼图才能到达: 支出的范围由账户决定 如果

Stripe connect帐户可配置为定期合并付款,例如,在我们的案例中,每月付款。对于这些每月支付,我们需要向账户所有者解释我们平台上的哪些交易(我们的情况下是预订和退款)产生了他们收到的总金额。我们将条带费用id(resp.Return id)存储在数据库中的预订(resp.Return)对象中。因此,问题归结为:


给定一个stripe帐户id,您如何获得上次付款的stripe费用和退款id列表?

我与stripe的支持团队进行了广泛的交流,需要几个拼图才能到达:

支出的范围由账户决定 如果是,您将只收到平台所有者从stripe获得的支付对象。要获取特定帐户的支付对象,您可以使用平台的正常身份验证,但是。因此,获得最后一次支付的代码片段如下所示(我将使用ruby片段作为示例来回答余下的问题):

与被视为平台所有者的对象相比,被视为帐户的对象被剥夺了大部分信息 即使您现在有了支付id,对象仍然限定在帐户的范围内,并且您无法作为平台所有者检索它。但作为一个账户来看,支出仅显示类似于这些的伪收费和退款对象(请注意,第二笔交易有一个
py\u 70000134567890abcdefgh
对象作为来源,而不是常规的
ch\u
收费对象):

您可以让条带自动展开响应中的对象 因此,我们可以通过传输从伪对象走回原始电荷对象:

Stripe::BalanceTransaction.all({
    payout: 'po_1000001234567890aBcDeFgH',
    limit: 2,
    expand:['data.source.source_transfer',]
}, {
    stripe_account: 'acct_0000001234567890aBcDeFgH'
}).data.second.source.source_transfer.source_transaction
=> "ch_8000001234567890aBcDeFgH"
如果要处理整个列表,需要在
source.object
属性之间消除歧义:

Stripe::BalanceTransaction.all({
    payout: 'po_1000001234567890aBcDeFgH',
    limit: 2,
    expand:['data.source.source_transfer',]
}, {
    stripe_account: 'acct_0000001234567890aBcDeFgH'
}).data.map do |bt| 
  if bt.source.object == 'charge'
    ['charge', bt.source.source_transfer.source_transaction]
  else
    [bt.source.object]
  end
end
=> [["payout"], ["charge", "ch_8000001234567890aBcDeFgH"]]
退款没有连接到原始ID的对象路径 不幸的是,目前无法从BalanceTransaction list调用退款交易返回的伪
pyr
对象中获取原始
re
对象。我找到的最好的替代方法是通过
data.source.charge.source\u transfer.source\u transaction
路径获取退款所依据的费用的费用id,并将其与
pyr\u
created
属性结合使用,以匹配我们的数据库退款对象。不过,我不确定这种方法到底有多稳定。提取该数据的代码:

Stripe::BalanceTransaction.all({
    payout: 'po_1000001234567890aBcDeFgH',
    limit: 100, # max page size, the code to iterate over all pages is TBD
    expand: [
        'data.source.source_transfer', # For charges
        'data.source.charge.source_transfer', # For refunds
    ]
}, {
    stripe_account: 'acct_0000001234567890aBcDeFgH'
}).data.map do |bt|
  res = case bt.source.object
    when 'charge'
      {
          charge_id: bt.source.source_transfer.source_transaction
      }
    when 'refund'
      {
          charge_id: bt.source.charge.source_transfer.source_transaction
      }
    else
      {}
  end
  res.merge(type: bt.source.object, amount: bt.amount, created: bt.created)
end

现在可以通过“转账撤销”对象获取退款ID:

Stripe::BalanceTransaction.list({
付款:“po_100001234567890ABCDEFGH”,
扩展:[
“data.source.source_transfer”,用于收费
“数据.来源.转账#冲销”#用于退款
]
}, {
条带账户:“账户0000001234567890aBcDeFgH”
}).auto_paging_每个do|balance_事务|
案例余额\事务处理类型
何时“付款”
费用\标识=余额\交易。来源。来源\转账。来源\交易
何时“付款\退款”
退款\u id=余额\u交易。来源。费用。来源\u转账。来源\u交易
结束
结束
结束
Stripe::BalanceTransaction.all({
    payout: 'po_1000001234567890aBcDeFgH',
    limit: 2,
    expand:['data.source.source_transfer',]
}, {
    stripe_account: 'acct_0000001234567890aBcDeFgH'
}).data.second.source.source_transfer.source_transaction
=> "ch_8000001234567890aBcDeFgH"
Stripe::BalanceTransaction.all({
    payout: 'po_1000001234567890aBcDeFgH',
    limit: 2,
    expand:['data.source.source_transfer',]
}, {
    stripe_account: 'acct_0000001234567890aBcDeFgH'
}).data.map do |bt| 
  if bt.source.object == 'charge'
    ['charge', bt.source.source_transfer.source_transaction]
  else
    [bt.source.object]
  end
end
=> [["payout"], ["charge", "ch_8000001234567890aBcDeFgH"]]
Stripe::BalanceTransaction.all({
    payout: 'po_1000001234567890aBcDeFgH',
    limit: 100, # max page size, the code to iterate over all pages is TBD
    expand: [
        'data.source.source_transfer', # For charges
        'data.source.charge.source_transfer', # For refunds
    ]
}, {
    stripe_account: 'acct_0000001234567890aBcDeFgH'
}).data.map do |bt|
  res = case bt.source.object
    when 'charge'
      {
          charge_id: bt.source.source_transfer.source_transaction
      }
    when 'refund'
      {
          charge_id: bt.source.charge.source_transfer.source_transaction
      }
    else
      {}
  end
  res.merge(type: bt.source.object, amount: bt.amount, created: bt.created)
end