Php Laravel中的REST API订阅和事务(支付)端点

Php Laravel中的REST API订阅和事务(支付)端点,php,laravel,rest,transactions,web-deployment,Php,Laravel,Rest,Transactions,Web Deployment,我正在开发一个web应用程序,我遵守RESTAPI标准。我正在搜索用于订阅和支付的RESTAPI最佳实践 当新用户订阅pro plan时,用户应该为该计划付费,这是一笔交易 我应该设置POST:users/{id}/subscriptions和SubscriptionsController@store新用户何时订阅 由于订阅是一个交易,在银行之前/之后有两个单独的请求,所以所有订阅代码都应该在SubscriptionController@store? 对于升级,我应该设置PUT:users/{i

我正在开发一个web应用程序,我遵守RESTAPI标准。我正在搜索用于订阅和支付的RESTAPI最佳实践

当新用户订阅pro plan时,用户应该为该计划付费,这是一笔交易

我应该设置POST:users/{id}/subscriptions和SubscriptionsController@store新用户何时订阅

由于订阅是一个交易,在银行之前/之后有两个单独的请求,所以所有订阅代码都应该在SubscriptionController@store?


对于升级,我应该设置PUT:users/{id}/subscriptions/{id}和SubscriptionController@update还是其他端点?

我试图理解您的要求,但对我来说有点模糊,因此如果我说得对,您将试图找出API端点命名的最佳实践,这实际上取决于您将提供的函数以及如何公开文档

但从我的观点来看,我不认为有理由在URL中链接用户ID和订户ID,我建议这样做,你可以在正文中传递你想要的所有信息

$router->post('settings/user/plan', 'Settings\SubscriptionController@subscribe');
$router->put('settings/user/plan', 'Settings\SubscriptionController@changeSubscriptionPlan');
$router->delete('settings/user/plan', 'Settings\SubscriptionController@cancelSubscription');
$router->post('settings/user/plan/resume', 'Settings\SubscriptionController@resumeSubscription');
$router->put('settings/user/card', 'Settings\SubscriptionController@updateCard');
$router->put('settings/user/vat', 'Settings\SubscriptionController@updateExtraBillingInfo');
$router->get('settings/user/plan/invoice/{id}', 'Settings\SubscriptionController@downloadInvoice');

如何定义端点实际上取决于您自己

我试图理解您的要求,但对我来说有点模糊,因此如果我说得对的话,您将试图找出API端点命名的最佳实践,这实际上取决于您将提供的函数以及您将如何公开文档

但从我的观点来看,我不认为有理由在URL中链接用户ID和订户ID,我建议这样做,你可以在正文中传递你想要的所有信息

$router->post('settings/user/plan', 'Settings\SubscriptionController@subscribe');
$router->put('settings/user/plan', 'Settings\SubscriptionController@changeSubscriptionPlan');
$router->delete('settings/user/plan', 'Settings\SubscriptionController@cancelSubscription');
$router->post('settings/user/plan/resume', 'Settings\SubscriptionController@resumeSubscription');
$router->put('settings/user/card', 'Settings\SubscriptionController@updateCard');
$router->put('settings/user/vat', 'Settings\SubscriptionController@updateExtraBillingInfo');
$router->get('settings/user/plan/invoice/{id}', 'Settings\SubscriptionController@downloadInvoice');

如何定义端点实际上取决于您自己

除非控制器中有某种身份验证,否则通常不会在路由中传递用户id。管理员正在更新用户。而是在控制器中使用Auth::user对象

关于你的问题,有很多选择,这完全取决于你,但一种可能的方法是使用一个用于此的

路由::资源'user/subscription','user\SubscriptionController'

然后控制器看起来像这样:

<?php

namespace App\Http\Controllers\User;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SubscriptionController extends Controller
{

    public function index()
    {
        // get user
        $user = Auth::user();

        // list all user subscriptions
    }

    public function store(Request $request)
    {

        // get user
        $user = Auth::user();

        if(empty($user)) {
            // create user
        }

        // create and process subscription for the user 
        // possibly using a plan id in the $request
    }

    public function show($id)
    {
        // get user
        $user = Auth::user();

        // return user subscription details for $id
    }

    public function update(Request $request, $id)
    {
        // get user
        $user = Auth::user();

        // update or change user subscription
        // possibly using a plan id in the $request

    }


    public function destroy($id)
    {
        // get user
        $user = Auth::user();

        // cancel user subscription with $id
    }
}
你的路线是这样的:

<?php

namespace App\Http\Controllers\User;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SubscriptionController extends Controller
{

    public function index()
    {
        // get user
        $user = Auth::user();

        // list all user subscriptions
    }

    public function store(Request $request)
    {

        // get user
        $user = Auth::user();

        if(empty($user)) {
            // create user
        }

        // create and process subscription for the user 
        // possibly using a plan id in the $request
    }

    public function show($id)
    {
        // get user
        $user = Auth::user();

        // return user subscription details for $id
    }

    public function update(Request $request, $id)
    {
        // get user
        $user = Auth::user();

        // update or change user subscription
        // possibly using a plan id in the $request

    }


    public function destroy($id)
    {
        // get user
        $user = Auth::user();

        // cancel user subscription with $id
    }
}
获取用户/订阅列表所有用户订阅索引

发布用户/订阅创建用户订阅storeRequest$request

获取用户/subscription/{subscription\u id}显示用户订阅显示$id

PUT/PATCH user/subscription/{subscription\u id}更新用户订阅更新$id


删除用户/subscription/{subscription\u id}取消用户订阅销毁$id

通常您不会在路由中传递用户id,除非控制器中存在某种身份验证。管理员正在更新用户。而是在控制器中使用Auth::user对象

关于你的问题,有很多选择,这完全取决于你,但一种可能的方法是使用一个用于此的

路由::资源'user/subscription','user\SubscriptionController'

然后控制器看起来像这样:

<?php

namespace App\Http\Controllers\User;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SubscriptionController extends Controller
{

    public function index()
    {
        // get user
        $user = Auth::user();

        // list all user subscriptions
    }

    public function store(Request $request)
    {

        // get user
        $user = Auth::user();

        if(empty($user)) {
            // create user
        }

        // create and process subscription for the user 
        // possibly using a plan id in the $request
    }

    public function show($id)
    {
        // get user
        $user = Auth::user();

        // return user subscription details for $id
    }

    public function update(Request $request, $id)
    {
        // get user
        $user = Auth::user();

        // update or change user subscription
        // possibly using a plan id in the $request

    }


    public function destroy($id)
    {
        // get user
        $user = Auth::user();

        // cancel user subscription with $id
    }
}
你的路线是这样的:

<?php

namespace App\Http\Controllers\User;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

class SubscriptionController extends Controller
{

    public function index()
    {
        // get user
        $user = Auth::user();

        // list all user subscriptions
    }

    public function store(Request $request)
    {

        // get user
        $user = Auth::user();

        if(empty($user)) {
            // create user
        }

        // create and process subscription for the user 
        // possibly using a plan id in the $request
    }

    public function show($id)
    {
        // get user
        $user = Auth::user();

        // return user subscription details for $id
    }

    public function update(Request $request, $id)
    {
        // get user
        $user = Auth::user();

        // update or change user subscription
        // possibly using a plan id in the $request

    }


    public function destroy($id)
    {
        // get user
        $user = Auth::user();

        // cancel user subscription with $id
    }
}
获取用户/订阅列表所有用户订阅索引

发布用户/订阅创建用户订阅storeRequest$request

获取用户/subscription/{subscription\u id}显示用户订阅显示$id

PUT/PATCH user/subscription/{subscription\u id}更新用户订阅更新$id

删除用户/subscription/{subscription\u id}取消用户订阅销毁$id

如果您尝试使用Braintree或通过轻松维护计划和订阅将支付网关分条

主要好处:-

减少订阅和计划的编码 在Braintree树中准备好UI drop UI及其响应 轻松附加附加费用 如果您尝试使用Braintree或Stripe,则可以通过轻松维护计划和订阅来实现支付网关

主要好处:-

减少订阅和计划的编码 在Braintree树中准备好UI drop UI及其响应 轻松附加附加费用
可能的副本。你的所有问题都在这篇评论中得到了回答,并得到了彻底的回答。请通读一下我为什么读了很多关于RESTAPI的内容。我找不到我的答案。在这些回答中,我的问题也没有确定的最佳实践。如果您有答案,请回答。您的意思是什么,因为订阅是一项交易,在银行之前/之后有两个单独的请求。还不够清楚。你在问什么真的不清楚。你可以随意设置自己的路线。您是否有特定的编程问题?@gayan订阅指定计划需要2个请求:1-在支付信用卡信息之前,以及。2-付款后确认付款。如果这两个请求成功,用户将订阅该计划。可能重复的。你所有的问题
这些问题在本评论中得到了回答,并得到了彻底的阐述。请通读一下我为什么读了很多关于RESTAPI的内容。我找不到我的答案。在这些回答中,我的问题也没有确定的最佳实践。如果您有答案,请回答。您的意思是什么,因为订阅是一项交易,在银行之前/之后有两个单独的请求。还不够清楚。你在问什么真的不清楚。你可以随意设置自己的路线。您是否有特定的编程问题?@gayan订阅指定计划需要2个请求:1-在支付信用卡信息之前,以及。2-付款后确认付款。若这两个请求成功,用户将订阅计划。我在控制器中使用auth->user。但我也在路由中获取用户id,并将其用于策略。我认为它更适合休息!我在控制器中使用auth->user。但我也在路由中获取用户id,并将其用于策略。我认为它更适合休息!