Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何解析来自google checkout的XML响应?_Php_Mysql_Xml - Fatal编程技术网

Php 如何解析来自google checkout的XML响应?

Php 如何解析来自google checkout的XML响应?,php,mysql,xml,Php,Mysql,Xml,我看到了处理订单时google checkout的XML响应 我还看到了我在下面复制的googleresponsehandlerdemo.php文件 我不知道应该在哪里插入代码,我将使用该代码更新我的店铺的库存水平。有人能指给我看吗?当我收到回复时,我也不太确定如何找出订单内容 <?php chdir(".."); require_once('library/googleresponse.php'); require_once('library/googlemerc

我看到了处理订单时google checkout的XML响应

我还看到了我在下面复制的googleresponsehandlerdemo.php文件

我不知道应该在哪里插入代码,我将使用该代码更新我的店铺的库存水平。有人能指给我看吗?当我收到回复时,我也不太确定如何找出订单内容

<?php



   chdir("..");
   require_once('library/googleresponse.php');
   require_once('library/googlemerchantcalculations.php');
   require_once('library/googleresult.php');
   require_once('library/googlerequest.php');

   define('RESPONSE_HANDLER_ERROR_LOG_FILE', 'googleerror.log');
   define('RESPONSE_HANDLER_LOG_FILE', 'googlemessage.log');
   $merchant_id = "";  // Your Merchant ID
   $merchant_key = "";  // Your Merchant Key
   $server_type = "sandbox";  // change this to go live
   $currency = 'USD';  // set to GBP if in the UK

   $Gresponse = new GoogleResponse($merchant_id, $merchant_key);

   $Grequest = new GoogleRequest($merchant_id, $merchant_key, $server_type, $currency);

   //Setup the log file
   $Gresponse->SetLogFiles(RESPONSE_HANDLER_ERROR_LOG_FILE, 
                                    RESPONSE_HANDLER_LOG_FILE, L_ALL);

   // Retrieve the XML sent in the HTTP POST request to the ResponseHandler
   $xml_response = isset($HTTP_RAW_POST_DATA)?
                $HTTP_RAW_POST_DATA:file_get_contents("php://input");
   if (get_magic_quotes_gpc()) {
   $xml_response = stripslashes($xml_response);
   }
   list($root, $data) = $Gresponse->GetParsedXML($xml_response);
   $Gresponse->SetMerchantAuthentication($merchant_id, $merchant_key);

   $status = $Gresponse->HttpAuthentication();
   if(! $status) {
   die('authentication failed');
   }

   /* Commands to send the various order processing APIs
   * Send charge order : $Grequest->SendChargeOrder($data[$root]
   *    ['google-order-number']['VALUE'], <amount>);
   * Send process order : $Grequest->SendProcessOrder($data[$root]
   *    ['google-order-number']['VALUE']);
   * Send deliver order: $Grequest->SendDeliverOrder($data[$root]
   *    ['google-order-number']['VALUE'], <carrier>, <tracking-number>,
   *    <send_mail>);
   * Send archive order: $Grequest->SendArchiveOrder($data[$root]
   *    ['google-order-number']['VALUE']);
   *
   */

  switch ($root) {
  case "request-received": {
  break;
}
case "error": {
  break;
}
case "diagnosis": {
  break;
}
case "checkout-redirect": {
  break;
}
case "merchant-calculation-callback": {
  // Create the results and send it
  $merchant_calc = new GoogleMerchantCalculations($currency);

  // Loop through the list of address ids from the callback
  $addresses = get_arr_result($data[$root]['calculate']['addresses']['anonymous-address']);
  foreach($addresses as $curr_address) {
    $curr_id = $curr_address['id'];
    $country = $curr_address['country-code']['VALUE'];
    $city = $curr_address['city']['VALUE'];
    $region = $curr_address['region']['VALUE'];
    $postal_code = $curr_address['postal-code']['VALUE'];

    // Loop through each shipping method if merchant-calculated shipping
    // support is to be provided
    if(isset($data[$root]['calculate']['shipping'])) {
      $shipping = get_arr_result($data[$root]['calculate']['shipping']['method']);
      foreach($shipping as $curr_ship) {
        $name = $curr_ship['name'];
        //Compute the price for this shipping method and address id
        $price = 12; // Modify this to get the actual price
        $shippable = "true"; // Modify this as required
        $merchant_result = new GoogleResult($curr_id);
        $merchant_result->SetShippingDetails($name, $price, $shippable);

        if($data[$root]['calculate']['tax']['VALUE'] == "true") {
          //Compute tax for this address id and shipping type
          $amount = 15; // Modify this to the actual tax value
          $merchant_result->SetTaxDetails($amount);
        }

        if(isset($data[$root]['calculate']['merchant-code-strings']
            ['merchant-code-string'])) {
          $codes = get_arr_result($data[$root]['calculate']['merchant-code-strings']
              ['merchant-code-string']);
          foreach($codes as $curr_code) {
            //Update this data as required to set whether the coupon is valid, the code and the amount
            $coupons = new GoogleCoupons("true", $curr_code['code'], 5, "test2");
            $merchant_result->AddCoupons($coupons);
          }
         }
         $merchant_calc->AddResult($merchant_result);
      }
    } else {
      $merchant_result = new GoogleResult($curr_id);
      if($data[$root]['calculate']['tax']['VALUE'] == "true") {
        //Compute tax for this address id and shipping type
        $amount = 15; // Modify this to the actual tax value
        $merchant_result->SetTaxDetails($amount);
      }
      $codes = get_arr_result($data[$root]['calculate']['merchant-code-strings']
          ['merchant-code-string']);
      foreach($codes as $curr_code) {
        //Update this data as required to set whether the coupon is valid, the code and the amount
        $coupons = new GoogleCoupons("true", $curr_code['code'], 5, "test2");
        $merchant_result->AddCoupons($coupons);
      }
      $merchant_calc->AddResult($merchant_result);
    }
  }
  $Gresponse->ProcessMerchantCalculations($merchant_calc);
  break;
}
case "new-order-notification": {
  $Gresponse->SendAck();
  break;
}
case "order-state-change-notification": {
  $Gresponse->SendAck();
  $new_financial_state = $data[$root]['new-financial-order-state']['VALUE'];
  $new_fulfillment_order = $data[$root]['new-fulfillment-order-state']['VALUE'];

  switch($new_financial_state) {
    case 'REVIEWING': {
      break;
    }
    case 'CHARGEABLE': {
      //$Grequest->SendProcessOrder($data[$root]['google-order-number']['VALUE']);
      //$Grequest->SendChargeOrder($data[$root]['google-order-number']['VALUE'],'');
      break;
    }
    case 'CHARGING': {
      break;
    }
    case 'CHARGED': {
      break;
    }
    case 'PAYMENT_DECLINED': {
      break;
    }
    case 'CANCELLED': {
      break;
    }
    case 'CANCELLED_BY_GOOGLE': {
      //$Grequest->SendBuyerMessage($data[$root]['google-order-number']['VALUE'],
      //    "Sorry, your order is cancelled by Google", true);
      break;
    }
    default:
      break;
  }

  switch($new_fulfillment_order) {
    case 'NEW': {
      break;
    }
    case 'PROCESSING': {
      break;
    }
    case 'DELIVERED': {
      break;
    }
    case 'WILL_NOT_DELIVER': {
      break;
    }
    default:
      break;
  }
  break;
}
case "charge-amount-notification": {
  //$Grequest->SendDeliverOrder($data[$root]['google-order-number']['VALUE'],
  //    <carrier>, <tracking-number>, <send-email>);
  //$Grequest->SendArchiveOrder($data[$root]['google-order-number']['VALUE'] );
  $Gresponse->SendAck();
  break;
}
case "chargeback-amount-notification": {
  $Gresponse->SendAck();
  break;
}
case "refund-amount-notification": {
  $Gresponse->SendAck();
  break;
}
case "risk-information-notification": {
  $Gresponse->SendAck();
  break;
}
default:
  $Gresponse->SendBadRequestStatus("Invalid or not supported Message");
  break;
  }
 /* In case the XML API contains multiple open tags
    with the same value, then invoke this function and
    perform a foreach on the resultant array.
    This takes care of cases when there is only one unique tag
    or multiple tags.
    Examples of this are "anonymous-address", "merchant-code-string"
    from the merchant-calculations-callback API
 */
 function get_arr_result($child_node) {
   $result = array();
   if(isset($child_node)) {
     if(is_associative_array($child_node)) {
       $result[] = $child_node;
     }
   else {
    foreach($child_node as $curr_node){
      $result[] = $curr_node;
    }
  }
}
return $result;
}

   /* Returns true if a given variable represents an associative array */
  function is_associative_array( $var ) {
    return is_array( $var ) && !is_numeric( implode( '', array_keys( $var ) ) );
  }
?>

我不太会使用PHP,但您使用的是XML解析器吗

我不能完全从你的代码中分辨出来,但如果你不是,它会让你的生活更轻松


看起来您的思路是正确的:您希望在收到订单时减少库存,因此在其他地方,如果库存为零,您可以立即显示该商品缺货

至于您的另一个问题,$data[$root]数组的每个括号级别都会使您在XML结构中降低另一个级别,就像示例代码的商户回调计算案例一样

整个响应似乎都在$data中,所以我只看一看示例响应,看看您用这种方式寻找的是什么。也许可以使用一些echo语句来查看['VALUE']在不同位置的结果


这完全是一个启发性的答案,但希望能有所帮助

约翰说了,但要确认答案,关键是$data

例如,订单号是一个值,可以使用以下命令进行回送:

$data[$root]['google-order-number']['VALUE']


…等等。

这是谷歌的示例代码。。。它似乎在内部解析XML:$gressponse->GetParsedXML($XML\u response)。我只是不知道如何指定我要查找的标记,并使用PHPs解析器获取所述标记的值。如果没有其他内容,您也会响应我的想法,但不一定有足够的信心在没有听到其他人的声音的情况下插入。所以非常感谢。
  case "new-order-notification": {
       $Gresponse->SendAck();
       break;"
  }