Полноценные пример работы Payments API

Если вы хотите получить что-то готовое и бесплатно, то пишите в этом разделе.
Fedya
Сообщения: 174
Зарегистрирован: 21 июл 2012, 19:56

Полноценные пример работы Payments API

Сообщение Fedya »

Здравствуйте, скиньте, пожалуйста, код, чтобы при нажатии на "Купить"
появлялось окно с переводом 1 голоса. + в базу перешло значение поля comment, при удачной операции.
Это iFrame приложение
Я делаю так
index.php

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

 <html><head>    <script src="http://vk.com/js/api/xd_connection.js" type="text/javascript"></script>    <link rel='stylesheet' type='text/css' href='css/main.css' />    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />    <script type='text/javascript' src='js/jquery.min.js'></script>    <script type="text/javascript" charset="utf8" >    window.onload = (function() {          VK.init(function() {              // узнаём flashVars, переданные приложению GET запросом. Сохраняем их в переменную flashVars            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];            }                        var viewer_id = flashVars['viewer_id'];            $('#uid').attr('value',viewer_id);            // получаем профиль            VK.api("users.get", {uids:viewer_id}, function(data) {                document.getElementById('info').innerHTML = '<b>' + data.response[0].first_name + ' ' + data.response[0].last_name + '</b>';            });                    });            });    $('#link_btn').click(function() {    VK.callMethod("showOrderBox",{type: 'item', item: 'add_link'});    });    </script></head><body> <div id='info'></div><form id='link' name='link' action=''>   <input value='ваш комментарий' type='text' name='comment'>   <a href='#' id='link_btn'>Купить</a></form> </body></html> 
out.php (кусок из документации)

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

 <?phpheader("Content-Type: application/json; encoding=utf-8");  $secret_key = '1111111111111'; // Защищенный ключ приложения  $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_test':       // Получение информации о товаре в тестовом режиме       $item = $input['item'];       if ($item == 'item1') {         $response['response'] = array(           'item_id' => 125,           'title' => '300 золотых монет (тестовый режим)',           'photo_url' => 'http://somesite/images/coin.jpg',           'price' => 5         );       } elseif ($item == 'item2') {         $response['response'] = array(           'item_id' => 127,           'title' => '500 золотых монет (тестовый режим)',           'photo_url' => 'http://somesite/images/coin.jpg',           'price' => 10         );       } else {         $response['error'] = array(           'error_code' => 20,           'error_msg' => 'Товара не существует.',           'critical' => true         );       }       break;  case 'order_status_change_test':       // Изменение статуса заказа в тестовом режиме       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']);  $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим.  $response['response'] = array(           'order_id' => $order_id,           'app_order_id' => $app_order_id,         );       } else {         $response['error'] = array(           'error_code' => 100,           'error_msg' => 'Передано непонятно что вместо chargeable.',           'critical' => true         );       }       break;   } }  echo json_encode($response); ?> 
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Полноценные пример работы Payments API

Сообщение Casperovskii »

Не до конца понял, зачем отправлять в базу комент, но вот код с оф.документации:

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

<script type="text/javascript">  function order() {    var params = {      type: 'item',      item: 'item_25new'    };    VK.callMethod('showOrderBox', params);  }   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>
Fedya
Сообщения: 174
Зарегистрирован: 21 июл 2012, 19:56

Re: Полноценные пример работы Payments API

Сообщение Fedya »

У меня приложении есть поле комментарий, пользователь должен заполнить его, потом оплатить, а потом , при удачной оплате, комментарий должен добавиться в бд,
да я видел этот код, я не понимаю куда его всунуть.
С простыми CallMethod у меня все получается, а с showOrderBox не врубаюсь, вот и прошу полный код (две странички) чтобы разобраться.
Fedya
Сообщения: 174
Зарегистрирован: 21 июл 2012, 19:56

Re: Полноценные пример работы Payments API

Сообщение Fedya »

Дам 3 голоса тому, кто готов объяснить и дать пример.
kahoxa
Сообщения: 59
Зарегистрирован: 10 фев 2012, 17:09

Re: Полноценные пример работы Payments API

Сообщение kahoxa »

вот моя страничка https://vk.com/stepa_shashkov
кто поможет подключить приложение к платежки голосов за 10?
Fedya
Сообщения: 174
Зарегистрирован: 21 июл 2012, 19:56

Re: Полноценные пример работы Payments API

Сообщение Fedya »

3 голоса мне не надо)) Вот, надеюсь поймете что зачем:
JavaScript

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

 /*** Сначала добавляем коллбек, который буден вызван, когда пользователь купит что-то за голоса**/VK.addCallback('onOrderSuccess', function(order_id){    alert("Платеж "+order_id+" успешно проведен");});/*** Вызываем метод showOrderBox чтобы открыл юзеру окно покупки товара* Ему передаем два параметра* type со значением item  - из документации: "item - окно покупки товара в приложении";* item со значением "gold" - это значение Вконтакт передаст нашему серверному скрипту на проверку.**/VK.callMethod('showOrderBox', { type:'item',item:'gold'}); 
Итак с JS все. Теперь в двух словах о том что делается.
После того, как из JS сделали запрос showOrderBox Вконтакт пошлет запрос на наш сервер к скрипту, который указан в настройках приложения. При этому вконтакт передаст ему значение, которое мы указали в свойстве item.
Твой скрипт должен проверить данные и передать вконтакту информацию о товаре, которую он покажет пользователю. А когда пользователь оплатит товар голосами, вконтакт сделает еще один запрос к скрипту, которым скажет
мол "все ок, пользователь платит" и скрипт твой должен ответить, что товар пользователю выдан, забирай у него голоса.
Ну ладно ближе к делу. Серверный скрипт:

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

<?php/** * Соединяем скрипт с БД */$dbserver = "localhost";$dbuser = "MyName";$dbpassword = "MyPassword";$dbname = "DataBaseName";mysql_connect($dbserver, $dbuser, $dbpassword) or die();mysql_select_db($dbname) or die();mysql_set_charset('utf8');/* -- *///Устанавливаем кодировкуheader("Content-Type: application/json; encoding=utf-8"); /**  * Проверяем подпись, что все ок, данные от вконтакта */$secret_key = 'reekj454l5kljkljlkkkkk'; //Секретный ключ приложения$input = $_POST; //Суем данные из $_POST в переменную $input$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': //Он прислал get_item значит просит информацию о товаре      $item = $input['item']; //Значение item которое прислал вконтакт, то которое посылали ему из JavaScript там было gold        if($item == "gold")        {             /**             * Значит если он прислал gold то все норм посылаем вконтакту в ответ             * item_id - ID должен быть свой для каждого продаваемого товара. Потом вконтакт его пришлет на проверку             * title - название             * price - цена в голосах             */            $response['response'] = array(                'item_id' => 1,                'title' => "100500 золотых",                'price' => 5            );        }         else //Иначе, если item не равен gold то возвращаем сообщение об ошибке        {            $response['error'] = array(                'error_code' => 20,                'error_msg' => 'Нет у меня такого товара',                'critical' => true            );        }      break;            case 'get_item_test': //Вконтакт прислал get_item_test значит просит инфу о товаре в тестовом режиме. По коду все тоже самое что и в рабочем режиме        $item = $input['item'];         if($item == "gold")        {             $response['response'] = array(                'item_id' => 1,                'title' => "100500 золотых",                'price' => 5            );        }         else        {            $response['error'] = array(                'error_code' => 20,                'error_msg' => 'Нет у меня такого товара',                'critical' => true            );        }      break;            case 'order_status_change': //Вконтакт прислал order_status_change то есть говорит, что статус заказа сменился        if ($input['status'] == 'chargeable') { //Проверяем статус, chargeable говорит, что все гуд, пользователь оплачивает            $order_id = intval($input['order_id']); //ID заказа вконтакте.                         /*             * Тут если ведется учет покупок, а он должен вестись, можно сделать запрос была ли такая покупка или еще нет чтобы не продублировать             * потому что вконтакт может прислать запрос с одним товаром несколько, если например из-за сбоя ему не придет ответ от сервера.             * Делаем запрос в таблицу orders             */             $result = mysql_query("SELECT orderid FROM orders WHERE orderid = ".$order_id);                         if(!mysql_num_rows($query)) // Такого заказа еще не было, надо добавить пользователю золотых или там еще чего            {                /**                 * Добавляем в базу заказ                  * У меня здесь таблица orders имеет предположительно следущий вид:                 * orderid INT(11), userid INT(11)                 * в реальных условиях конечно стоит добавить еще время заказа, его стоимость и т.п.                 */                mysql_query("INSERT INTO orders VALUES('".(int)$order_id."', '".(int)$input['user_id']."')") or die();                $dataid = mysql_insert_id(); //ID заказа в приложении, здесь получается, что он совпадает с ID заказа Вконтакте, но вы можете сделать и по другому                if($input['item_id'] == 1) //Смотрим itemid это ID товара который посылали выше, когда вконтакт инфу о товаре просил, а посылали мы 1 что было ID товара 100500 золота                {                                        //Даем пользователю 100500 золота                    mysql_query("UPDATE users SET gold = gold + 100500 WHERE userid = ".$input['user_id']) or die();                    //Ну и формируем ответ вконтакту id заказа вконтакте и id заказа в приложении                    //Этот ответ говорит Вконтакту что все норм                    $response['response'] = array(                                'order_id' => $order_id,                                'app_order_id' => $dataid                    );                }                else //ID какой-то не тот пришел отвечаем вконтакту ошибкой                {                    $response['error'] = array(                        'error_code' => 20,                        'error_msg' => 'Не тот пришел ID',                        'critical' => true                    );                }            } else { //Такой товар уже обрабатывался, отправляем ответ такой же повторно                $response['response'] = array(                    'order_id' => $order_id,                    'app_order_id' => mysql_result($query, 0)                );            }        } else { //Пришел статус не chargeable отвечаем ошибкой            $response['error'] = array(                'error_code' => 100,                'error_msg' => 'В статусе джигурда какая-то пришла',                'critical' => true            );        }        break;    case 'order_status_change_test': //Вконтакт прислал order_status_change_test то есть говорит, что статус заказа в тестовом режиме сменился, здесь тоже самое что и в рабочем ранее        if ($input['status'] == 'chargeable') {            $order_id = intval($input['order_id']);            $result = mysql_query("SELECT orderid FROM orders WHERE orderid = ".$order_id);            if(!mysql_num_rows($query))            {                mysql_query("INSERT INTO orders VALUES('".(int)$order_id."', '".(int)$input['user_id']."')") or die();                $dataid = mysql_insert_id();                if($input['item_id'] == 1)                {                    mysql_query("UPDATE users SET gold = gold + 100500 WHERE userid = ".$input['user_id']) or die();                    $response['response'] = array(                                'order_id' => $order_id,                                'app_order_id' => $dataid                    );                }                else                {                    $response['error'] = array(                        'error_code' => 20,                        'error_msg' => 'Не тот пришел ID',                        'critical' => true                    );                }            } else {                 $response['response'] = array(                    'order_id' => $order_id,                    'app_order_id' => mysql_result($query, 0)                );            }        } else {            $response['error'] = array(                'error_code' => 100,                'error_msg' => 'В статусе джигурда какая-то пришла',                'critical' => true            );        }        break;    }}echo json_encode($response); //Ну и выводим на экран ответ вконтакту?>
Стоит учесть что ID заказов в тестовом и в рабочем режиме могут пересекаться, поэтому, если оставлять как в этом скрипте (ID заказа вконтакте == ID заказа в приложении) то после тестов нужно будет удалить все записи из таблицы orders.

Ну вот вроде как-то так...
Там в коде серверного скрипта в двух местах замените

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

 mysql_result($query, 0)
на

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

 mysql_result($result, 0)
По привычке имена переменных написал)))
Fedya
Сообщения: 174
Зарегистрирован: 21 июл 2012, 19:56

