gpt4 book ai didi

php - 如何保护用于 paypal 支付处理的敏感页面?

转载 作者:太空宇宙 更新时间:2023-11-03 16:36:28 24 4
gpt4 key购买 nike

我使用的是 paypal 快速结账,它遵循以下流程: enter image description here

当他们在 paypal 网站上提交时,它遵循我网站上的返回 url,该 url 显示带有确认按钮的订单审查,并且两个 GET 变量从 paypal 传回:token付款人编号。该 token 允许我请求运输信息并稍后完成付款。

第一个问题是我可以通过在地址栏中输入 URL 直接访问“使用 paypal 结帐”页面,如果 $_SESSION['Payment_Amount'] 变量未设置,它处理付款金额为 0 并抛出错误。

SetExpressCheckout API call failed. Detailed Error Message: This transaction cannot be processed. The amount to be charged is zero.

我知道我可以在购物车页面上设置另一个 session 变量,以确保他们首先访问购物车,然后在检查后清除该变量,但另一个问题仍然存在,即用户只需要访问购物车页面一次,然后该变量将被设置为允许他们访问向 paypal 发送 token 请求的敏感页面。

下一个问题是,在完成所有步骤并且用户按下“确认订单”按钮后,请求将发送到 paypal 以处理该 token 的订单/资金。用户可以按页面上的“返回”按钮,再次查看订单审核,然后用户可以再次按确认订单,错误将显示该 token 的订单已经处理。

GetExpressCheckoutDetails API call failed. Detailed Error Message: A successful transaction has already been completed for this token.

这显然是一件好事,但我应该实现什么来防止用户访问敏感页面?我是否需要跟踪后端数据库中的某些键?

目前我正在本地主机上使用 paypal 的沙箱。

最佳答案

您必须以某种方式创建一个流程,以确保用户按照正确的顺序执行所需的步骤,并防止他跳出此顺序。

跟踪用户 session 中的步骤似乎是一件很自然的事情。如果 session 不允许请求的步骤,请将他重定向到别处而不是询问 paypal。

豪华版是您实现了一个状态机,以便以后更轻松地进行改进。状态机的缺点是一开始看起来开销很大,如果您最初采用不同的方法,以后实现起来会很麻烦。这就是为什么从一开始就考虑使用一个很重要。

如果您以后想添加其他支付提供商怎么办?为此可以轻松扩展状态机 - 其他任何事情都可能一团糟。

编辑:实际上,paypal 唯一希望您在用户返回您的网站后发送给他们的是您要收取的金额。可以通过将此信息放入您发送给 Paypal 的返回网址来传递此信息。尝试在那里添加一些校验和以防止数据错误和容易被篡改(如果金额不正确,Paypal 会让该过程失败),您基本上就完成了。根本不需要 session 。

Edit2:这是我的代码的摘录,它定义了 paypals 第一步的 nvp 参数。您还需要内部必要的身份验证内容。

public function preparePayment(...) {
$nvp = array(

'METHOD' => 'SetExpressCheckout',
'VERSION' => '52.0',

'RETURNURL' => 'https://'.$request->server['HTTP_HOST'].'/'.$request->getLanguage().'/paypal/success/'.$this->hashAmount($amount),
'CANCELURL' => 'https://'.$request->server['HTTP_HOST'].'/'.$request->getLanguage().'/paypal/cancel',

'CURRENCYCODE' => $amount->getCurrency(),
'AMT' => number_format($amount->getAmount(), 2, '.', ''),
'ITEMAMT' => number_format($amount->getNettoAmount(), 2, '.', ''),
'TAXAMT' => number_format($amount->getVatAmount(), 2, '.', ''),
'PAYMENTACTION' => 'Sale',
'LOCALECODE' => strtoupper($request->getLanguage())
);
}
protected function hashAmount(Currency_Class $amount) {
return urlencode(
sprintf(
'%s-%s-%s-%u',
number_format($amount->getNettoAmount(), 2, '', ''),
number_format($amount->getVatAmount(), 2, '', ''),
strtoupper($amount->getCurrency()),
$this->makeChecksumString(number_format($amount->getNettoAmount(), 2, '', ''), strtoupper($amount->getCurrency()))
)
);
}

protected function makeChecksumString($amount, $currency) {
return crc32(sprintf('%sSaltValue%s', $amount, $currency));
}

protected function dehashAmount($string) {
$parts = array();
$found = preg_match('/^(\d+)\-(\d+)\-([A-Z]+)\-(\d+)$/', $string, $parts);
if ($found) {
$check = sprintf('%u', $this->makeChecksumString($parts[1], $parts[3]));
if ($check == $parts[4]) {
$netto = floatval(substr($parts[1], 0, -2) .'.'. substr($parts[1], -2));
$vat = floatval(substr($parts[2], 0, -2) .'.'. substr($parts[2], -2));
}
}
return ...
}

关于php - 如何保护用于 paypal 支付处理的敏感页面?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12717455/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com