【问题标题】:How to Refund Stripe Subscription charged amount?如何退还 Stripe 订阅费用?
【发布时间】:2018-02-02 08:58:59
【问题描述】:

我正在实施一个需要取消客户订阅和退款金额的案例。 我可以使用

取消订阅
$sub = \Stripe\Subscription::retrieve({SUBSCRIPTION_ID});
$sub->cancel();

现在我必须退还收费金额

 $refund = \Stripe\Refund::create(array(
  "charge" => "{CHARGE_ID}"
));

这里CHARGE_ID 是强制性的。没有像SUBSCRIPTION_ID 这样的选项。

由于它自动向客户收费,我无法存储 CHARGE_ID。那我怎样才能退还订阅金额??

请帮忙

谢谢

【问题讨论】:

  • 是的,我已经检查过了,但是 CHARGE_ID 是必需的,我没有 CHARGE_ID。
  • 你检查过 Stripe 文档here吗?
  • 是的,我已经检查过了。它不会退还订阅。
  • @MittulAtTechnoBrave 只会通过订阅取消进一步收费,不会退还收费金额
  • 订阅检索返回一个包含 customer_id 的对象。然后,您可以使用该 customer_id 从客户查找中获取 charge_id。

标签: php laravel stripe-payments


【解决方案1】:

@Meera,我看到你解决了你的问题,我的解决方案是:
1. 取消订阅后
2. 使用 Subscription 中的 subscriptionId 获取所有 Invoice Collection
3. 从发票集合中提取第一张发票
4. 使用发票中的 chargeId 创建退款

$subscriptionId = $objSubscription->id;
$objInvoiceCollection = \Stripe\Invoice::all([
    'subscription' => $subscriptionId
]);

if ($objInvoiceCollection->total_count === 0) {
    throw new \Exception("warning: \$subscriptionId={$subscriptionId} - no invoices found!");
} else {
    $objInvoice = current($objInvoiceCollection);
}

$chargeId = $objInvoice->charge;
$objRefund = \Stripe\Refund::create(['charge' => $chargeId]);

【讨论】:

  • 感谢您的回答,我已经实现了相同的方式,但我将 foreach 用于所有 $chargeId。
【解决方案2】:

如果您只想从订阅中退还未使用的信用额度,请尝试此操作

    subscription, err := c.subscription(id)
    if err != nil {
        return nil, err
    }
    cancelTime := time.Now().Unix()
    _, err = sub.Cancel(subscription.ID, &stripe.SubscriptionCancelParams{
        Prorate:    stripe.Bool(true),
        InvoiceNow: stripe.Bool(true),
    })
    if err != nil {
        return nil, err
    }

    invItr := invoice.List(&stripe.InvoiceListParams{
        Customer:     stripe.String(subscription.Customer.ID),
        Subscription: stripe.String(subscription.ID),
    })
    var (
        refundAmount int64
    )
    for _, i := range invItr.InvoiceList().Data {
        if i.Created >= cancelTime {
            refundAmount = i.Total * -1
            break
        }
    }
    if refundAmount > 0 {
        latestInvoice, err := invoice.Get(subscription.LatestInvoice.ID, nil)
        if err != nil {
            return nil, err
        }
        _, err = refund.New(&stripe.RefundParams{
            Charge: stripe.String(latestInvoice.Charge.ID),
            Amount: stripe.Int64(refundAmount),
        })
        if err != nil {
            return nil, err
        }
    }

【讨论】:

    猜你喜欢
    • 2017-12-03
    • 1970-01-01
    • 2021-01-11
    • 2018-06-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-29
    • 2013-08-22
    • 2018-12-01
    相关资源
    最近更新 更多