Pergunta

Estou planejando para integrar um sistema de pagamento Google Checkout em um site de rede social. A ideia é que os membros podem comprar "tokens" para dinheiro real (que são uma espécie de moeda website) e, em seguida, eles podem comprar o acesso a alguns conteúdos extra no website etc.

O que eu quero fazer é criar um botão Google Checkout que leva um membro para a página de pagamento onde ele paga com seu cartão de crédito ou de débito. O que eu quero é o Google Checkout para notificar notificar meu servidor se a compra de tokens foi bem sucedida (se o cartão de crédito / débito foi cobrado) para que eu possa atualizar o banco de dados local.

O site é codificado em PHP / MySQL.

Eu transferi o código PHP de amostra a partir daqui: code.google.com/p/google-checkout-php-sample-code/wiki/Documentation

Eu sei como criar um botão Google Checkout e eu também colocou o arquivo responsehandlerdemo.php no meu servidor. Este é o arquivo do Google Checkout é suposto para enviar resposta a (é claro que eu definir o caminho para o arquivo no comerciante conta Google).

Agora, no arquivo manipulador de resposta há um bloco switch com várias declarações de caso. Que um dos meios que o pagamento foi bem sucedido e eu posso adicionar fichas para a conta de membro no banco de dados 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;

}

Eu acho que nesse caso 'cobrado' é o único, estou certo?

Segunda pergunta, que eu preciso de um certificado SSL para receber resposta do Google Checkout? De acordo com este eu faço: groups.google.com/group/google-checkout-api-php/browse_thread/thread/10ce55177281c2b0

Mas eu não de vê-lo mencionado em qualquer lugar na documentação oficial.

Obrigado.

Foi útil?

Solução

I integrado isso em meu site mais de 6 meses atrás. É um volume muito baixo, mas funciona bem até agora.


A primeira coisa que você deve se preocupar é 'exigível'. Isto significa que o cartão de crédito foi aprovado para a transação, mas não vai realmente cobrar os fundos até que você agir. Para enviar a solicitação de carga, simplesmente un-comentário duas linhas sob exigível. Você pode alterar as configurações para torná-lo automaticamente carregar o cartão em 'configurações'> 'Preferências', mas você pode muito bem un-comment as 2 linhas e deixar suas opções em aberto.

Note que você pode querer esperar para o 'risco-informações-notificação' e determinar se a verificação de risco passou antes de aprovar o custo ($ data [$ raiz] [ 'risco-informação'] [ 'elegíveis-para- proteção '] [' VALOR ']). Embora, parece que você está falando de bens digitais a possibilidade de estornos pode não importa para você.

Em algum ponto, eu tenho certeza que você também deve verificar se o pedido tem informações suficientes para fazer a ligação dos fundos para alguns conta antes de carregá-lo, mas talvez este é apenas minha paranóia.


O outro estado que eu uso é 'charge-montante-notificação'. É completamente possível que haja uma maneira de usar 'cobrado', mas eu não fazer isso 'cobrado' fornece uma quantidade que foi efectivamente cobrada. ($ = $ Amount_charged dados [$ raiz] [ 'de carga-montante total'] [ 'VALOR'];)


Como para o SSL, se você verificar o local onde você digita a URL de retorno de chamada que afirma o seguinte: "Especifique um URL para o Google para notificá-lo de ordens e mudanças nova no estado de ordem. Você deve fornecer a URL de um servidor com 128-bit SSLv3 ou TLS"


Resposta ao seu comentário: Eu faço isso em 'new_order_notification', não tenho certeza se você pode fazê-lo em outro 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
}

Outras dicas

Sim, "exigível" é a primeira coisa que você precisa olhar para em uma ordem Google Checkout. Quando clicar em "exigível", uma janela pop-up para que você possa realmente cobrar a ordem MAS certifique-se de que o "elegível para protecção" é True antes de realmente carregar a ordem . Isto assegurar-lhe que o pagamento é coberto pela garantia de pagamento do Google. Você pode realmente vê-lo na seção "Verificação de Crédito Comprador" no Google Checkout.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top