Pregunta

Estoy planeando integrar un sistema de pago Google Checkout en un sitio web de redes sociales. La idea es que los miembros puedan comprar "tokens" por dinero real (que es una especie de moneda del sitio web) y luego pueden comprar acceso a algún contenido adicional en el sitio web, etc.

Lo que quiero hacer es crear un botón Google Checkout que lleve a un miembro a la página de pago donde paga con su tarjeta de crédito o débito. Lo que quiero es que Google Checkout notifique a mi servidor si la compra de tokens fue exitosa (si se cargó la tarjeta de crédito / débito) para que pueda actualizar la base de datos local.

El sitio web está codificado en PHP / MySQL.

He descargado el código PHP de muestra desde aquí: code.google.com/p/google-checkout-php-sample-code/wiki/Documentation

Sé cómo crear un botón de pago de Google y también he colocado el archivo responsehandlerdemo.php en mi servidor. Este es el archivo al que se supone que Google Checkout debe enviar una respuesta (por supuesto, configuré la ruta al archivo en la cuenta de comerciante de Google).

Ahora en el archivo del manejador de respuestas hay un bloque de interruptores con varias declaraciones de casos. ¿Cuál significa que el pago se realizó correctamente y puedo agregar tokens a la cuenta de miembro en la base de datos local?

  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;

}

Supongo que ese caso 'CARGADO' es el correcto, ¿estoy en lo cierto?

Segunda pregunta, ¿necesito un certificado SSL para recibir una respuesta de Google Checkout? De acuerdo con esto, hago: groups.google.com/group/google-checkout-api-php/browse_thread/thread/10ce55177281c2b0

Pero no veo que se mencione en ninguna parte de la documentación oficial.

Gracias.

¿Fue útil?

Solución

Lo integré en mi sitio hace más de 6 meses. Tiene un volumen muy bajo, pero funciona bien hasta ahora.


Lo primero de lo que debe preocuparse es 'CARGABLE'. Esto significa que la tarjeta de crédito ha sido aprobada para la transacción, pero en realidad no cargará los fondos hasta que usted tome medidas. Para enviar la solicitud de cargo, simplemente descomente las dos líneas en CARGABLE. Puede cambiar su configuración para que cargue automáticamente la tarjeta en 'configuración' > 'preferencias', pero también podrías descomentar las 2 líneas y dejar tus opciones abiertas.

Tenga en cuenta que es posible que desee ESPERAR la 'notificación de información de riesgo' y determinar si la verificación de riesgo se aprobó antes de aprobar el cargo ($ datos [$ raíz] ['información de riesgo'] ['elegible para- protección '] [' VALOR ']). Aunque, parece que está hablando de productos digitales, la posibilidad de contracargos podría no importarle.

En algún momento, estoy seguro de que también debe verificar que la solicitud tenga información suficiente para que pueda vincular los fondos a alguna cuenta antes de cobrarla, pero tal vez esto sea solo mi paranoia.


El otro estado que uso es 'cargo-cantidad-notificación'. Es completamente posible que haya una manera de usar 'CARGADO', pero no creo que 'CARGADO' proporcione una cantidad que realmente se cargó. ($ amount_charged = $ data [$ root] ['total-charge-amount'] ['VALUE'];)


En cuanto a SSL, si marca la ubicación donde ingresa la URL de devolución de llamada, indica lo siguiente: " Especifique una URL para que Google le notifique sobre nuevos pedidos y cambios en el estado del pedido. Debe proporcionar la URL de un servidor que ejecute SSLv3 de 128 bits o TLS "


Respuesta a tu comentario: Hago esto bajo 'new_order_notification', no estoy seguro de si puede hacerlo en otro lugar.

$items = get_arr_result( $data[$root]['shopping-cart']['items']['item'] ); 
foreach( $items as $item ) { 
   if( !isset ( $item['merchant-item-id']['VALUE'] ) ) { 
     //error 
     return; 
   } 
   $request_item_id = $item['merchant-item-id']['VALUE']; 
   //save your item id with corresponding google order id for further processing
}

Otros consejos

Sí, " De pago " es lo primero que debe mirar en un pedido de Google Checkout. Al hacer clic en "Cobrable", aparecerá una ventana emergente para que usted pueda cargar el pedido PERO asegúrese de que " Elegible para Protección " es verdadero antes de cobrar el pedido. Esto le garantiza que el pago está cubierto por la garantía de pago de Google. En realidad, puede verlo en la "Verificación de crédito del comprador". sección en Google Checkout.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top