Как отменить подписку Braintree с помощью Braintree_id или subscription_id с помощью Laravel Cashier - PullRequest
0 голосов
/ 04 ноября 2019

Мы используем Laravel Cashier (Braintree) с версией Laravel 5.8. У нас есть случай, когда пользователь подписывается на один и тот же тарифный план несколько раз для разных заказов. Мы хотим дать возможность пользователю отменить свою подписку. ниже мы попытались отменить подписку с именем подписки, как указано в руководстве, здесь https://laravel.com/docs/5.8/braintree#cancelling-subscriptions.

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

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

Мы передаем имя подписки. Он работает нормально, как и ожидалось, а также обновляет дату в столбце "sets_at" таблицы подписок.

Проблема здесь в том, что у нас одинаковое имя для подписок, на которые подписан пользователь. Так что в нашем случае он возвращает последний подписанный заказ здесь и отменяет это. Это нормально, как то, что предполагается сделать.

Но мы хотим отменить подписку на основе 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, но не обновляет столбец "end_at" в таблице подписок.

Может кто-нибудь предложить обходной путь дляэто ? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 06 ноября 2019

Поскольку модуль Касса Laravel Braintree внутренне использует библиотеку подписок Braintree. Поэтому я решил использовать то же самое непосредственно в моем контроллере.

Я использовал пространство имен в своем контроллере для подписки, чтобы напрямую вызывать класс подписки Braintree. ниже приведен код для отмены подписки по идентификатору подписки.

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';
}
...