【发布时间】:2022-09-22 23:23:49
【问题描述】:
当我通过他们的 API 在 Stripe 请求发票金额时,我会返回所有数据。所以我需要自己计算发票的数量。
这是我返回的 JSON 数据:
{
\"object\": \"list\",
\"data\": [
{
\"id\": \"in_0LkpzOCKEf7***t2FwMlp5kQ\",
\"object\": \"invoice\",
\"account_country\": \"NL\",
\"account_name\": \"My Business Inc.\",
\"account_tax_ids\": null,
\"amount_due\": 3700,
\"amount_paid\": 3700,
\"amount_remaining\": 0,
\"application\": null,
\"application_fee\": null,
\"attempt_count\": 1,
\"attempted\": true,
\"auto_advance\": false,
\"automatic_tax\": {
\"enabled\": false,
\"status\": null
},
\"billing\": \"charge_automatically\",
\"billing_reason\": \"subscription_cycle\",
\"charge\": \"ch_2Lkq37CKEf***bt21g0bkJVa\",
\"closed\": true,
\"collection_method\": \"charge_automatically\",
\"created\": 1666436458,
\"currency\": \"usd\",
\"custom_fields\": null,
\"customer\": \"cus_MTkibG***56Uz4\",
\"customer_address\": {
\"city\": \"\",
\"country\": \"US\",
\"line1\": \"\",
\"line2\": \"\",
\"postal_code\": \"\",
\"state\": \"\"
},
\"customer_email\": \"test1@***.net\",
\"customer_name\": \"Test\",
\"customer_phone\": null,
\"customer_shipping\": null,
\"customer_tax_exempt\": \"none\",
\"customer_tax_ids\": [],
\"date\": 1666436458,
\"default_payment_method\": null,
\"default_source\": null,
\"default_tax_rates\": [],
\"description\": null,
\"discount\": null,
\"discounts\": [],
\"due_date\": null,
\"ending_balance\": 0,
\"finalized_at\": 1666440058,
\"footer\": null,
\"forgiven\": false,
\"from_invoice\": null,
\"hosted_invoice_url\": \"https://invoice.stripe.com/i/acct_1mMtCKEf7b***2BIJNR2/test_YWNjdF8xbU10Q0t***diTmJ0MkJJSk5SMixfTVRuYWhHcUd5YkNrdkFrSWJTU1BrTFFqWFNLa2NpUiw1NDM5ODkwNw0200PuDmVCv2?s=ap\",
\"invoice_pdf\": \"https://pay.stripe.com/invoice/acct_1mMtCKEf7bNbt2BI***/test_YWNjdF8xbU10Q0tFZjdiTmJ0MkJJSk5SMixfTVRuYWhHcUd5YkNrdkFrSWJTU1BrTFFqWFNLa2NpUiw1NDM5ODkwNw***0PuDmVCv2/pdf?s=ap\",
\"last_finalization_error\": null,
\"latest_revision\": null,
\"lines\": {
\"object\": \"list\",
\"data\": [
{
\"id\": \"sub_0LknEJCKEf7bN***bblGV2Lb\",
\"object\": \"line_item\",
\"amount\": 3700,
\"amount_excluding_tax\": 3700,
\"currency\": \"usd\",
\"description\": null,
\"discount_amounts\": [],
\"discountable\": true,
\"discounts\": [],
\"livemode\": false,
\"metadata\": {},
\"period\": {
\"end\": 1669114858,
\"start\": 1666436458
},
\"plan\": {
\"id\": \"plan_MTjYr***qiEqvG\",
\"object\": \"plan\",
\"active\": true,
\"aggregate_usage\": null,
\"amount\": 3700,
\"amount_decimal\": \"3700\",
\"billing_scheme\": \"per_unit\",
\"created\": 1663840359,
\"currency\": \"usd\",
\"interval\": \"month\",
\"interval_count\": 1,
\"livemode\": false,
\"metadata\": {},
\"name\": \"PrimaJust Basic - Normal (normal)\",
\"nickname\": null,
\"product\": \"prod_MTjYz***ireFSm\",
\"statement_descriptor\": null,
\"tiers\": null,
\"tiers_mode\": null,
\"transform_usage\": null,
\"trial_period_days\": null,
\"usage_type\": \"licensed\"
},
\"price\": {
\"id\": \"plan_MTjYri****EqvG\",
\"object\": \"price\",
\"active\": true,
\"billing_scheme\": \"per_unit\",
\"created\": 1663840359,
\"currency\": \"usd\",
\"custom_unit_amount\": null,
\"livemode\": false,
\"lookup_key\": null,
\"metadata\": {},
\"nickname\": null,
\"product\": \"prod_MTjYzrt****FSm\",
\"recurring\": {
\"aggregate_usage\": null,
\"interval\": \"month\",
\"interval_count\": 1,
\"trial_period_days\": null,
\"usage_type\": \"licensed\"
},
\"tax_behavior\": \"unspecified\",
\"tiers_mode\": null,
\"transform_quantity\": null,
\"type\": \"recurring\",
\"unit_amount\": 3700,
\"unit_amount_decimal\": \"3700\"
},
\"proration\": false,
\"proration_details\": {
\"credited_items\": null
},
\"quantity\": 1,
\"subscription\": null,
\"subscription_item\": \"si_MTkjw****365QO\",
\"tax_amounts\": [],
\"tax_rates\": [],
\"type\": \"subscription\",
\"unique_id\": \"il_0LvfRmCKEf7b****W02LkMli\",
\"unique_line_item_id\": \"sli_09f50cCKE****bt2a5104f59\",
\"unit_amount_excluding_tax\": \"3700\"
}
],
\"has_more\": false,
\"total_count\": 1,
\"url\": \"/v1/invoices/in_0LkpzOCKEf7bNbt****p5kQ/lines\"
},
\"livemode\": false,
\"metadata\": {},
\"next_payment_attempt\": null,
\"number\": \"77EC823A-0002\",
\"on_behalf_of\": null,
\"paid\": true,
\"paid_out_of_band\": false,
\"payment\": \"ch_2Lkq37CKEf7bNb****0bkJVa\",
\"payment_intent\": \"pi_2Lkq37CKEf7****21k1FnV1V\",
\"payment_settings\": {
\"default_mandate\": null,
\"payment_method_options\": null,
\"payment_method_types\": null
},
\"period_end\": 1666436458,
\"period_start\": 1663844458,
\"post_payment_credit_notes_amount\": 0,
\"pre_payment_credit_notes_amount\": 0,
\"quote\": null,
\"receipt_number\": null,
\"rendering_options\": null,
\"starting_balance\": 0,
\"statement_descriptor\": null,
\"status\": \"paid\",
\"status_transitions\": {
\"finalized_at\": 1666440058,
\"marked_uncollectible_at\": null,
\"paid_at\": 1666440058,
\"voided_at\": null
},
\"subscription\": \"sub_0LknEJCKEf7bN****blGV2Lb\",
\"subtotal\": 3700,
\"subtotal_excluding_tax\": 3700,
\"tax\": null,
\"tax_percent\": null,
\"test_clock\": \"clock_0LknBQCKEf7b****4PjP6QSa\",
\"total\": 3700,
\"total_discount_amounts\": [],
\"total_excluding_tax\": 3700,
\"total_tax_amounts\": [],
\"transfer_data\": null,
\"webhooks_delivered_at\": 1666436458
},
{
\"id\": \"in_0LknEJCKEf7b*****uRU4Rxf\",
\"object\": \"invoice\",
\"account_country\": \"NL\",
\"account_name\": \"My Business Inc.\",
\"account_tax_ids\": null,
\"amount_due\": 3700,
\"amount_paid\": 3700,
\"amount_remaining\": 0,
\"application\": null,
\"application_fee\": null,
\"attempt_count\": 1,
\"attempted\": true,
\"auto_advance\": false,
\"automatic_tax\": {
\"enabled\": false,
\"status\": null
},
\"billing\": \"charge_automatically\",
\"billing_reason\": \"subscription_update\",
\"charge\": \"ch_2LknEJCKEf7b****1V5n5Yvt\",
\"closed\": true,
\"collection_method\": \"charge_automatically\",
\"created\": 1663844458,
\"currency\": \"usd\",
\"custom_fields\": null,
\"customer\": \"cus_MTkib****56Uz4\",
\"customer_address\": {
\"city\": \"\",
\"country\": \"US\",
\"line1\": \"\",
\"line2\": \"\",
\"postal_code\": \"\",
\"state\": \"\"
},
\"customer_email\": \"test1@****.net\",
\"customer_name\": \"Test1\",
\"customer_phone\": null,
\"customer_shipping\": null,
\"customer_tax_exempt\": \"none\",
\"customer_tax_ids\": [],
\"date\": 1663844458,
\"default_payment_method\": null,
\"default_source\": null,
\"default_tax_rates\": [],
\"description\": null,
\"discount\": null,
\"discounts\": [],
\"due_date\": null,
\"ending_balance\": 0,
\"finalized_at\": 1663844458,
\"footer\": null,
\"forgiven\": false,
\"from_invoice\": null,
\"hosted_invoice_url\": \"https://invoice.stripe.com/i/acct_1mMtCKEf7bN****IJNR2/test_YWNjdF8xbU10Q0tF****TmJ0MkJJSk5SMixfTVRramExZWhaRkdDdlZnQzZ2WHVCM1Rja2pCb2s3Myw1NDM5ODkwNw0200eHBEg0mo?s=ap\",
\"invoice_pdf\": \"https://pay.stripe.com/invoice/acct_1mMtCKEf7bNb****JNR2/test_YWNjdF8xbU10Q0tF*****mJ0MkJJSk5SMixfTVRramExZWhaRkdDdlZnQzZ2WHVCM1Rja2pCb2s3Myw1NDM5ODkwNw0200eHBEg0mo/pdf?s=ap\",
\"last_finalization_error\": null,
\"latest_revision\": null,
\"lines\": {
\"object\": \"list\",
\"data\": [
{
\"id\": \"sub_0LknEJCKEf7b****bblGV2Lb\",
\"object\": \"line_item\",
\"amount\": 3700,
\"amount_excluding_tax\": 3700,
\"currency\": \"usd\",
\"description\": null,
\"discount_amounts\": [],
\"discountable\": true,
\"discounts\": [],
\"livemode\": false,
\"metadata\": {},
\"period\": {
\"end\": 1666436458,
\"start\": 1663844458
},
\"plan\": {
\"id\": \"plan_MTjYr****iEqvG\",
\"object\": \"plan\",
\"active\": true,
\"aggregate_usage\": null,
\"amount\": 3700,
\"amount_decimal\": \"3700\",
\"billing_scheme\": \"per_unit\",
\"created\": 1663840359,
\"currency\": \"usd\",
\"interval\": \"month\",
\"interval_count\": 1,
\"livemode\": false,
\"metadata\": {},
\"name\": \"PrimaJust Basic - Normal (normal)\",
\"nickname\": null,
\"product\": \"prod_MTjYz****eFSm\",
\"statement_descriptor\": null,
\"tiers\": null,
\"tiers_mode\": null,
\"transform_usage\": null,
\"trial_period_days\": null,
\"usage_type\": \"licensed\"
},
\"price\": {
\"id\": \"plan_MTjYri****EqvG\",
\"object\": \"price\",
\"active\": true,
\"billing_scheme\": \"per_unit\",
\"created\": 1663840359,
\"currency\": \"usd\",
\"custom_unit_amount\": null,
\"livemode\": false,
\"lookup_key\": null,
\"metadata\": {},
\"nickname\": null,
\"product\": \"prod_MTjYz****eFSm\",
\"recurring\": {
\"aggregate_usage\": null,
\"interval\": \"month\",
\"interval_count\": 1,
\"trial_period_days\": null,
\"usage_type\": \"licensed\"
},
\"tax_behavior\": \"unspecified\",
\"tiers_mode\": null,
\"transform_quantity\": null,
\"type\": \"recurring\",
\"unit_amount\": 3700,
\"unit_amount_decimal\": \"3700\"
},
\"proration\": false,
\"proration_details\": {
\"credited_items\": null
},
\"quantity\": 1,
\"subscription\": null,
\"subscription_item\": \"si_MTk****XN365QO\",
\"tax_amounts\": [],
\"tax_rates\": [],
\"type\": \"subscription\",
\"unique_id\": \"il_0Lkn9KCKEf7****3shtd1N3\",
\"unique_line_item_id\": \"sli_00e967CKEf7****85391f22\",
\"unit_amount_excluding_tax\": \"3700\"
}
],
\"has_more\": false,
\"total_count\": 1,
\"url\": \"/v1/invoices/in_0LknEJCKEf7b****uRU4Rxf/lines\"
},
\"livemode\": false,
\"metadata\": {},
\"next_payment_attempt\": null,
\"number\": \"77E****23A-0001\",
\"on_behalf_of\": null,
\"paid\": true,
\"paid_out_of_band\": false,
\"payment\": \"ch_2LknEJCKEf7bN****V5n5Yvt\",
\"payment_intent\": \"pi_2LknEJCKEf7bN****1cYRKSxK\",
\"payment_settings\": {
\"default_mandate\": null,
\"payment_method_options\": null,
\"payment_method_types\": null
},
\"period_end\": 1663844458,
\"period_start\": 1663844458,
\"post_payment_credit_notes_amount\": 0,
\"pre_payment_credit_notes_amount\": 0,
\"quote\": null,
\"receipt_number\": null,
\"rendering_options\": null,
\"starting_balance\": 0,
\"statement_descriptor\": null,
\"status\": \"paid\",
\"status_transitions\": {
\"finalized_at\": 1663844458,
\"marked_uncollectible_at\": null,
\"paid_at\": 1663844458,
\"voided_at\": null
},
\"subscription\": \"sub_0LknEJCKEf****t2bblGV2Lb\",
\"subtotal\": 3700,
\"subtotal_excluding_tax\": 3700,
\"tax\": null,
\"tax_percent\": null,
\"test_clock\": \"clock_0LknBQCKEf****t24PjP6QSa\",
\"total\": 3700,
\"total_discount_amounts\": [],
\"total_excluding_tax\": 3700,
\"total_tax_amounts\": [],
\"transfer_data\": null,
\"webhooks_delivered_at\": 1663844458
}
],
\"has_more\": false,
\"url\": \"/v1/invoices\"
}
我试过这个:
$count = substr_count($result, $invoice);
其中 $result 是整个 json 并且 $invoice = \'\"object\": \"invoice\"\'。
这确实有效。它返回 2,这是正确的。但是,也许有更好的解决方案?更可靠的解决方案?
-
您不应该在 JSON 文档中找到子字符串。您应该解析文档并与生成的数据结构进行交互。
-
Stripe 通常返回一个 JSON 数据对象,因此您应该使用
JSON_decode()转换为一个对象,并使用标准的 PHP 数组内容计数功能(例如array_column())简单地计算出现次数,其中已经有很多关于 StackOverflow 的信息。