💲
Stripeでサブスク登録後にAmountやNetを取得する方法
はじめに
Stripeでは徴収した料金のうち、税金(tax)はいくらか、手数料差し引き後の料金(net)はいくらかAPIでリクエストすることで取得することができます。
しかしこれらの情報はInvoiceにあったりchargeにあったりbalance transactionにあったりとバラバラです。
「これら個別に対してAPIリクエストするのもいいですが一発で全て取得したい...」そんな時はExpanding Responses を使用します!
Expanding Responsesとは
下記のような通常のリクエストでは取得できないレスポンスを取得する方法です。
・関連するオブジェクトから取得されたプロパティ
・関連性の薄いオブジェクトから取得されたプロパティ
・リスト内の全オブジェクトの追加プロパティ
・デフォルトではレスポンスに含まれないプロパティ
実装
では実際にInvoice ID 1つから手数料や消費税金額、手数料差し引いた売上を取得してみます。
取得は至って簡単です。下記のようにInvoice情報をRetrieveする時に第2引数にExpandを指定してあげるだけです。
const test = await stripe.invoices.retrieve(
'in_***********************',
{expand: ['charge.balance_transaction']}
)
Responceは次のようになります。(量が多いので一部レスポンスは削除しています)
{
id: 'in_*************************',
object: 'invoice',
account_country: 'JP',
account_name: 'Test',
account_tax_ids: null,
amount_due: 330,
amount_paid: 330,
amount_remaining: 0,
application_fee_amount: null,
attempt_count: 1,
attempted: true,
auto_advance: false,
automatic_tax: { enabled: true, status: 'complete' },
billing_reason: 'subscription_create',
charge: {
id: 'ch_*************************',
object: 'charge',
amount: 330,
amount_captured: 330,
amount_refunded: 0,
application: null,
application_fee: null,
application_fee_amount: null,
balance_transaction: {
id: 'txn_*************************',
object: 'balance_transaction',
amount: 330,
available_on: 1649257200,
created: 1648725185,
currency: 'jpy',
description: 'Subscription creation',
exchange_rate: null,
fee: 12,
fee_details: [Array],
net: 318,
reporting_category: 'charge',
source: 'ch_*************************',
status: 'available',
type: 'charge'
},
billing_details: { address: [Object], email: null, name: null, phone: null },
calculated_statement_descriptor: 'Stripe',
captured: true,
created: 1648725185,
currency: 'jpy',
customer: 'cus_*************************',
description: 'Subscription creation',
destination: null,
dispute: null,
disputed: false,
failure_balance_transaction: null,
failure_code: null,
failure_message: null,
fraud_details: {},
invoice: 'in_*************************',
livemode: false,
metadata: {},
on_behalf_of: null,
order: null,
outcome: {
network_status: 'approved_by_network',
reason: null,
risk_level: 'normal',
risk_score: 44,
seller_message: 'Payment complete.',
type: 'authorized'
},
paid: true,
payment_intent: 'pi_*************************',
payment_method: 'card_*************************',
payment_method_details: { card: [Object], type: 'card' },
receipt_email: null,
receipt_number: null,
receipt_url: 'https://pay.stripe.com/receipts/acct_*************************/ch_*************************/rcpt_*************************',
refunded: false,
refunds: {
object: 'list',
data: [],
has_more: false,
total_count: 0,
url: '/v1/charges/ch_*************************/refunds'
},
review: null,
shipping: null,
source: {
id: 'card_*************************',
object: 'card',
address_city: null,
address_country: null,
address_line1: null,
address_line1_check: null,
address_line2: null,
address_state: null,
address_zip: null,
address_zip_check: null,
brand: 'MasterCard',
country: 'US',
customer: 'cus_*************************',
cvc_check: null,
dynamic_last4: null,
exp_month: 4,
exp_year: 2044,
fingerprint: '*************************',
funding: 'credit',
last4: '4444',
metadata: {},
name: null,
tokenization_method: null
},
source_transfer: null,
statement_descriptor: null,
statement_descriptor_suffix: null,
status: 'succeeded',
transfer_data: null,
transfer_group: null
},
collection_method: 'charge_automatically',
created: 1648725183,
currency: 'jpy',
custom_fields: null,
customer: 'cus_*************************',
customer_address: {
city: '*****',
country: '**',
line1: '*****',
line2: '*****',
postal_code: '*******',
state: '*****'
},
customer_email: '*****@gmail.com',
customer_name: '*****',
customer_phone: null,
customer_shipping: null,
customer_tax_exempt: 'none',
customer_tax_ids: [],
default_payment_method: null,
default_source: null,
default_tax_rates: [],
description: null,
discount: null,
discounts: [],
due_date: null,
ending_balance: 0,
footer: null,
hosted_invoice_url: 'https://invoice.stripe.com/i/acct_*****/test_*************************?s=ap',
invoice_pdf: 'https://pay.stripe.com/invoice/acct_*****/test_*************************/pdf?s=ap',
last_finalization_error: null,
lines: {
object: 'list',
data: [ [Object] ],
has_more: false,
total_count: 1,
url: '/v1/invoices/in_*************************/lines'
},
livemode: false,
metadata: {},
next_payment_attempt: null,
number: '4A857FFD-0004',
on_behalf_of: null,
paid: true,
paid_out_of_band: false,
payment_intent: 'pi_*************************',
payment_settings: { payment_method_options: null, payment_method_types: null },
period_end: 1648725183,
period_start: 1648725183,
post_payment_credit_notes_amount: 0,
pre_payment_credit_notes_amount: 0,
quote: null,
receipt_number: null,
starting_balance: 0,
statement_descriptor: null,
status: 'paid',
status_transitions: {
finalized_at: 1648725183,
marked_uncollectible_at: null,
paid_at: 1648725183,
voided_at: null
},
subscription: 'sub_*************************',
subtotal: 300,
tax: 30,
test_clock: null,
total: 330,
total_discount_amounts: [],
total_tax_amounts: [
{
amount: 30,
inclusive: false,
tax_rate: 'txr_*************************'
}
],
transfer_data: null,
webhooks_delivered_at: 1648725183
}
なお今回取得したかったStripe手数料や消費税金額、手数料差し引いた売上は次のプロパティから取得できます。
total:顧客から回収した金額
charge.fee:Stripeから徴収された手数料
charge.net:totalからfeeを引いた金額
tax:消費税金額
※netから消費税も差し引いた利益?についてはcharge.netからtaxを引くという計算を行う必要があります。
参考
Discussion