【问题标题】:Stripe API: get upcoming invoice for cancelled SubscriptionStripe API:获取即将取消的订阅的发票
【发布时间】:2020-10-05 17:48:10
【问题描述】:

我使用此代码按比例取消条带订阅

    $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 返回为空

【问题讨论】:

  • 这里的方法是不使用即将推出的发票项目 API。有几种方法可以解决这个问题。我会探索prorate: trueinvoice_now: true。然后您可以完成发票,您的客户的余额将被记入贷方。然后,您可以查看发票上的按比例分配行项目,并尝试通过将其链接到发票上的原始费用来退款此金额(您将需要扩展费用)。希望有帮助!
  • @v3nkman 我试过你说的。我无法从最后一张发票中获取费用 ID。它返回为空。
  • 如果最后一张 Invoice 支付成功,那么它应该有一个 PaymentIntent [1]。您可以使用以下代码和发票 ID 展开 PaymentIntent 和 Charge [2]。 ` $invoice = \Stripe\Invoice::retrieve([ 'id' => 'in_xxx', 'expand' => ['payment_intent.charges'], ]); $charge = $invoice->payment_intent->charges->data[0]; ` 希望有帮助! [1] stripe.com/docs/api/invoices/… [2] stripe.com/docs/api/payment_intents/… 你能把它和你的实现比较一下吗?
  • payment_intent: null
  • 如果最后一张发票上的应付金额为 0,则不会有 PaymentIntent 来推动付款,因为不会产生任何费用。我相信这与您的原始问题不同。如果您需要按比例退款(订阅中未使用的时间),那么最后一张发票应该有一个 PaymentIntent。

标签: stripe-payments laravel-cashier


【解决方案1】:

终于找到了解决办法。 ref

    $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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-06-04
    • 2014-09-07
    • 1970-01-01
    • 1970-01-01
    • 2021-09-02
    • 2021-04-09
    • 1970-01-01
    • 2019-12-30
    相关资源
    最近更新 更多