Вопрос

Я планирую интегрировать платежную систему Google Checkout в социальную сеть.Идея состоит в том, что участники могут покупать «токены» за реальные деньги (которые являются своего рода валютой веб-сайта), а затем они могут покупать доступ к некоторому дополнительному контенту на веб-сайте и т. д.

Я хочу создать кнопку Google Checkout, которая переводит участника на страницу оформления заказа, где он платит своей кредитной или дебетовой картой.Я хочу, чтобы Google Checkout уведомлял мой сервер о том, прошла ли покупка токенов успешно (если с кредитной/дебетовой карты были сняты средства), чтобы я мог обновить локальную базу данных.

Сайт написан на PHP/MySQL.

Я скачал пример PHP-кода отсюда:code.google.com/p/google-checkout-php-sample-code/wiki/Документация

Я знаю, как создать кнопку оформления заказа Google, и я также разместил файл responsehandlerdemo.php на своем сервере.Это файл, на который Google Checkout должен отправить ответ (конечно, я установил путь к файлу в учетной записи продавца Google).

Теперь в файле обработчика ответа есть блок переключателей с несколькими операторами case.Что означает, что платеж прошел успешно и я могу добавить токены на учетную запись участника в локальной базе данных?

  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;

}

Я думаю, что это тот самый случай «CHARGED», я прав?

Второй вопрос: нужен ли мне сертификат SSL для получения ответа от Google Checkout?В соответствии с этим я делаю:groups.google.com/group/google-checkout-api-php/browse_thread/thread/10ce55177281c2b0

Но я не вижу упоминания об этом где-либо в официальной документации.

Спасибо.

Это было полезно?

Решение

Я интегрировал это в свой сайт более 6 месяцев назад.Громкость очень низкая, но пока работает хорошо.


Первое, о чем вам следует беспокоиться, это «ПЛАТНОСТЬ».Это означает, что кредитная карта была одобрена для транзакции, но средства фактически не будут списаны, пока вы не предпримете никаких действий.Чтобы отправить запрос на списание средств, просто раскомментируйте две строки в разделе ПЛАТА.Вы можете изменить свои настройки, чтобы автоматически списывать средства с карты в «Настройки» > «Настройки», но вы также можете просто раскомментировать две строки и оставить свои параметры открытыми.

Обратите внимание, что вам может потребоваться ДОЖДАТЬ «уведомления с информацией о рисках» и определить, прошла ли проверка рисков, прежде чем утверждать списание ($data[$root]['risk-information']['eligible-for-protection'] ['ЦЕНИТЬ']).Хотя, похоже, вы говорите о цифровых товарах, возможность возврата платежей может для вас не иметь значения.

В какой-то момент я уверен, что вам также следует проверить, что в запросе содержится достаточно информации, чтобы вы могли привязать средства к какому-то счету, прежде чем списывать их, но, возможно, это просто моя паранойя.


Другое состояние, которое я использую, — это «уведомление о сумме платежа».Вполне возможно, что существует способ использовать «CHARGED», но я не уверен, что «CHARGED» указывает сумму, которая действительно была списана.($amount_charged = $data[$root]['общая сумма-заряда']['VALUE'];)


Что касается SSL, если вы проверите место, где вы вводите URL-адрес обратного вызова, он укажет следующее:«Укажите URL-адрес, по которому Google сможет уведомлять вас о новых заказах и изменениях в состоянии заказов.Вы должны предоставить URL-адрес сервера, на котором работает 128-битный SSLv3 или TLS».


Ответ на ваш комментарий:Я делаю это в разделе «new_order_notification», не уверен, что вы можете сделать это где-нибудь еще.

$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
}

Другие советы

Да, «Платный» — это первое, на что вам нужно обратить внимание при заказе Google Checkout.Когда вы нажмете «Оплачивается», появится окно, в котором вы сможете фактически оплатить заказ. НО будьте уверены, что «Имеет право на защиту» — это правда прежде чем фактическая оплата заказа.Это гарантирует, что на платеж распространяется гарантия оплаты Google.Вы можете увидеть это в разделе «Проверка кредитоспособности покупателя» в Google Checkout.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top