Страница 1 из 5

Работа с Payments API.(as3,php)

Добавлено: 31 окт 2012, 23:29
112
Пример использования Payments API
ActionScript 3.0 (Adobe Flash CS5)

Понадобится свой сервер с поддержкой php и cURL.


Некоторым сложно разобраться с пошаговым руководством по Payments Api. В этом уроке, вы узнаете как можно принимать платежи в флэш приложении.

1. Создаём Новый документ Flash File (ActionScript 3.0)
Добавляем на сцену текстовое поле и называем его result_tf.
И кнопку votes_er.

2. Скачиваем APIConnection.zip
http://vkontakte.ru/source/APIConnection.zip
Папку vk из архива vk_api_connection\src\ кладем в папку с сохраненным fla.

3. Пишем код в приложении
Заходим в первый кадр
 Как найти кадр
Изображение
И пишем код

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

 import flash.display.Sprite;import flash.events.*;import vk.APIConnection;import vk.events.*; //Переменные              var api_id:Number;             var viewer_id:Number;             var sid:String;             var secret:String;//Заполняем переменные данными var flashVars:Object = stage.loaderInfo.parameters as Object;api_id = flashVars['api_id'];viewer_id = flashVars['viewer_id'];sid = flashVars['sid'];secret = flashVars['secret']; var VK:APIConnection = new APIConnection(flashVars);VK.api('getProfiles', { uids: flashVars['viewer_id']}, onProfileLoaded, onError);//Узнаем имя и фамилию пользователя       function onProfileLoaded(data: Object):void{result_tf.text ='Привет ' + data[0]['first_name'] + ' ' + data[0]['last_name'] + ' ,это тестовое приложение в котором показан пример работы с payments Api';}//добавляем три слушателя событииVK.addEventListener('onOrderSuccess', onSuccess); //если все прошло удачноVK.addEventListener('onOrderCancel', onCanc); //если пользователь отменил передачуVK.addEventListener('onOrderFail', onError); //если произошла ошибка            votes_er.addEventListener(MouseEvent.CLICK, function(event:MouseEvent) { //надатие на кнопкуVK.callMethod('showOrderBox', { type:'item',item:'item1'});//вызов окна перевода голосов ;type:'item' - окно покупки товара(возможно также окно вызова офферов или окно пополнения голосов),item:'item1'- номер товара})//три функции ,которые срабатывают при ://удачнои покупки        function onSuccess(data: Object):void        {            result_tf.text = "Голоса переведены";        }//при отмене               function onCanc(data: Object):void        {            result_tf.text = "Вы отменили перевод";        }//при ошибке         function onError(data: Object):void        {            result_tf.text = data.error_msg;        }  
4. Загружаем приложение в контакт
Приложение должно быть включено.
Без использования контейнера.

5. Подготовка серверной части к обработке платежных уведомлений
Надо реализовать обработку уведомлений от платежной системы ВКонтакте.А именно:
-Получение информации о товаре. ВКонтакте запрашивает информацию о товаре для его отображения в диалоге покупки.
-Изменение статуса заказа. В параметрах уведомления передается новый статус заказа. При статусе заказа chargeable необходимо оформить товар пользователю внутри приложения.

Вконтакте также дает пример обработчика уведомлений на языке PHP.
Им мы и воспользуемся.Я его немного изменил.

Так же нам понадобится создать пустой файл,который будет лежать в папке вместе с этим скриптом, назовем его file.txt
В него будут записываться id плательщика и id покупки.

Создадим скрипт ,который и будет указываться как адрес обратного вызова,ниже написано содержание этого скрипта

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

