Сделайте урок по новым платежам

Если вы хотите получить что-то готовое и бесплатно, то пишите в этом разделе.
mirstore.ru
Сообщения: 46
Зарегистрирован: 29 авг 2012, 14:09

Сделайте урок по новым платежам

Сообщение mirstore.ru »

Здравствуйте! Сделайте кому не сложно, урок по новой системе платежей. Я пробовал внедрить новую систему, но что-то не получается. Где-то что-то недопонимаю. Получается только списать голоса на счёт пользователя, а не приложения.
Emeltil
Сообщения: 298
Зарегистрирован: 26 мар 2011, 15:29

Re: Сделайте урок по новым платежам

Сообщение Emeltil »

+1
hahaha
Сообщения: 86
Зарегистрирован: 04 янв 2012, 14:52

Re: Сделайте урок по новым платежам

Сообщение hahaha »

+1
Serge
WEB Team
WEB Team
Сообщения: 520
Зарегистрирован: 04 мар 2011, 21:55

Re: Сделайте урок по новым платежам

Сообщение Serge »

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

<script language="JavaScript" type="text/javascript">function order(){    var params = {        type: 'votes', //Списание голосов в пользу приложения        votes: 10  //сумма голосов    };    VK.callMethod('showOrderBox', params);} $(document).ready(function(){    VK.init(function()    {        var parts=document.location.search.substr(1).split("&");        var flashVars={}, curr;        for (i=0; i<parts.length; i++)        {            curr = parts[i].split('=');            flashVars[curr[0]] = curr[1];        }        viewer_id = flashVars['viewer_id'];        auth_key = flashVars['auth_key'];    });     var callbacksResults = document.getElementById('callbacks');     VK.addCallback('onOrderSuccess', function(order_id)    {        callbacksResults.innerHTML += '<br />onOrderSuccess '+order_id;    });    VK.addCallback('onOrderFail', function()    {        callbacksResults.innerHTML += '<br />onOrderFail';    });    VK.addCallback('onOrderCancel', function()    {        callbacksResults.innerHTML += '<br />onOrderCancel';    });});</script>
Код взял чисто из ВК, не заморачивался на его счет.
Код для сервера также взял из ВК, добавил нужные функции (к примеру добавление предмета в базе при его покупке).
Тип votes можно менять на item, принцип не меняется, в ВК все описано.
Работает 100%, выводит запрос, при нажатии кнопки "Подтвердить" идет запрос на сервер, в случае положительного ответа от сервера - голоса уходят, как сделать уведомления об удачной покупке - думаю не нужно объяснять...
mirstore.ru
Сообщения: 46
Зарегистрирован: 29 авг 2012, 14:09

Re: Сделайте урок по новым платежам

Сообщение mirstore.ru »

а для флэша?
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Сделайте урок по новым платежам

Сообщение sanych_dv »

Для флэша практически все тоже самое, только вместо колбэков - слушатели:

Для API 2.0:

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

             var VK:APIConnection = new APIConnection(flashVars);            VK.forceDirectApiAccess(true); // ...       var params:Object = {      type: 'item',      item: "MyPaymentName",    };                                  try                {                   VK.callMethod("showOrderBox", params);                }                catch (errObject:Error)                {                    trace(errObject.message);                } // добавляем слушатели   VK.addEventListener('onOrderSuccess', onOrderSuccess);  VK.addEventListener('onOrderCancel', onOrderCancel);  VK.addEventListener('onOrderFail', onOrderFail); private function onOrderSuccess(e:CustomEvent): void { // смотрим колбэки в тестовом текстовом поле                     myDebugTextField.htmlText = "<p>onOrderSuccess: Order ID: " + e.params[0] + "</p>";                }                        private function onOrderCancel(e:CustomEvent): void {                    myDebugTextField.htmlText = "<p>onOrderCancel</p>";                }                            private function onOrderFail(e:CustomEvent): void {                    myDebugTextField.htmlText = "<p>onOrderFail: Error ID: " + e.params[0] + "</p>";                }  
В vk/APIConnection.as добавляем колбэки:

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

         private function onOrderSuccess(...params): void {      var paramsArr: Array = params as Array;      paramsArr.unshift('onOrderSuccess')      customEvent.apply(this, paramsArr);    }                private function onOrderFail(...params): void {      var paramsArr: Array = params as Array;      paramsArr.unshift('onOrderFail')      customEvent.apply(this, paramsArr);    }          private function onOrderCancel(...params): void {      var paramsArr: Array = params as Array;      paramsArr.unshift('onOrderCancel')      customEvent.apply(this, paramsArr);    } 


Очень большой минус и упущение в новых платежах вижу в том, что метод onOrderSuccess возвращает только Order ID, а должен возвращать объект с возможностью записи своих переменных. Теперь после обработки onOrderSuccess я вынужден дополнительно запрашивать из приложения необходимые мне измененные данные из БД.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Сделайте урок по новым платежам

Сообщение sanych_dv »

Далее, что выбрать в типе платежа: "item" (окно покупки товара в приложении) или "votes" (окно для ввода голосов на счёт приложения).

Если в приложении подразумевается единственный платеж, то вполне можно обойтись простым переводом голосов "votes".

Если в приложении несколько видов платежей с разным поведением приложения / изменением данных пользователя после совершения платежа, то в этом случае лучше использовать "item" (окно покупки товара в приложении).

В PHP в обработчике уведомлений удобно развести эти платежи через $item_id (как и показано в примере php-скрипта)

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

 if ($item == 'Payment_1') {         $response['response'] = array(           'item_id' => 1,           'title' => 'Платеж 1',           'photo_url' => '', // необязательный параметр          'price' => 3 // цена товара / услуги в голосах        );       } elseif ($item == 'Payment_2') {         $response['response'] = array(           'item_id' => 2,           'title' => 'Платеж 2',           'photo_url' => '', // необязательный параметр          'price' => 3  цена товара / услуги в голосах        );  

Важный момент - сначала callback.php получает информацию о товаре ( $input['notification_type'] = "get_item" ) и только потом поступает POST-запрос на изменение статуса заказа: ( $input['notification_type'] = "order_status_change" )

Соответственно, именно в блоке /* case 'order_status_change': */ после проверки списания голосов мы и производим необходимые нам действия (к примеру, с БД):

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

  // Изменение статуса заказа       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']); // А вот здесь нам и пригодится ранее объявленная переменная item_id для разных платежей:         $item_id = $input['item_id']; // разводим по значениям:                switch($item_id) {        case "1":         // здесь что-то происходит        break;        case "2":         // здесь что-то происходит        break;        }// ...  далее стандартно формируется ответ в формате JSON , как в примере обработчика // $response['response'] = array( ... и так далее} echo json_encode($response);  // Как правильно написал Александр, отследить ответы сервера можно в логе: $f = fopen('log.txt', 'a');fwrite($f, date('d.m.y H:i:s', time()).' '.json_encode($response). " POST: " . print_r($_POST, true) . PHP_EOL );fclose($f); 
Не забывайте сохранять скрипт обработчика в кодировке UTF-8 без BOM.
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Сделайте урок по новым платежам

Сообщение sanych_dv »

Далее: дополнительная проверка статуса заказа: http://vk.com/developers.php?oid=-1&p=% ... yments_API

Эти методы можно вызвать через URLLoader в слушателе onOrderSuccess() для дополнительной проверки заказа или отдельно (методы работают только с сервера).
site-eks
Сообщения: 20
Зарегистрирован: 23 мар 2012, 20:32

Re: Сделайте урок по новым платежам

Сообщение site-eks »

sanych_dv, пробую так проверить статус покупки после события onOrderSuccess. ответ не приходит,в лог ничего не пишет. as3 все правильно вроде, полагаю проблема в orders.getById

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

 <?php require('VkApi.class.php');  //$UserID = $_POST['UserID']; //$auth_key = $_POST['auth_key'];//$toPay=$_POST['toPay'];$app_id = '3045678'; $api_secret = 'fruedhertergteqertnwh';$order_id = $_POST['order_id'];  $real_key = md5($app_id."_".$UserID."_".$api_secret);  function get_url($query) {$ch = curl_init();curl_setopt($ch, CURLOPT_URL, $query);curl_setopt($ch, CURLOPT_HEADER, 0);curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);curl_setopt($ch, CURLOPT_TIMEOUT, 10);return curl_exec($ch);curl_close($ch);} $api = new VkApiNode($app_id, $api_secret);$query = $api->orders.getById($order_id);$status = new SimpleXMLElement(get_url($query)); $f = fopen('log.txt', 'a');fwrite($f, date('d.m.y H:i:s', time()).' '.json_encode($status). " POST: " . print_r($_POST, true) . PHP_EOL );fclose($f); echo (&status); ?>   
sanych_dv
Разработчик
Разработчик
Сообщения: 550
Зарегистрирован: 29 апр 2011, 01:52

Re: Сделайте урок по новым платежам

Сообщение sanych_dv »

site-eks

А так?

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

 require_once('vkapi.class.php'); $VK = new vkapi($api_id, $secret_key); $response = $VK->api('orders.getById', array('order_id' => $_POST['order_id'], 'test_mode' => 1 ) ); 
Ответить