Laravel 中的 REST API 订阅和交易(支付)端点

Posted

技术标签:

【中文标题】Laravel 中的 REST API 订阅和交易(支付)端点【英文标题】:REST API Subscriptions and transactions(payments) endpoints in Laravel 【发布时间】:2017-06-03 22:39:19 【问题描述】:

我正在开发一个网络应用程序并且我遵守 REST API 标准。我正在寻找订阅和付款的 REST API 最佳实践。

当一个新用户订阅“pro plan”时,用户应该为plan付钱,这是一笔交易。

新用户订阅时我应该设置POST:users/id/subscriptionsSubscriptionsController@store吗?

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

对于升级、取消或更新计划,我应该设置 PUT:users/id/subscriptions/idSubscriptionController@update 还是其他端点?

【问题讨论】:

REST API - PUT vs PATCH with real life examples 的可能重复项。您的所有问题都在此评论中得到了解答,并得到了彻底的涵盖。请通读一遍。 @Ohgodwhy 我读了很多关于 REST API 的内容。我找不到我的答案。在这些答案中,我的问题也没有确定的最佳实践。如果你有答案,请回答。 您所说的“因为订阅是一项交易和 2 个单独的请求(银行之前/之后)”是什么意思。还不够清楚。 真的不清楚你在这里问什么。您可以根据自己的喜好设置自己的路线。您是否有特定的编程问题/问题...? @gayan 订阅指定计划需要 2 个请求:1- 在支付信用卡信息和...之前。 2-付款后验证付款。如果这两个请求成功,用户将订阅计划。 【参考方案1】:

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

关于您的问题,有很多选择,这完全取决于您,但一种可能的方法是为此使用resource route\controller。

Route::resource('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
    

你的路线会是这样的:

GETuser/subscription列出所有用户订阅index()

POSTuser/subscription创建用户订阅store(Request $request)

GETuser/subscription/subscription_id显示用户订阅show($id)

PUT/PATCHuser/subscription/subscription_id更新用户订阅update($id)

DELETEuser/subscription/subscription_id取消用户订阅destroy($id)

【讨论】:

我在我的控制器中使用 auth()->user()。但我也在路由中获取用户 ID,并将其用于策略。我认为它对 REST 更友好!【参考方案2】:

如果您通过轻松维护计划和订阅尝试使用 Braintree 或 Stripe 两种支付网关。

主要优点:-

    订阅和计划的编码更少 UI 在 Braintree 树 drop-ui 中准备就绪 轻松附加附加费用

【讨论】:

【参考方案3】:

我正在尝试理解您的要求,但对我来说有点模糊,所以如果我做对了,您正在尝试找出 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');

如何定义端点完全取决于您

【讨论】:

以上是关于Laravel 中的 REST API 订阅和交易(支付)端点的主要内容,如果未能解决你的问题,请参考以下文章

使用 PayPal REST API 进行定期付款

资源文件中的 Laravel REST API 路由问题

Laravel 7 - 使用 REST API 而不是数据库

PayPal REST API 计费计划和协议(订阅)

PayPal REST API 未显示交易描述和应用名称

Laravel 5 REST API