<?php header("Content-Type: application/json; encoding=utf-8");  $secret_key = ''; // Защищенный ключ приложения  $input = $_POST;  // Проверка подписи $sig = $input['sig']; unset($input['sig']); ksort($input); $str = ''; foreach ($input as $k => $v) {   $str .= $k.'='.$v; }  if ($sig != md5($str.$secret_key)) {   $response['error'] = array(     'error_code' => 10,     'error_msg' => 'Несовпадение вычисленной и переданной подписи запроса.',     'critical' => true   ); } else {   // Подпись правильная   switch ($input['notification_type']) {     case 'get_item':       // Получение информации о товаре       $item = $input['item']; // наименование товара  if ($item == 'item1') {         $response['response'] = array(           'item_id' => 1, //id товара          'title' => '10 монеток', //наименование          'photo_url' => '', //фотография товара,если оставить поле пустым,то будет выведена иконка приложения          'price' => 1 //цена товара в голосах        );       }       break;  case 'get_item_test':       // Получение информации о товаре в тестовом режиме       $item = $input['item'];       if ($item == 'item1') {         $response['response'] = array(           'item_id' => 1, //id товара          'title' => '10 монеток(test mode)', //наименование          'photo_url' => '', //фотография товара,если оставить поле пустым,то будет выведена иконка приложения          'price' => 1 //цена товара в голосах        );       }      break;  case 'order_status_change':       // Изменение статуса заказа       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']);         $user_id  = intval($input['user_id']);// Код проверки товара, включая его стоимость  //Вконтакте может несколько раз отправлять уведомления типа Изменения статуса заказа //(с тем же order_id) и ответ должен в точности повторять ответ для исходного уведомления.  $handle = fopen("file.txt","a+"); // ОТкрываем фаил,чтобы записать туда ид плтельщика и ид покупкиfwrite($handle,"\n".user_id."\n".$order_id); // Записываемfclose($handle); // Закрываем фаил  $response['response'] = array(           'order_id' => $order_id,         );       } else {         $response['error'] = array(           'error_code' => 100,           'error_msg' => 'Передано непонятно что вместо chargeable.',           'critical' => true         );       }       break;  case 'order_status_change_test':       // Изменение статуса заказа в тестовом режиме       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']);         $user_id  = intval($input['user_id']); $handle = fopen("file.txt","a+"); // ОТкрываем фаил,чтобы записать туда ид плтельщика и ид покупкиfwrite($handle,"\n".$user_id."\n".$order_id); // Записываемfclose($handle); // Закрываем фаил $response['response'] = array(           'order_id' => $order_id,         );       } else {         $response['error'] = array(           'error_code' => 100,           'error_msg' => 'Передано непонятно что вместо chargeable.',           'critical' => true         );       }       break;   } }  echo json_encode($response); ?> 
Теперь необходимо указать в пункте Адрес обратного вызова(Вкладка платежи)
Ссылку на скрипт который у вас получился.

6. Тестирование приложения
Если у ваше приложение не проверено ,то платежи могут проходить только в тестовом режиме .
Для этого в Пункте Тестеры платежей выберите себя.
Как таковые голоса переводится не будут.Вы сможете только посмотреть то, что у вас получилось.

Если же ваше приложение прошло проверку,то пользователи смогут пополнять баланс приложения.

Исходник

Наверно это и все.
Задавайте вопросы ,буду пробовать на них отвечать

Re: Работа с Payments API.(as3,php)

Добавлено: 01 ноя 2012, 16:46
Abarmotina
:) Спасибо

Re: Работа с Payments API.(as3,php)

Добавлено: 12 ноя 2012, 16:11
agni
скорее всего - очевидно, :D но всё таки спрошу:
этот урок с учетом "Обновлённого платежного API для приложений"? который полностью заменил с 31 октября работу с голосами в приложении?
http://vk.com/topic-1_27042222

Re: Работа с Payments API.(as3,php)

Добавлено: 12 ноя 2012, 17:39
112
agni
Да,это и есть тот самый урок по новому платежному API

Re: Работа с Payments API.(as3,php)

Добавлено: 13 ноя 2012, 22:25
catamount5
Добрый день!
У меня есть несколько вопросов.
Здорово, что вы создаете file.txt и записываете в него id плательщика и id покупки. А если покупки будут следовать одни за другими одновременно от разных пользователей, и все они будут перезаписываться в файл file.txt? И смысл этого файла, если вы туда только записываете, а от туда ничего не считываете? Если я что-то недопонимаю, то буду признательна за объяснение.

