如何通过 Braintree_id 或 subscription_id 使用 Laravel 收银员取消 Braintree 订阅

How to Cancel the Braintree Subscription by Braintree_id or subscription_id using Laravel Cashier

我们正在使用 Laravel Cashier (Braintree) Laravel 5.8 版。我们有一个案例,用户多次为不同的订单订阅具有相同名称的相同计划。 我们希望为用户提供取消订阅的能力。 我们尝试使用下面的语句来取消订阅,按照手册此处 https://laravel.com/docs/5.8/braintree#cancelling-subscriptions.

的建议使用订阅名称
$user->subscription('main')->cancel();

$user->subscription('main')->cancelNow();

我们正在传递订阅名称。它按预期正常工作,并且还更新了订阅 table 的 "ends_at" 列中的日期。

这里的问题是因为我们对用户订阅的订阅具有相同的名称。所以在我们的例子中它是 returns 最后订阅的订单并取消它。做的很好。

但是我们想根据订阅 table 中存储的 braintree_id 取消订阅。我们能做到吗? 截至目前,我们尝试如下所示:-

use Braintree\Subscription;

$subcriptionObj = Subscription::find($subscription); //where $subscription is braintree_id from subscriptions table.
if ($subcriptionObj->status == 'Canceled')
    abort(400, 'Subscription Not Active');

Subscription::cancel($subscription);

然而,这会取消 Braintree 的订阅,但不会更新订阅 table 中的列 "ends_at"。

任何人都可以提出解决方法吗?任何帮助将不胜感激。

因为 Laravel Braintree Cashier 模块在内部使用 Braintree 订阅库。所以我想直接在我的控制器中使用它。

我在我的控制器中使用命名空间进行订阅,以直接调用 Braintree 订阅 class。以下是通过订阅 ID 取消订阅的代码。

use Braintree\Subscription;

public function cancelsubscription(User $user, $subscriptionId)
{
    $subcriptionObj = Subscription::find($subscriptionId); 
    if(is_null($subcriptionObj)){
        abort(400, 'Subscription is not found.');
    }

    if ($subcriptionObj->status == 'Canceled')
        abort(400, 'Subscription is not Active.');

    // In below line we are finding the Subscription DB Obj using cashier module here to update the ends_at date column
    $subsDbObj = $user->subscriptions->filter(function($sub) use ($user,$subscriptionId){
        return $sub->braintree_id == $subscriptionId && $sub->user_id == $user->id;})->values(); 

    Subscription::cancel($subscriptionId);

    if(! is_null($subsDbObj[0])){
        //Internally cashier module doing the same to update the subscription table
        $subsDbObj[0]->ends_at = Carbon::now();
        $subsDbObj[0]->save();
    }

    return 'Cancelled';
}