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/subscriptions
和SubscriptionsController@store
吗?
由于订阅是一个交易和 2 个单独的请求(银行之前/之后),所有订阅代码都应该在 SubscriptionController@store
?
对于升级、取消或更新计划,我应该设置 PUT:users/id/subscriptions/id
和 SubscriptionController@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
你的路线会是这样的:
GET
user/subscription
列出所有用户订阅index()
POST
user/subscription
创建用户订阅store(Request $request)
GET
user/subscription/subscription_id
显示用户订阅show($id)
PUT/PATCH
user/subscription/subscription_id
更新用户订阅update($id)
DELETE
user/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 订阅和交易(支付)端点的主要内容,如果未能解决你的问题,请参考以下文章