我正在尝试弄清楚如何设置回调URL以从付款网关接收付款状态信息。
以下是整个设置的摘要。 Laravel 5.8内置了一个后端(API端点),React应用程序和移动应用程序将使用它。这两个应用程序都将使用支付网关的网络和移动SDK来发起支付交易。
然后,付款网关应通过调用我需要设置的回调API来响应付款状态。
这是我第一次尝试做这样的事情,所以如果我离得很远,请原谅我,但这是我写的东西
回调端点
Route::post('order/payment/status', 'PaymentController@getStatus'); // receives payment status
PaymentController getstatus()
方法
public function getStatus(Request $request)
{
$paymentMethod = $request->paymentMethod;
$amount = $request->amount;
$providerCode = $request->provider;
$customerName = $request->customerName;
$customerEmail = $request->customerEmail;
$paymentDescription = $request->paymentDescription;
$paymentStatus = $request->paaymentStatus;
$transactionReference = $request->transactionReference;
// update my record based on the paymentStatus
}
这是正确的方法吗?我觉得应该是get
的请求,而不是post
。请帮忙。
答案 0 :(得分:1)
我会给您一些提示,并建议我希望我那时知道。
1)在auth
中间件组之外定义您的路由,并禁用其URL的CSRF保护,这可以在App\Http\Middleware\VerifyCsrfToken
中间件中实现。
2)get, post or any
:推荐使用post
。但是,也许这不是您可以选择的东西。绝大多数网关都会向您的后端发送一个发布请求,但是,一旦我使用了发送get请求的网关,那么在这种情况下,请定义一个any
路由。
3)获取,发布或以任何方式始终验证付款网关收到的请求的签名。这是安全的前提,它将丢弃未从支付网关发送的请求。每个付款网关都必须具有此功能,请在文档中找到它。
4)将每个请求有效负载($request->all()
)记录到文件或数据库中,然后再发送到控制器中的任何内容,或者,如果愿意,可以将系统与诸如Sentry之类的错误跟踪服务集成在一起(这是整齐的方法) 。如果错误停止脚本执行,那将为您节省很多麻烦。
5)加快开发过程最简单的方法是在本地测试代码(无需每次都进行结帐),这样做可以保留请求有效负载从支付网关(可能是json)中保存,保存在Postman上,然后使用它发送本地后端帖子,模拟来自支付网关的请求(当然,在测试时绕过签名验证)。
6)不适合支付网关模型,而应使其适合您的模型。含义:不要将原始的有意义的数据保存在数据库中,除非将其转换成逻辑可以识别的模式。这是最佳做法,它将避免以后您头疼(以防您需要更改付款方式)。
肮脏的实用示例:
switch ($request->paymentStatus) {
case 'SUCCESS':
$status = 'success';
break;
case 'CANCELLED_BY_USER':
case 'CANCELLED_BY_ANTIFRAUD':
$status = 'canceled';
break;
default:
$status = 'unknown';
break;
}
7)继续上面提到的最佳实践,如果您需要使用PHP对代码进行结帐,请考虑使用已知的付款处理库,例如Omnipay。这是一种全新的学习,但是学习对生活来说已经足够了。
8)记录管理员中执行的每个用户操作(收费按钮,状态创建按钮,通知发送按钮等等)。你永远都不知道什么时候接到那个电话。
就是这样。希望对您有帮助