这是我正在处理的OpenCart付款扩展程序的一个工作流程问题。
我想作为序言,我目前正在家中的虚拟机上托管我的服务器 - 我的OpenCart网站的域名在localhost:[somePortNumber]
下。
我正在实施名为99Bill(中国支付服务)的电子商务支付系统。我已完成所有URL生成,发送带有我所有正确密钥和值的GET请求到99Bill,我目前正处于交易后的步骤。
99Bill在其网址中有key
,可让您设置后台网址。后台URL本质上是在事务之后调用的内容,允许开发人员对事务信息执行任何操作,例如更新其SQL数据库,向用户发送电子邮件等。让我们调用此参数bgURL
(这就是99Bill无论如何都称之为。)
我的bgURL
被称为bill99_received.php
,在其中,我提供两个功能:
使用非对称加密验证验证99Bill的身份(稍后会详细介绍)
如果上述情况属实,请使用SQL查询将此会话的订单状态(在OpenCart的后端)从“待处理”更新为“已处理”。
下面是我如何从99Bill回调中检索键和值的示例。 (注意:我不完全确定这个程序是否有效,尽管在我的登台服务器中使用非OpenCart扩展程序,它可以正常工作)。
$parameter_string=check_for_null($_REQUEST[merchantAcctId],'merchantAcctId'); $parameter_string.=check_for_null($_REQUEST[version],'version'); $parameter_string.=check_for_null($_REQUEST[language],'language'); $parameter_string.=check_for_null($_REQUEST[signType],'signType'); $parameter....... .. .
在我拥有所有键和值后,我解码并检查它:
// Decode the signature message
$MAC = base64_decode($_REQUEST['signMsg']);
//Check if it is ok
$ok = $this->check($str, $MAC);
check(..,..)
函数如下所示:
/**
* Check whether the signed message sent back by the server is
* correct or not.
*/
function check($str, $MAC)
{
$fp = fopen(
dirname(__FILE__) . '/path/to/mykey.cer',
'r'
);
$cert = fread($fp, 8192);
fclose($fp);
$pubkeyid = openssl_get_publickey($cert);
return openssl_verify($str, $MAC, $pubkeyid);
}
如果一切都经过验证 - 很好。
然而,我的问题是,我的脚本根本不起作用。我不知道为什么。
我的问题是双重的:
虽然此脚本在我的登台服务器上工作时,当它 NOT 一个OpenCart扩展时,我现在无法验证99Bill是否会调用此bgURL
。
我的bill99_received.php
无法访问的事实是否与我在localhost
而不是面向公众的IP下进行测试的事实有关?
如何验证是否调用了此脚本?
编辑:
深入了解交易流程,因为我的bill99_received.php
确实只在我的localhost
机器上,99Bill将无法调用它。我的同事建议我使用cURL,但我不确定如何生成一些请求,以便可以通过cURL调用。
编辑2:
除了bgURL
之外,我们还有一个pageURL
,这是面向客户的页面,说明成功交易后要执行的内容。此页面将显示“结帐成功!”此URL也是localhost
页面,但它已成功显示在我的浏览器上。
编辑3:
检查99Bill的中文API,我发现了这一行:
如果bgURL
为空,则99Bill会将结果提取到pageURL
。
如果bgURL
不为空,99Bill将按照bgURL
的说明进行操作。
目前,我的代码是第二个选项 - bgURL
不为空。
答案 0 :(得分:0)
虽然我无法对此进行测试,但我能够转到我的localhost URL并使用以下命令调用bill99_received.php
:
curl --data "key1=value1&key2=value2" "http://localhost:port/path/to/99bill_received.php"