【问题标题】:PHP Session is not recognized after a response from the CCNow serverCCNow 服务器响应后无法识别 PHP 会话
【发布时间】:2014-06-16 22:45:02
【问题描述】:

我将 CCNow 支付网关与我的自定义 PHP 购物车一起使用。我的代码运行良好,只是当 CCNow 服务器响应我的页面时无法识别购物车会话。

在该响应中,CCNow 发送带有订单状态的订单详细信息,我的代码应该在此阶段保存或更新订单。

我通过直接在浏览器中输入页面来测试该页面,它运行良好。我还通过将订单 ID 存储在日志文件中来确保 CCNow 响应发生。

有什么想法吗?我的代码如下:

<?php
session_start();
include('includes/config.php');
include('includes/db.php');

$status = 0;
$x_status = '';
$x_orderid = '';
$x_orderdate = '';
$key = '12345';

if(isset($_REQUEST['x_status'])){
    $x_status = strtolower($_REQUEST['x_status']);
}

if(isset($_REQUEST['x_orderid'])){
    $x_orderid = $_REQUEST['x_orderid'];
}

if(isset($_REQUEST['x_orderdate'])){
    $x_orderdate = $_REQUEST['x_orderdate'];
}

$str = $x_orderid . '^' . $x_status . '^' . $x_orderdate . '^' . $key;
$hash = md5($str);

if(($x_status == 'pending') || ($x_status == 'test')){
    $status = 1;
}

$order_exists = false;

$sql = "SELECT id FROM orders WHERE method = 'CCNow' and x_orderid = '" . $x_orderid . "' LIMIT 1";
$result = mysql_query($sql);
while ( $value = mysql_fetch_array($result) ){
    $order_exists = true;
}

if($order_exists){ // update order
    $sql = "UPDATE orders SET status = " . $status . " WHERE method = 'CCNow' and x_orderid = '" . $x_orderid . "'";
    $result = mysql_query($sql);
}
else{ // add new order
    if(isset($_SESSION["products"])){
        $customer_id = $_SESSION['customer_id'];
        $net = $_SESSION['cart_net'];
        $shipping_cost = $_SESSION['cart_shipping_cost'];
        $date = date("Y-m-d");
        // save order
        $sql = "INSERT INTO orders(customer_id, date, method, status, net, shipping_cost, x_orderid) ";
        $sql.= "VALUES($customer_id, '$date', 'CCNow', $status, $net, $shipping_cost, '$x_orderid')";
        $result = mysql_query($sql);
        $order_id = mysql_insert_id($GLOBALS['connection']);
        // save order details
        foreach ($_SESSION["products"] as $cart_itm){
            $product_id = $cart_itm["ID"];
            $product_code = $cart_itm["code"];
            $product_qty = $cart_itm["qty"];
            $product_price = $cart_itm["price"];
            $subtotal = ($cart_itm["price"]*$cart_itm["qty"]);
            $sql = "INSERT INTO order_details(order_id, product_id, price, qty, net) ";
            $sql.= "VALUES($order_id, $product_id, $product_price, $product_qty, $subtotal)";
            $result = mysql_query($sql);
        }
        // unset cart sessions and redirect to success page
        unset($_SESSION['cart_net']);
        unset($_SESSION['cart_shipping_cost']);
        unset($_SESSION['products']);
    }
    else{
        file_put_contents('ccnowlog.txt', date('Y-m-d h s i') . 'Not seeing the session!!!', FILE_APPEND);
    }
}

// This is an OK response to CCNow IMPORTANT
echo 'ok';

?>

【问题讨论】:

  • 这只是处理响应的代码吗?请告诉我们对方:这里的代码你和CCNow谈话。 mysql_*弃用,请使用PDOMySQLi
  • 会话数据取决于用户,CCNow 服务器不会有会话 id,而用户有。如果上面是由 ccnow 服务器调用的,$_SESSION 将为空。您需要将购物车数据保存在会话以外的其他位置,可能是数据库。

标签: php integration session-variables payment-gateway


【解决方案1】:

您的问题是逻辑问题

您与 CCNow 通信并发送交易。但是服务器 von CCNow 会单独回答您 - 从逻辑上讲,“客户会话”将无法访问。

您必须使用 Order-ID 才能获取数据。另外你可以修改参数。下面是来自插件的一个小示例

 $data['x_fp_sequence']             = $sessionid
 $data['x_invoice_num']             = $sessionid;

你看,会话 ID 将与 x_fp_sequencex_invoice_num 一起传递。在您的响应脚本上,您必须使用它来获取用户会话。否则,您可以直接从数据库中获取用户数据。

【讨论】:

  • 所以,我应该在将交易发送到 CCNow 之前保存订单详细信息,然后使用 x_fp_hash 的值根据 API 响应更新订单?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-03
  • 2015-12-12
  • 2018-12-24
  • 2013-10-17
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多