Скачала исходник, в файле payment указала защищенный ключ приложения, выложила 2 файла на сервер, в контакте поменяла ссылку, загрузила приложение вконтакт - и не работает :(

И почему Вы не дописали код в APIConnection.as ?

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

В своем коде, который сделала на основе прочитанного вконтакте, не понятно одно. В тестовом режиме: вот у меня 3 голоса, пытаюсь списать 5. Пишет - списалось успешно! Бред какой-то.

Re: Работа с Payments API.(as3,php)

Добавлено: 13 ноя 2012, 23:44
112
catamount5 писал(а): Здорово, что вы создаете file.txt и записываете в него id плательщика и id покупки. А если покупки будут следовать одни за другими одновременно от разных пользователей, и все они будут перезаписываться в файл file.txt? И смысл этого файла, если вы туда только записываете, а от туда ничего не считываете? Если я что-то недопонимаю, то буду признательна за объяснение.
Это всего лишь урок в котором показан Пример использования Payments API.Цель была показать как данный метод работает вообщем.Чтобы данные метод работал ,не надо больше ничего считывать.
Если вы хотите оттуда что-то считывать ,то лучше вообще записывать id юзера и заказа в бд ,а не в текстовый файл :)
catamount5 писал(а):А дополнительные методы проверки статуса заказа? http://vk.com/developers.php?oid=-1&p=% ... yments_API Они нужны как таковые?
Это скорее как дополнительные методы.Как таковые они не обязательны.
catamount5 писал(а): В своем коде, который сделала на основе прочитанного вконтакте, не понятно одно. В тестовом режиме: вот у меня 3 голоса, пытаюсь списать 5. Пишет - списалось успешно! Бред какой-то.
У вас на счету в реале 3 голоса ,а в тестовом режиме пытаетесь списать 5 и все списывается(т.е пишет об успешном списывание голосов),а на самом деле вообще ничего не списалось в т.ч и те 3 голоса которые у вас были,так я понял?Если да ,то у меня также ,это ж тестовый режим :)

Re: Работа с Payments API.(as3,php)

Добавлено: 16 ноя 2012, 10:20
javist
Добрый день,112!
Почему то в окне диалога оплаты в тестовом режиме, если делать подтверждение оплаты/отмену с первого раза отрабатывает не корректно, только со второго.
Например, при первом подтверждении отрабатывает onOrderCancel(в логе платежных уведомлений ответ приходит корректный), при повторном, корректно отрабатывает onOrderSuccess. Скрипт и вызов уведомлений не менялись и раньше корректно отрабатывало с первого раза.
У Вас были подобные проблемы? Писал админам VK, но они пока молчат.:(

Re: Работа с Payments API.(as3,php)

Добавлено: 16 ноя 2012, 23:10
112
javist
Здравствуйте.Когда приложение еще было в тестовом режиме у себя таких проблем не замечал.

Re: Работа с Payments API.(as3,php)

Добавлено: 19 ноя 2012, 11:12
javist
Ясно. Спасибо. Буду пытать админов дальше.

Re: Работа с Payments API.(as3,php)

Добавлено: 20 ноя 2012, 15:25
XELAD
Представим ситуацию, что это всё связано с БД, в №1 будут вноситься заказы, в №2 (там, где сохранение игроков) будут изменено кол-во монет на счету.
Как я понимаю:
1) Новую запись в БД №1 нужно создавать при case 'get_item'
- Внести user_id, item, order_id, а также app_order_id в виде счетчика. ПЛЮС одна графа, где мы укажем, сколько уведомлений пришло от ВК (подробности ниже), сейчас укажем ноль.
2) При case 'order_status_change' найти в БД №1 строку с теми же user_id, item, order_id....
Вспоминаем, что ВК может несколько раз отправлять уведомления типа Изменения статуса заказа с тем же order_id, смотрим на счетчик в той самой графе. И только если он равен нулю, прибавляем монеток в БД №2! И увеличиваем счетчик в той графе.
Всё это сделано, чтобы при каждом таком уведомлении от ВК, монеты не прибавлялись.
А если мы не находим такую запись в БД №1, то выдаем критическую ошибку.
3) В самом flash получаем событие onOrderSuccess, и загружаем данные пользователя из БД №2 для получения актуальной информации.

Поправьте меня, если я не прав, и если всё намного проще :)