首页 > 解决方案 > Subscriptions 和 subscription_item 数据库使用 Stripe 结帐为空

问题描述

我尝试使用 Stripe 创建一个每月订阅的网站。

我有一个定价页面,当我选择产品时,我使用 JS 创建了一个结帐会话,当我付款时,我成功获得了付款和一切,但我的订阅数据库是空的。默认的收银员 webhook 什么都不做,但他在我的条带 cli 上被成功调用,我也尝试创建一个 webhook,但我什么也没得到,我在条带 cli 上每次都收到错误 500。

你有想法吗 ?

这是我的 JS

    <script src="https://js.stripe.com/v3/"></script>
<script defer>

    $("#form").submit(function(e){
        e.preventDefault();
    });

    var handleResult = function(result) {
        if (result.error) {
            showErrorMessage(result.error.message);
        }
    };

    function subscribe(offer)
    {
        fetch("{{ route('subscription_setup') }}", {
            method: "GET",
            headers: {
                "Content-Type": "application/json",
            }
        })
        .then((result) => result.json())
        .then(function(result) {
            var publishableKey = result.publishableKey;
            var stripe = Stripe(publishableKey);

            var createCheckoutSession = function(offer) { 
                return fetch("{{ route('subscription_create_checkout_session') }}", {
                    method: "POST",
                    headers: {
                        "Content-Type": "application/json",
                        'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content')
                    },
                    body: JSON.stringify({
                        offer: offer
                    })
                }).then(function(result) {
                    return result.json();
                });
            }

            createCheckoutSession(offer).then(function(data) {
                stripe.redirectToCheckout({
                        sessionId: data.sessionId
                }).then(handleResult);
            });
        })
    }
</script>

这是我的PHP:

<?php

namespace App\Http\Controllers;

use Exception;
use Illuminate\Http\Request;
use \Stripe\Stripe;
use Illuminate\Support\Facades\Auth;
use Laravel\Cashier\Cashier;
use \Stripe\Checkout\Session;

class SubscriptionController extends Controller
{
    public function __construct() {
        Stripe::setApiKey(env('STRIPE_SECRET'));
    }

    public function index()
    {
        return view('subscription/index');
    }

    public function create_checkout_session(Request $request)
    {
        $user = Auth::user();

        // User is not in stripe database
        if(empty($user->stripe_id))
        {
            $stripe_user = $user->createAsStripeCustomer();
        }
        // User already in stripe database
        else
        {
            $stripe_user = Cashier::findBillable($user->stripe_id);
        }

        // After retrieve the stripe user
        $offer =  $request->post('offer');
        if($offer == 'football')
        {
            $price = 'price_1I4z8kDdfEiamf5bMiTElVAM';
        }
        else
        {
            return response()->json(['error' => 'Vous n\'avez pas sélectionné une offre valide']);
        }

        $checkout_session = Session::create([
            'payment_method_types' => ['card'],
            'line_items' => [
                [
                'price' => $price,
                'quantity' => 1,
                ],
            ],
            'mode' => 'subscription',
            'success_url' => url('/'),
            'cancel_url' => url('/subscription'),
            'customer' => $stripe_user['stripe_id']
        ]);

        return response()->json(['sessionId' => $checkout_session['id']]);
    }

    public function setup() 
    {
        return response()->json([
            'publishableKey' => env('STRIPE_KEY')
        ]);
    }
}

我愿意接受每一个建议,非常感谢。

编辑 :

我的自定义 webhook

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\Auth;
use Laravel\Cashier\Http\Controllers\WebhookController as CashierController;
use \Stripe\Subscription;
use Illuminate\Support\Facades\DB;

class WebhookController extends CashierController
{
    /**
     * Handle invoice payment succeeded.
     *
     * @param  array  $payload
     * @return \Symfony\Component\HttpFoundation\Response
     */
    public function handleInvoicePaymentSucceeded($payload)
    {
        $session = $payload['data']['object'];
        $user = Auth::user();
        // $plan = Subscription::retrieve($session['subscription']['items']['data']['price']['id']);

        DB::transaction(function () use ($session, $user) {
            $user->update(['stripe_id' => $session['customer']]);

            $user->subscriptions()->create([
                'name'          => 'default',
                'stripe_id'     => $session['subscription'],
                'stripe_status' => 'active',
                'stripe_plan'   => 'price_1I4z8kDdfEiamf5bMiTElVAM',
                'quantity'      => 1,
                'trial_ends_at' => null,
                'ends_at'       => now()->addDays(30),
            ]);
        });

        return $this->successMethod();
    }
}

我的验证csrftoken.php

class VerifyCsrfToken extends Middleware
{
    /**
     * The URIs that should be excluded from CSRF verification.
     *
     * @var array
     */
    protected $except = [
        'stripe/*',
    ];
}

我的路线:

Route::post('/stripe/webhook', [WebhookController::class, 'handleWebhook']);

当我订阅产品时,我的条带 cli 出现错误 500。

编辑:我终于使用了本教程https://weeklyhow.com/create-website-subscription-with-laravel-cashier/#:~:text=Laravel%20cashier%20is%20a%20package,and%20even%20generate%20invoice %20PDF。并且不再使用条带结帐。

标签: laravelstripe-paymentslaravel-cashier

解决方案


推荐阅读