Я занимаюсь разработкой веб-приложения и соблюдаю стандарты REST API. Я ищу лучшую практику REST API для подписки и платежей.
Когда новый пользователь подписывается на «Pro Plan», пользователь должен заплатить деньги за план, и это транзакция.
Должен ли я установить POST: users/{id}/subscriptions
а также SubscriptionsController@store
когда новый пользователь подписывается?
А поскольку подписка представляет собой транзакцию и 2 отдельных запроса (до / после банка), все коды подписки должны быть в SubscriptionController@store
?
Для обновления, отмены или обновления плана я должен установить PUT: users/{id}/subscriptions/{id}
а также SubscriptionController@update
или другая конечная точка?
Обычно вы не передаете идентификатор пользователя в маршрут, если только в контроллере не было какой-либо аутентификации. например. Админ обновляет пользователя. Вместо этого используйте Auth::user()
объект в контроллере.
Что касается вашего вопроса, есть много вариантов, и это зависит только от вас, но возможный способ сделать это будет использовать ресурсный маршрут \ контроллер за это.
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)
Если ваша попытка для Брейнтри или полоса оба платежных шлюза через планы Maintan и подписку.
Основные преимущества: —
Я пытаюсь понять, о чем вы просите, но для меня это немного размыто, поэтому, если я правильно понял, вы пытаетесь понять, каков наилучший метод именования конечных точек API, это действительно зависит от функций, которые вы будете предоставлять, и от того, как Вы выставите документацию.
Но с моей точки зрения я не вижу смысла связывать идентификатор пользователя и идентификатор подписчика в URL, я рекомендую что-то вроде этого, и вы можете передать всю информацию, которую вы хотите в теле
$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');
Это действительно зависит от вас, как вы определяете свои конечные точки