function googlecheckoutresponsehandler() { //chdir(".."); require_once 'library/googleresponse.php'; require_once 'library/googlemerchantcalculations.php'; require_once 'library/googleresult.php'; require_once 'library/googlerequest.php'; $this->load->model('payment_model'); $paymentGateways_google = $this->payment_model->getGooglecheckoutsettings(); $base_url = $base_url(); define('RESPONSE_HANDLER_ERROR_LOG_FILE', $base_url . 'googlelog/googleerror.log'); define('RESPONSE_HANDLER_LOG_FILE', $base_url . 'googlelog/googlemessage.log'); /* $merchant_id = ""; // Your Merchant ID $merchant_key = ""; // Your Merchant Key $server_type = "sandbox"; // change this to go live */ $merchant_id = $paymentGateways_google['googlecheckout']['merchant_id']; // Your Merchant ID $merchant_key = $paymentGateways_google['googlecheckout']['merchant_key']; // Your Merchant Key $server_type = $paymentGateways_google['googlecheckout']['server_type']; $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']; $test = array('status' => $new_financial_state); $this->common_model->insert('test', $test); 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 */ }
//Compute tax for this address id and shipping type $amount = 15; // Modify this to the actual tax value $merchant_result->SetTaxDetails($amount, "USD"); } $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, "USD", "test2"); $merchant_result->AddCoupons($coupons); } $merchant_calc->AddResult($merchant_result); } } fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $merchant_calc->GetXML())); $response->ProcessMerchantCalculations($merchant_calc); break; case "new-order-notification": $response->SendAck(); break; case "order-state-change-notification": $response->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': //$response->SendProcessOrder($data[$root]['google-order-number']['VALUE'], // $message_log); //$response->SendChargeOrder($data[$root]['google-order-number']['VALUE'],
function callback($in, &$paymentId, &$money, &$message) { ##chdir(".."); define('RESPONSE_HANDLER_LOG_FILE', 'googlemessage.log'); //Setup the log file if (!($message_log = fopen(RESPONSE_HANDLER_LOG_FILE, "a"))) { $message = "Cannot open " . RESPONSE_HANDLER_LOG_FILE . " file."; return PAY_ERROR; } // Retrieve the XML sent in the HTTP POST request to the ResponseHandler $xml_response = $HTTP_RAW_POST_DATA; if (get_magic_quotes_gpc()) { $xml_response = stripslashes($xml_response); } $headers = getallheaders(); fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $xml_response)); $merchant_key = $this->getConf($in["M_OrderId"], 'PrivateKey'); //todo支付号没有 // Create new response object //$merchant_id = ""; //Your Merchant ID //$merchant_key = ""; //Your Merchant Key $server_type = "checkout"; $response = new GoogleResponse($merchant_id, $merchant_key, $xml_response, $server_type); $root = $response->root; $data = $response->data; fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $response->root)); //Use the following two lines to log the associative array storing the XML data //$result = print_r($data,true); //fwrite($message_log, sprintf("\n\r%s:- %s\n",date("D M j G:i:s T Y"),$result)); //Check status and take appropriate action $status = $response->HttpAuthentication($headers); /* Commands to send the various order processing APIs * Send charge order : $response->SendChargeOrder($data[$root] * ['google-order-number']['VALUE'], <amount>, $message_log); * Send proces order : $response->SendProcessOrder($data[$root] * ['google-order-number']['VALUE'], $message_log); * Send deliver order: $response->SendDeliverOrder($data[$root] * ['google-order-number']['VALUE'], <carrier>, <tracking-number>, * <send_mail>, $message_log); * Send archive order: $response->SendArchiveOrder($data[$root] * ['google-order-number']['VALUE'], $message_log); * */ 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(); // Loop through the list of address ids from the callback $addresses = $this->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['region']['VALUE']; // Loop through each shipping method if merchant-calculated shipping // support is to be provided if (isset($data[$root]['calculate']['shipping'])) { $shipping = $this->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 = 10; // Modify this to get the actual price $shippable = "true"; // Modify this as required $merchant_result = new GoogleResult($curr_id); $merchant_result->SetShippingDetails($name, $price, "USD", $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, "USD"); } $codes = $this->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, "USD", "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, "USD"); } $codes = $this->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, "USD", "test2"); $merchant_result->AddCoupons($coupons); } $merchant_calc->AddResult($merchant_result); } } fwrite($message_log, sprintf("\n\r%s:- %s\n", date("D M j G:i:s T Y"), $merchant_calc->GetXML())); $response->ProcessMerchantCalculations($merchant_calc); break; case "new-order-notification": $response->SendAck(); break; case "order-state-change-notification": $response->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': //$response->SendProcessOrder($data[$root]['google-order-number']['VALUE'], // $message_log); //$response->SendChargeOrder($data[$root]['google-order-number']['VALUE'], // '', $message_log); break; case 'CHARGING': break; case 'CHARGED': break; case 'PAYMENT_DECLINED': break; case 'CANCELLED': break; case 'CANCELLED_BY_GOOGLE': //$response->SendBuyerMessage($data[$root]['google-order-number']['VALUE'], // "Sorry, your order is cancelled by Google", true, $message_log); break; default: break; } switch ($new_fulfillment_order) { case 'NEW': break; case 'PROCESSING': break; case 'DELIVERED': break; case 'WILL_NOT_DELIVER': break; default: break; } case "charge-amount-notification": $response->SendAck(); //$response->SendDeliverOrder($data[$root]['google-order-number']['VALUE'], // <carrier>, <tracking-number>, <send-email>, $message_log); //$response->SendArchiveOrder($data[$root]['google-order-number']['VALUE'], // $message_log); break; case "chargeback-amount-notification": $response->SendAck(); break; case "refund-amount-notification": $response->SendAck(); break; case "risk-information-notification": $response->SendAck(); break; default: break; } return PAY_SUCCESS; ## }