🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

1回答

1662閲覧

【Laravel・Stripe】定期支払アップグレード時の自動日割り計算

lapas

総合スコア8

Stripe

Stripeとは、米国のオンライン決済システム提供企業、及び同社が提供する決裁システムを指します。Webサイトやモバイルアプリにコードを組み込むことでクレジットカードなどの決済サービスが簡潔に追加できます。

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2019/11/26 17:10

編集2019/11/26 18:25

いつもお世話になります。
Stripeのサブスクリプションを用いた定期支払サービスをLaravelにて構築しております。
定期支払の顧客がプランを変更する際、事前に変更時の差額を提示したいと考えています。

下記サイトを参考にし、Laravel用にカスタマイズを試みたのですが
知識不足で出来ませんでした。

もし、ご存知の方いらっしゃいましたら
ご教授くださると大変助かります。

具体的にやりたいこと

月額払いのプラン「ライト(1,000円)」「スタンダード(5,000円)」の2種があります。
仮に、11月1日にライトプランに加入した顧客が月のちょうど真ん中15日でスタンダードプランに変更した場合の
次回請求時の差額を自動で計算したいです。

※日割りの算出方法は、Stripe Billing における定期支払いの基本的な考え方に従う(下記URL参照)。
※毎月1日に当月請求書発行。
※スタンダードからライトへのダウングレード時も同様に自動計算したい。
※テーブル構成はCashierマイグレーション時のもの。

【参考URL】Stripe Billing - 定期支払いにおける比例配分の考え方
https://qiita.com/y_toku/items/404b3c99632161f18579

該当のソースコード

【参考URL】https://stripe.com/docs/billing/subscriptions/prorations#prorations

// Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey('sk_test_Ar66eiYNVgxtbd07ig6vIugp009e1S3qwk'); // Set proration date to this moment: $proration_date = time(); $subscription = \Stripe\Subscription::retrieve('sub_49ty4767H20z6a'); // See what the next invoice would look like with a plan switch // and proration set: $items = [ [ 'id' => $subscription->items->data[0]->id, 'plan' => 'plan_CBb6IXqvTLXp3f', # Switch to new plan ], ]; $invoice = \Stripe\Invoice::upcoming([ 'customer' => 'cus_4fdAW5ftNQow1a', 'subscription' => 'sub_49ty4767H20z6a', 'subscription_items' => $items, 'subscription_proration_date' => $proration_date, ]); // Calculate the proration cost: $cost = 0; $current_prorations = []; foreach ($invoice->lines->data as $line) { if ($line->period->start == $proration_date) { array_push($current_prorations, $line); $cost += $line->amount; } }

エラーコード

No API key provided. (HINT: set your API key using "Stripe::setApiKey(<API-KEY>)". You can generate API keys from the Stripe web interface. See https://stripe.com/api for details, or email support@stripe.com if you have any questions.

試したこと

上記コード
$subscription = \Stripe\Subscription::retrieve('sub_49ty4767H20z6a');
下記コードに置き換え
$subscription =$user->subscription('main');

エラーコード

Trying to get property 'data' of non-object //$subscription->items->data[0]->id が無いとなる

開発環境

Laravel 6.0.3
laravel/cashier 9.3.5
PHP 7.3.5
xampp
windows 10

ご回答いただけましたら嬉しく存じます。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/11/26 17:13

具体的な仕様を提示しないと回答者が困りませんか?
lapas

2019/11/26 17:19

早速のご助言ありがとうございます。 只今より追記いたします。
退会済みユーザー

退会済みユーザー

2019/11/26 17:26

あと、何に困っていて何がわからないのかを明確にしてください。
lapas

2019/11/26 17:32

なるほど承知いたしました。 確かに質問が漠然としてますね。 試してみたことも含め追記いたします。
退会済みユーザー

退会済みユーザー

2019/11/26 17:48 編集

Stripeについては使ったことないので、私が回答するというよりも、詳しい方にお任せです。ですが、要件定義が大好きな自分としては、つい口が出てしまいますので、ついでに。 ・プランのアップグレードについては書かれていますが、ダウングレードの考慮はしないのか? ・日割りの算出方法が曖昧。単純に その月の残り日数 / その月の日数 ? その時は数は切り捨て?切り上げ? ・加入した日時はどこに保存されている?テーブル定義を提示すべきでは? ・請求日は毎月何日?何日締めで、請求は翌月?翌々月? ↑これらを決めないと、コードはかけないと思いますよ。
lapas

2019/11/26 18:19

遅い時間帯にお付き合いをいただきまして、誠にありがとうございます。 明確な質問の方が回答し易いですよね。 私の分かる範囲で試したことと、具体例に注釈を追記いたしました。 不足がございまいたらご教示いただけますと有難いです。
guest

回答1

0

自己解決

お世話になります。
エラーの原因が分かりましたので記述いたします。

\Stripe\Stripe::setApiKey();
このコードでのStripeシークレットキーの値が間違っていました。

エラーコードにて「No API key provided」と出ていたので
勘繰りせず素直に従うべきでした。

ご助言いただき、ありがとうございました。

成功したコード

use App\Subscription; $user = \Auth::user(); // Set your secret key: remember to change this to your live secret key in production // See your keys here: https://dashboard.stripe.com/account/apikeys \Stripe\Stripe::setApiKey(env('STRIPE_SECRET')); // Set proration date to this moment: $proration_date = time(); $subscription_id=Subscription::where('user_id',$user->id)->value('stripe_id'); $subscription = \Stripe\Subscription::retrieve($subscription_id); // See what the next invoice would look like with a plan switch // and proration set: $items = [ [ 'id' => $subscription->items->data[0]->id, 'plan' => env('STRIPE_STANDARD_ID'), # Switch to new plan ], ]; $invoice = \Stripe\Invoice::upcoming([ 'customer' => $user->stripe_id, 'subscription' => $subscription_id, 'subscription_items' => $items, 'subscription_proration_date' => $proration_date, ]); // Calculate the proration cost: $cost = 0; $current_prorations = []; foreach ($invoice->lines->data as $line) { if ($line->period->start == $proration_date) { array_push($current_prorations, $line); $cost += $line->amount; } } echo $cost;//次回請求時の差額分

投稿2019/11/26 21:11

lapas

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問