Платежи в Одноклассниках

Использование API других социальных сетей
Ответить
tolmasoft
Сообщения: 26
Зарегистрирован: 01 ноя 2012, 18:35

Платежи в Одноклассниках

Сообщение tolmasoft »

Если кто-то сталкивался с этим, то подскажите, как сделать серверную часть для обработки платежей в ОК. Читал доку, но там ничего толкового нет. Уже буквально все портиртировал из ВК в ОК, но платежи вообще пес его знает как сделать...
Аватара пользователя
igr_07
Сообщения: 2
Зарегистрирован: 13 дек 2014, 11:33

Re: Платежи в Одноклассниках

Сообщение igr_07 »

Есть такой пример

Код: Выделить всё

 <?php class Payment {    const ERROR_TYPE_UNKNOWN = 1;    const ERROR_TYPE_SERVISE = 2;    const ERROR_TYPE_CALLBACK_INVALID_PYMENT = 3;    const ERROR_TYPE_SYSTEM = 9999;    const ERROR_TYPE_PARAM_SIGNATURE = 104;     const APP_PUBLIC_KEY = "xxx"; // открытый ключ    const APP_SECRET_KEY = "xxx"; // секретный ключ     // массив пар код продукта => цена    public static $catalog = array(        "item1" => 10,        "item2" => 30,        "item3" => 100,        "item4" => 300,        "item5" => 1000    );     // массив пар код ошибки => описание    private static $errors = array(        1 => "UNKNOWN: please, try again later. If error repeats, contact application support team.",        2 => "SERVICE: service temporary unavailible. Please try again later",        3 => "CALLBACK_INVALID_PAYMENT: invalid payment data. Please try again later. If error repeats, contact application support team. ",        9999 => "SYSTEM: critical system error. Please contact application support team.",        104 => "PARAM_SIGNATURE: invalid signature. Please contact application support team."    );     // функция рассчитывает подпись для пришедшего запроса    // подробнее про алгоритм расчета подписи можно посмотреть в документации (http://apiok.ru/wiki/pages/viewpage.action?pageId=42476522)    public static function calcSignature($request){        $tmp = $request;        unset($tmp["sig"]);        ksort($tmp);        $resstr = "";        foreach($tmp as $key=>$value){            $resstr = $resstr.$key."=".$value;        }        $resstr = $resstr.self::APP_SECRET_KEY;        return md5($resstr);    }     // функция провкерки корректности платежа    public static function checkPayment($productCode, $price){        if (array_key_exists($productCode, self::$catalog) && (self::$catalog[$productCode] == $price)) {            return true;        } else {            return false;        }    }     // функция возвращает ответ на сервер одноклассников    // о корректном платеже    public static function returnPaymentOK(){        $rootElement = 'callbacks_payment_response';         $dom = self::createXMLWithRoot($rootElement);        $root = $dom->getElementsByTagName($rootElement)->item(0);         // добавление текста "true" в тег <callbacks_payment_response>        $root->appendChild($dom->createTextNode('true'));         // генерация xml        $dom->formatOutput = true;        $rezString = $dom->saveXML();         // установка заголовка        header('Content-Type: application/xml');        // вывод xml        print $rezString;    }     // функция возвращает ответ на сервер одноклассников    // об ошибочном платеже и информацию лб ошибке    public static function returnPaymentError($errorCode){        $rootElement = 'ns2:error_response';         $dom = self::createXMLWithRoot($rootElement);        $root = $dom->getElementsByTagName($rootElement)->item(0);        // добавление кода ошибки и описания ошибки        $el = $dom->createElement('error_code');        $el->appendChild($dom->createTextNode($errorCode));        $root->appendChild($el);        if (array_key_exists($errorCode, self::$errors)){            $el = $dom->createElement('error_msg');            $el->appendChild($dom->createTextNode(self::$errors[$errorCode]));            $root->appendChild($el);        }         // генерация xml        $dom->formatOutput = true;        $rezString = $dom->saveXML();         // добавление необходимых заголовков        header('Content-Type: application/xml');        // ВАЖНО: если не добавить этот заголовок, система может некорректно обработать ответ        header('invocation-error:'.$errorCode);        // вывод xml        print $rezString;    }     // Рекомендуется хранить информацию обо всех транзакциях    public static function saveTransaction($order_id, $user_id, $product_code){          /**         *         * Здесь операции по сохранению данных в вашу БД         *         *         *         */      }     // функция создает объект DomDocument и добавляет в него в качестве корневого тега $root    private static function createXMLWithRoot($root){        // создание xml документа        $dom = new DomDocument('1.0');        // добавление корневого тега        $root = $dom->appendChild($dom->createElement($root));        $attr = $dom->createAttribute("xmlns:ns2");        $attr->value = "http://api.forticom.com/1.0/";        $root->appendChild($attr);        return $dom;    } }   /** * * Обработка платежа * * */if (array_key_exists("product_code", $_GET) && array_key_exists("amount", $_GET) && array_key_exists("sig", $_GET)){    if (Payment::checkPayment($_GET["product_code"], $_GET["amount"])){        if ($_GET["sig"] == Payment::calcSignature($_GET)){             /**             * Платеж прошел             *             */             Payment::saveTransaction($_GET["transaction_id"], $_GET["uid"], $_GET["product_code"]); // сохранить данные в БД            Payment::returnPaymentOK(); // ответить серверу приложений Одноклассников        } else {            // здесь можно что-нибудь сделать, если подпись неверная            Payment::returnPaymentError(Payment::ERROR_TYPE_PARAM_SIGNATURE);        }    } else {        // здесь можно что-нибудь сделать, если информация о покупке некорректна        Payment::returnPaymentError(Payment::ERROR_TYPE_CALLBACK_INVALID_PYMENT);    }} else {    // здесь можно что-нибудь сделать, если информация о покупке или подпись отсутствуют в запросе    Payment::returnPaymentError(Payment::ERROR_TYPE_CALLBACK_INVALID_PYMENT);}?> 
Ответить