Stripe API: получите счет за отмененную подписку - PullRequest
1 голос
/ 16 июня 2020

Я использовал этот код для отмены подписки на полосу с пропорциональной ставкой

    $user = User::find(Auth::id());
    $subscription = \Stripe\Subscription::retrieve(
        $user->subscription('main')->stripe_id
    );

    $subscription->delete([
        'prorate' => true
    ]);

в панели управления полосой подписка отменена, и создается предстоящий счет с пропорциональной суммой. Я хочу вернуть пропорциональную сумму на карту клиента. Я попытался получить пропорциональную сумму, используя приведенный ниже код.

    $subscription = \Stripe\Subscription::retrieve($user->subscription('main')->stripe_id);
    $subscription_item = array(
        "id" => $subscription->items->data[0]->id,
        "plan" => $subscription->items->data[0]->plan->id,
        "quantity" => 0,
    );
    $proration_date = time();
    $upcoming_prorated_invoice = \Stripe\Invoice::upcoming([
        "customer" => $subscription->customer,
        "subscription" => $subscription->id,
        "subscription_items" => array($subscription_item),
        "subscription_proration_date" => $proration_date, // optional
    ]);

    dd($upcoming_prorated_invoice);

Я получил сообщение об ошибке ниже

Stripe \ Exception \ InvalidRequestException

Вы не можете предварительно просмотреть предстоящий счет для отмененной подписки.

ОБНОВЛЕНИЕ

    $subscription->delete([
        'prorate' => true,
        'invoice_now' => true
    ]);

    //$latest_invoice = \Stripe\Invoice::retrieve($subscription->latest_invoice);
    //$latest_charge_id = $latest_invoice->charge;

    $invoice = \Stripe\Invoice::retrieve([ 'id' => $subscription->latest_invoice, 'expand' => ['payment_intent.charges'], ]);
    //$charge = $invoice->payment_intent->charges->data[0];
    dd($invoice);

payment_intent возвращается как null

1 Ответ

0 голосов
/ 17 июня 2020

Наконец-то я получил решение. исх.

    $subscription = \Stripe\Subscription::retrieve($user->subscription('main')->stripe_id);

    $proration_date = time();

    $refund = $this->prorate($subscription, $proration_date);

    if ($refund) {
        $latest_invoice = \Stripe\Invoice::retrieve($subscription->latest_invoice);

        if ($latest_invoice) {
            \Stripe\Refund::create([
                'charge' => $latest_invoice->charge,
                'amount' => $refund,
            ]);
        }
    }



public function prorate(\Stripe\Subscription $subscription, $proration_time)
{
    $period_start = $subscription->current_period_start;
    $period_end = $subscription->current_period_end;
    $amount = $subscription->plan->amount;

    $period_length = $period_end - $period_start;

    $elapsed_since_start = $proration_time - $period_start;

    $refund = $amount - floor(($elapsed_since_start / $period_length) * $amount);

    return $refund > 0 ? (int) $refund : 0;
}
...