无法验证是否曾调用过支付服务的Backstage URL

时间:2014-10-14 03:18:16

标签: php sql opencart

这是我正在处理的OpenCart付款扩展程序的一个工作流程问题。

我想作为序言,我目前正在家中的虚拟机上托管我的服务器 - 我的OpenCart网站的域名在localhost:[somePortNumber]下。

我正在实施名为99Bill(中国支付服务)的电子商务支付系统。我已完成所有URL生成,发送带有我所有正确密钥和值的GET请求到99Bill,我目前正处于交易后的步骤。

99Bill在其网址中有key,可让您设置后台网址。后台URL本质上是在事务之后调用的内容,允许开发人员对事务信息执行任何操作,例如更新其SQL数据库,向用户发送电子邮件等。让我们调用此参数bgURL (这就是99Bill无论如何都称之为。)

我的bgURL被称为bill99_received.php,在其中,我提供两个功能:

  1. 使用非对称加密验证验证99Bill的身份(稍后会详细介绍)

  2. 如果上述情况属实,请使用SQL查询将此会话的订单状态(在OpenCart的后端)从“待处理”更新为“已处理”。

  3. 下面是我如何从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);
    }
    

    如果一切都经过验证 - 很好。

    然而,我的问题是,我的脚本根本不起作用。我不知道为什么。

    我的问题是双重的:

    1. 虽然此脚本在我的登台服务器上工作时,当它 NOT 一个OpenCart扩展时,我现在无法验证99Bill是否会调用此bgURL

    2. 我的bill99_received.php无法访问的事实是否与我在localhost而不是面向公众的IP下进行测试的事实有关?

    3. 如何验证是否调用了此脚本?

    4. 编辑:

      深入了解交易流程,因为我的bill99_received.php确实只在我的localhost机器上,99Bill将无法调用它。我的同事建议我使用cURL,但我不确定如何生成一些请求,以便可以通过cURL调用。

      编辑2:

      除了bgURL之外,我们还有一个pageURL,这是面向客户的页面,说明成功交易后要执行的内容。此页面将显示“结帐成功!”此URL也是localhost页面,但它已成功显示在我的浏览器上。

      编辑3:

      检查99Bill的中文API,我发现了这一行:

      1. 如果bgURL为空,则99Bill会将结果提取到pageURL

      2. 如果bgURL不为空,99Bill将按照bgURL的说明进行操作。

      3. 目前,我的代码是第二个选项 - bgURL不为空。

1 个答案:

答案 0 :(得分:0)

虽然我无法对此进行测试,但我能够转到我的localhost URL并使用以下命令调用bill99_received.php

curl --data "key1=value1&key2=value2" "http://localhost:port/path/to/99bill_received.php"