[英]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¬ify_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()
掉末尾的所有空格,或者生成的URLencoding
是lower 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 将按照文档中的说明自动确认电子邮件)
您的 email_confirmation 输入值为空,并且您根本不将其包含在 md5 计算中。
由于您没有任何价值,因此请删除输入。 否则给它一个值并将其包含在您的 md5 计算中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.