Тема: [Одноклассники] Payment Process в Одноклассниках
Показать сообщение отдельно
Старый 17.11.2011, 17:23
mikhailk вне форума Посмотреть профиль Отправить личное сообщение для mikhailk Найти все сообщения от mikhailk
  № 2  
Ответить с цитированием
mikhailk
 
Аватар для mikhailk

Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
Вот пример работающего callback-скрипта на PHP для ОК (где-то у них на форумах взял). Наш серверный программер сделал на его основе и все работает нормально. После того, как пользователь выбрал платеж в штатной форме ОК, их сервер дергает ваш сервер и затем уже возникает их событие, которое нужно отловить и передать в свою флешку (если подключение как iframe).

Код:
<?php
header('Content-Type: application/xml; charset=utf-8');
error_reporting(E_ERROR);

//параметры приложения
$appKey="...";
$application_secret_key = "...";

//читаем переданные параметры 
$method = $_REQUEST["method"];
$application_key = $_REQUEST["application_key"];
$call_id = $_REQUEST["call_id"];
$sig = $_REQUEST["sig"];
$uid = $_REQUEST["uid"];
$amount = $_REQUEST["amount"];
$transaction_time = $_REQUEST["transaction_time"];
$product_code = $_REQUEST["product_code"];
$transaction_id = $_REQUEST["transaction_id"];

//проверяем метод
if($method != "callbacks.payment") {
header('invocation-error: 3');
print('<?xml version="1.0" encoding="UTF-8"?>');
?>
<ns2:error_response xmlns:ns2='http://api.forticom.com/1.0/'>
    <error_code>3</error_code>
    <error_msg>Method does not exist.</error_msg>
</ns2:error_response>
<?php
die();
}

//проверяем appKey
if($appKey != $application_key) {
header('invocation-error: 101');
print('<?xml version="1.0" encoding="UTF-8"?>');
?>
<ns2:error_response xmlns:ns2='http://api.forticom.com/1.0/'>
    <error_code>101</error_code>
    <error_msg>Parameter application_key not specified or invalid</error_msg>
</ns2:error_response>
<?php
die();
}

//собираем переданные параметры без учета sig
$i = 0;
$params = array();
foreach ($_GET as $key => $value) {
	if($key != "sig") {
		$params[$i] = "$key=$value";
		$i++;
	}
}
sort($params);
$params = join('', $params);
$mySig = md5($params . $application_secret_key);

//проверяем подпись
if($sig != $mySig) {
header('invocation-error: 104');
print('<?xml version="1.0" encoding="UTF-8"?>');
?>
<ns2:error_response xmlns:ns2='http://api.forticom.com/1.0/'>
    <error_code>104</error_code>
    <error_msg>Invalid signature.</error_msg>
</ns2:error_response>
<?php
die();
}

//TODO: 1) Transaction ID is unique and Application/Game server must ignore transactions with duplicated ID. 
//TODO: It must return positive result, if transaction was processed successfully earlier.

//TODO: 2) Cообщаем серверу о поступившем платеже

//TODO: 3) Cохраняем в БД успешную транзакцию

//отдаем успешный статус
print('<?xml version="1.0" encoding="UTF-8"?>');
?>
<callbacks_payment_response xmlns="http://api.forticom.com/1.0/">true</callbacks_payment_response>