Re: Полноценные пример работы Payments API

Сообщение Fedya »

kahoxa писал(а):вот моя страничка https://vk.com/stepa_shashkov
кто поможет подключить приложение к платежки голосов за 10?
Теперь я могу :)
kahoxa
Сообщения: 59
Зарегистрирован: 10 фев 2012, 17:09

Re: Полноценные пример работы Payments API

Сообщение kahoxa »

Fedya писал(а):
kahoxa писал(а):вот моя страничка https://vk.com/stepa_shashkov
кто поможет подключить приложение к платежки голосов за 10?
Теперь я могу :)
напиши мне в вк на всякий)

Смотрите что не так делаю?
JS вызова окна покупки:

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

<div id='callbacks' onClick=order() style='width:50;height:10; border: solid 1px black;'>кнопка</div><script type="text/javascript">  function order() {    VK.callMethod('showOrderBox', {type:'item',item:'get_item',title:'ssss'});  }   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>
и php тот что callback взят с примера, только с моим ключом:

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

<?phpheader("Content-Type: application/json; encoding=windows-1251"); $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' => 25,           'title' => '300 золотых монет',           'photo_url' => 'http://somesite/images/coin.jpg',           'price' => 5         );       } elseif ($item == 'item2') {         $response['response'] = array(           'item_id' => 27,           'title' => '500 золотых монет',           'photo_url' => 'http://somesite/images/coin.jpg',           'price' => 10         );       } else {         $response['error'] = array(           'error_code' => 20,           'error_msg' => 'Товара не существует.',           'critical' => true         );       }       break;  case 'get_item_test':       // Получение информации о товаре в тестовом режиме       $item = $input['item'];       if ($item == 'item1') {         $response['response'] = array(           'item_id' => 125,           'title' => '300 золотых монет (тестовый режим)',           'photo_url' => 'http://somesite/images/coin.jpg',           'price' => 5         );       } elseif ($item == 'item2') {         $response['response'] = array(           'item_id' => 127,           'title' => '500 золотых монет (тестовый режим)',           'photo_url' => 'http://somesite/images/coin.jpg',           'price' => 10         );       } else {         $response['error'] = array(           'error_code' => 20,           'error_msg' => 'Товара не существует.',           'critical' => true         );       }       break;  case 'order_status_change':       // Изменение статуса заказа       if ($input['status'] == 'chargeable') {         $order_id = intval($input['order_id']);  // Код проверки товара, включая его стоимость         $app_order_id = 1; // Получающийся у вас идентификатор заказа.  $response['response'] = array(           'order_id' => $order_id,           'app_order_id' => $app_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']);  $app_order_id = 1; // Тут фактического заказа может не быть - тестовый режим.  $response['response'] = array(           'order_id' => $order_id,           'app_order_id' => $app_order_id,         );       } else {         $response['error'] = array(           'error_code' => 100,           'error_msg' => 'Передано непонятно что вместо chargeable.',           'critical' => true         );       }       break;   } }  echo json_encode($response); ?> 
приложение одобрено, в логах респонс не чего не возвращает.

я не знаю, может еще что-то нужно кроме этого?
Casperovskii
Сообщения: 429
Зарегистрирован: 22 июн 2012, 17:50

Re: Полноценные пример работы Payments API

Сообщение Casperovskii »

А не смущает, что подпись к предмету передаешь get_item, а на сервере такой нет? Надо item1:
VK.callMethod("showOrderBox", { type: 'item', item: 'item1' } );
kahoxa
Сообщения: 59
Зарегистрирован: 10 фев 2012, 17:09

Re: Полноценные пример работы Payments API

Сообщение kahoxa »

Исправил, теперь в окне пишет, ошибка доступа(
Ответить