Сделайте урок по новым платежам
-
- Сообщения: 46
- Зарегистрирован: 29 авг 2012, 14:09
Сделайте урок по новым платежам
Здравствуйте! Сделайте кому не сложно, урок по новой системе платежей. Я пробовал внедрить новую систему, но что-то не получается. Где-то что-то недопонимаю. Получается только списать голоса на счёт пользователя, а не приложения.
Re: Сделайте урок по новым платежам
Код: Выделить всё
<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%, выводит запрос, при нажатии кнопки "Подтвердить" идет запрос на сервер, в случае положительного ответа от сервера - голоса уходят, как сделать уведомления об удачной покупке - думаю не нужно объяснять...
-
- Сообщения: 46
- Зарегистрирован: 29 авг 2012, 14:09
Re: Сделайте урок по новым платежам
а для флэша?
Re: Сделайте урок по новым платежам
Для флэша практически все тоже самое, только вместо колбэков - слушатели:
Для API 2.0:
В vk/APIConnection.as добавляем колбэки:
Очень большой минус и упущение в новых платежах вижу в том, что метод onOrderSuccess возвращает только Order ID, а должен возвращать объект с возможностью записи своих переменных. Теперь после обработки onOrderSuccess я вынужден дополнительно запрашивать из приложения необходимые мне измененные данные из БД.
Для 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>"; }
Код: Выделить всё
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 я вынужден дополнительно запрашивать из приложения необходимые мне измененные данные из БД.
Re: Сделайте урок по новым платежам
Далее, что выбрать в типе платежа: "item" (окно покупки товара в приложении) или "votes" (окно для ввода голосов на счёт приложения).
Если в приложении подразумевается единственный платеж, то вполне можно обойтись простым переводом голосов "votes".
Если в приложении несколько видов платежей с разным поведением приложения / изменением данных пользователя после совершения платежа, то в этом случае лучше использовать "item" (окно покупки товара в приложении).
В PHP в обработчике уведомлений удобно развести эти платежи через $item_id (как и показано в примере php-скрипта)
Важный момент - сначала callback.php получает информацию о товаре ( $input['notification_type'] = "get_item" ) и только потом поступает POST-запрос на изменение статуса заказа: ( $input['notification_type'] = "order_status_change" )
Соответственно, именно в блоке /* case 'order_status_change': */ после проверки списания голосов мы и производим необходимые нам действия (к примеру, с БД):
Не забывайте сохранять скрипт обработчика в кодировке UTF-8 без BOM.
Если в приложении подразумевается единственный платеж, то вполне можно обойтись простым переводом голосов "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);
Re: Сделайте урок по новым платежам
Далее: дополнительная проверка статуса заказа: http://vk.com/developers.php?oid=-1&p=% ... yments_API
Эти методы можно вызвать через URLLoader в слушателе onOrderSuccess() для дополнительной проверки заказа или отдельно (методы работают только с сервера).
Эти методы можно вызвать через URLLoader в слушателе onOrderSuccess() для дополнительной проверки заказа или отдельно (методы работают только с сервера).
Re: Сделайте урок по новым платежам
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); ?>
Re: Сделайте урок по новым платежам
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 ) );