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