【问题标题】:How can I get the original charge and refund ids of an automatic payout如何获取自动付款的原始费用和退款 ID
【发布时间】:2018-02-27 23:58:35
【问题描述】:

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

给定一个条带帐户 ID,您如何获得对上次付款有贡献的条带费用和退款 ID 列表?

【问题讨论】:

    标签: ruby stripe-payments stripe-connect


    【解决方案1】:

    我已经与 Stripe 的支持团队进行了广泛的交流,并且有几个难题需要解决:

    付款由帐户确定

    如果您query stripe for a list of payouts,您将只会收到您(平台所有者)从 Stripe 获得的支付对象。要获取特定帐户的支付对象,您可以使用平台的正常身份验证,但 send the stripe account id as a header。所以获得最后一笔支出的代码 sn-p 看起来像这样(我将使用 ruby​​ sn-ps 作为其余答案的示例):

    Stripe::Payout.list({limit: 1}, {stripe_account: 'acct_0000001234567890aBcDeFgH'})
    => #<Stripe::ListObject:0x0123456789ab> JSON: {
      "object": "list",
      "data": [
        {"id":"po_1000001234567890aBcDeFgH",
         "object":"payout",
         "amount":53102,
         "arrival_date":1504000000,
         "balance_transaction":"txn_2000001234567890aBcDeFgH",
         "created":1504000000,
         "currency":"eur",
         "description":"STRIPE TRANSFER",
         "destination":"ba_3000001234567890aBcDeFgH",
         "failure_balance_transaction":null,
         "failure_code":null,
         "failure_message":null,
         "livemode":true,"metadata":{},
         "method":"standard",
         "source_type":"card",
         "statement_descriptor":"[…]",
         "status":"paid",
         "type":"bank_account"
        }
      ],
      "has_more": true,
      "url": "/v1/payouts"
    }
    

    有了payout id,我们可以查询balance transactions, scoped to a payout的列表:

    Stripe::BalanceTransaction.all({
        payout: 'po_1000001234567890aBcDeFgH',
        limit: 2,
    }, {
        stripe_account: 'acct_0000001234567890aBcDeFgH'
    })
    

    与被视为平台所有者的对象相比,被视为帐户的对象被剥夺了大部分信息

    即使您现在拥有付款 ID,该对象仍仅限于帐户,您无法以平台所有者的身份检索它。但作为一个账户,支付只显示类似这样的伪收费和退款对象(注意第二笔交易有一个py_7000001234567890aBcDeFgH 对象作为来源,而不是一个常规的ch_ 收费对象):

    Stripe::BalanceTransaction.all({
        payout: 'po_1000001234567890aBcDeFgH',
        limit: 2,
    }, {
        stripe_account: 'acct_0000001234567890aBcDeFgH'
    })
    => {
        :object => "list",
        :data => [
            {
                :id => "txn_4000001234567890aBcDeFgH",
                :object => "balance_transaction",
                :amount => -53102,
                :available_on => 1504000000,
                :created => 1504000000,
                :currency => "eur",
                :description => "STRIPE TRANSFER",
                :fee => 0,
                :fee_details => [],
                :net => -53102,
                :source => "po_5000001234567890aBcDeFgH",
                :status => "available",
                :type => "payout"
            },
            {
                :id => "txn_6000001234567890aBcDeFgH",
                :object => "balance_transaction",
                :amount => 513,
                :available_on => 1504000000,
                :created => 1504000000,
                :currency => "eur",
                :description => nil,
                :fee => 0,
                :fee_details => [],
                :net => 513,
                :source => "py_7000001234567890aBcDeFgH",
                :status => "available",
                :type => "payment"
            }
        ],
        :has_more => true,
        :url => "/v1/balance/history"
    }
    

    您可以让条带自动扩展响应中的对象

    As an additional parameter, you can give stripe paths of objects which you want stripe to expand in their response. 这样我们就可以通过转移从伪对象回到原来的电荷对象:

    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 列表调用退款交易返回的伪 pyr_ 中获取原始 re_ 对象。我发现的最佳替代方法是通过data.source.charge.source_transfer.source_transaction 路径获取发出退款的费用的费用ID,并将其与pyr_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
    

    【讨论】:

      【解决方案2】:

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

      Stripe::BalanceTransaction.list({
        payout: 'po_1000001234567890aBcDeFgH',
        expand: [
          'data.source.source_transfer', # For charges
          'data.source.transfer_reversal', # For refunds
        ]
      }, {
        stripe_account: 'acct_0000001234567890aBcDeFgH'
      }).auto_paging_each do |balance_transaction|
        case balance_transaction.type
          when 'payment'
            charge_id = balance_transaction.source.source_transfer.source_transaction
          when 'payment_refund'
            refund_id = balance_transaction.source.charge.source_transfer.source_transaction
          end
        end
      end
      

      【讨论】:

        猜你喜欢
        • 2018-12-12
        • 2014-04-03
        • 1970-01-01
        • 2016-03-07
        • 2013-04-17
        • 1970-01-01
        • 2018-03-24
        • 2014-04-13
        • 1970-01-01
        相关资源
        最近更新 更多