我们正在使用Laravel Cashier (Braintree)和Laravel版本5.8。我们有一个案例,一个用户为不同的订单多次订阅相同名称的相同计划。我们希望给用户取消他们的订阅的能力。我们尝试使用下面的语句取消具有订阅名称的订阅,如手册此处https://laravel.com/docs/5.8/braintree#cancelling-subscriptions所建议的。
$user->subscription('main')->cancel();
$user->subscription('main')->cancelNow();我们正在传递订阅名称。它像预期的那样工作良好,并且还更新了订阅表的"ends_at“列中的日期。
这里的问题是,因为我们对用户订阅的订阅具有相同的名称。所以在我们的例子中,它在这里返回最后一个订阅的订单,并取消那个订单。它就像它应该做的一样好。
但是我们想要取消基于存储在subscriptions表中的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上的订阅,但不会更新订阅表中的列"ends_at“。
有没有人能提出解决这个问题的办法?任何帮助都将不胜感激。
发布于 2019-11-06 15:33:29
因为Laravel Braintree出纳员模块在内部使用Braintree订阅库。所以我想直接在我的控制器中使用同样的东西。
我在订阅控制器中使用了命名空间来直接调用Braintree订阅类。以下是根据订阅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';
}https://stackoverflow.com/questions/58689211
复制相似问题