繁体   English   中英

PHP中的PayFast付款集成 - 签名错误

[英]PayFast Payment Integration in PHP - signature error

任何人都可以帮助我进行此 PayFast 支付网关集成吗? 我已经尝试了下面的代码,但签名没有正确生成我不明白为什么。

<?php
$str = "merchant_id=10000100&merchant_key=46f0cd694581a&return_url=http%3A%2F%2Fwww.ioss.in%2Fpayment-gateway-integration&cancel_url=http%3A%2F%2Fwww.ioss.in&notify_url=http%3A%2F%2Fwww.ioss.in%2Ffacebook%2Fpayfast_success.php&name_first=Bob&name_last=Smith&email_address=sbtu01%40payfast.co.za&m_payment_id=TRN123456789&amount=200.00&item_name=Widget+Model+123&item_description=Widget+Model+123";
$md5 = md5($str);

?>

<form action="https://sandbox.payfast.co.za/eng/process" method="post" name="frmPay" id="frmPay">

<!-- Receiver Details -->
<input type="hidden" name="merchant_id" value="10000100">
<input type="hidden" name="merchant_key" value="46f0cd694581a">


<input type="hidden" name="return_url" value="http://www.ioss.in/payment-gateway-integration/">
<input type="hidden" name="cancel_url" value="http://www.ioss.in">
<input type="hidden" name="notify_url" value="http://www.ioss.in/facebook/payfast_success.php">

<!-- Payer Details -->
<input type="hidden" name="name_first" value="Bob">
<input type="hidden" name="name_last" value="Smith">
<input type="hidden" name="email_address" value="sbtu01@payfast.co.za"> 

<!-- Transaction Details -->
<input type="hidden" name="m_payment_id" value="TRN123456789">
<input type="hidden" name="amount" value="200.00">
<input type="hidden" name="item_name" value="Widget Model 123">
<input type="hidden" name="item_description" value="Widget Model 123">

<!-- Transaction Options -->
<input type="hidden" name="email_confirmation" value="">

<!-- Security -->
<input type="hidden" name="signature" value="<?php echo $md5; ?>">

<input type="submit" name="submit" value="submit">

</form>

这是我尝试过的代码。

提供的变量不符合规范:

签名:生成的签名与提交的签名不匹配

这是我得到的错误。

// 从您的数组中创建 GET 字符串(以下示例来自数组 $params)

$pfOutput ='';
foreach( $params as $key => $val )
{
    if(!empty($val))
    {
        $pfOutput .= $key .'='. urlencode( trim( $val ) ) .'&';
    }
}
// Remove last ampersand

$getString = substr( $pfOutput, 0, -1 );
if( isset( $passPhrase ) && $paymode!='sandbox' )
{
    $getString .= '&passphrase='.$passPhrase;
}

$pfSignature = md5( $getString );
$params['signature'] = $pfSignature;

// 邮政

    $url = "https://sandbox.payfast.co.za/eng/process/?" . $getString;
    redirect($url);
}

您必须在处理输入计算签名,因为它基于它们。

更改任何值都会改变签名。

您可以在payfast的签名生成工具中检查您的签名。 链接: https : //sandbox.payfast.co.za/

打开此链接后,单击“POST CHECK”部分的“打开工具”按钮。

然后它会打开生成签名的对话框。 在点击“生成签名”按钮后,复制完整的请求 url 并在文本框中过去。

通过使用它,如果在 URL 中有所有错误,您将得到所有错误,还要检查两个签名。

官方文档中所述

为什么我会收到签名不匹配错误?

如果您使用错误顺序生成带有变量的 MD5 散列字符串,这很可能是造成的,它们需要按照上表中出现的顺序排列。 另一个原因可能是您没有对变量值进行 URLencoded 并使用 PHP 的trim()函数trim()掉末尾的所有空格,或者生成的URLencodinglower case (例如http%3a%2f%2f )而不是所需的upper case (例如http%3A%2F%2F )。

以下错误的原因(提供的变量不符合规范:)是您不必提交官方文档中提到的空白值(如何生成签名)

传输数据的安全签名采用提交变量的 MD5 散列形式。 创建散列的字符串是所有非空变量的名称值对的串联,其中“&”用作分隔符,例如。 name_first=John&name_last=Doe&email_address=… ” 其中对按它们出现在此页面上的顺序列出。 PayFast 引擎将重新生成此哈希值,并将值进行比较以确保数据传输的完整性。

您正在发送导致问题的<input type="hidden" name="email_confirmation" value="">空白值。 只需删除此字段,您就不会出现问题。(PayFast 将按照文档中的说明自动确认电子邮件)

始终添加您的密码,因为最后一个参数是您的签名......不幸的是,文档对此不是很清楚。

这是沙箱中的一个世代

这不是 MD5 转换器 ;) 要获得相同的签名,只需在字符串末尾添加 &passphrase=yourpassphrase 即可。 然后你在 MD5 中转换

在此处输入图片说明

您的 email_confirmation 输入值为空,并且您根本不将其包含在 md5 计算中。

由于您没有任何价值,因此请删除输入。 否则给它一个值并将其包含在您的 md5 计算中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM