BitcoinTalk.com

    • Зарегистрироваться
    • Войти
    • Поиск
    • Категории
    • Непрочитанные
    • Последние
    • Метки
    • Популярные
    • Пользователи
    • Группы
    • Админка

    Пишем "страницу поддержки" с Бесплатной оплатой Биткоинами

    Технологии, безопасность и программирование
    биткоин bitcoin программирование криптовалюта прием платежей
    1
    1
    1442
    Загружаем больше сообщений
    • Сначала старые
    • Сначала новые
    • По количеству голосов
    Ответить
    • Ответить, создав новую тему
    Авторизуйтесь, чтобы ответить
    Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
    • apirone.com
      apirone.com Заблокирован отредактировано

      Слово "пожертвование" не всегда вызывает положительные эмоции, ведь оно происходит от слова "жертвовать" или “пожертвовать” чем либо.

      Выражение "поддержать", "помочь" или "стать частью" гораздо благозвучнее и приятнее. Особенно если в ответ плательщик получает рекламную ссылку или рекламное упоминание о себе.
      Яркий пример, это Patreon на сайте https://coin.dance/. Но было бы интереснее продавать не одинаковые размеры логотипов, а всю рекламную площадь, в зависимости от суммы оплаты. Скажем квадрат 1х1 стоит 10.000 Сатоши. Кому то хватит реферального пикселя для поисковика, а кто то захочет большой анимированный логотип.

      alt text

      Итак, приступаем.

      В своих проектах, вы можете не только принимать, но и полностью управлять кошельком, создавать выплаты по API запросу.
      Тариф простой:
      Все входящие транзакции абсолютно БЕСПЛАТНЫ!
      Фиксированная комиссия 0.0002 BTC ($0.8) за исходящую транзакцию на сумму более 0.001 BTC.
      Микро-выплаты менее 100.000 Сатоши также бесплатны. Все входящие транзакции обрабатываются Бесплатно, а значит это идеально подходит для сбора платежей.

      Для начала создаем Накопительный (saving) кошелек, отправляем JSON запрос на эндпоинт https://apirone.com/api/v2/btc/wallet

      В ответ получаем
      { "wallet": "8133edaa7e1c8040963159b2ef8b2d30", "type": "saving", "transfer_key": "sfZ4MmnfhXNb1RiLh7jqnFW2eZmdsYt9", "currency": "btc" }

      wallet - это кошелек, на который мы будем собирать платежи и им управлять.
      transfer_key - ключ, с помощью которого делаем выплаты по API

      Пример PHP кода:

      <?php
        $json_data = array ( 'type' => "saving" );
        
        $api_endpoint = "https://apirone.com/api/v2/btc/wallet";
       
        $curl = curl_init($api_endpoint);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json_data));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $response = curl_exec($curl);
        $http_status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        curl_close($curl);
      
        if ($http_status_code==200){
        $decoded = json_decode($response, true);
        echo "Wallet: " . $decoded["wallet"] . "<BR>";
        echo "Key: " . $decoded["transfer_key"];
        } else {
            var_dump($response);
        }
      ?>
      

      База данных будет максимально проста и оптимизирована. В единственную таблицу мы будем записывать только оплаченные URL, ссылку на логотип и сумму с количеством подтверждений сети.

      CREATE TABLE `supporters` (
        `id` int(11) NOT NULL,
        `address` varchar(34) NOT NULL,
        `logo` varchar(250) NOT NULL,
        `link` varchar(250) NOT NULL,
        `amount` int(11) NOT NULL,
        `confirmations` tinyint(4) NOT NULL,
        `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE 		CURRENT_TIMESTAMP
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
      
      -- Индексы таблицы `supporters`
      ALTER TABLE `supporters`  ADD PRIMARY KEY (`id`);
      
      -- AUTO_INCREMENT для таблицы `supporters`
      ALTER TABLE `supporters`  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
      COMMIT;
      

      alt text
      На странице оплаты нам потребуется форма с двумя текстовыми полями URL, link to logo. По нажатию на кнопку сабмит, оба этих поля и ссылку для получения колбэка, отправляем в JSON запросе на API эндпоинт.

      https://apirone.com/api/v2/btc/wallet/<WalletID>/address

      <WalletID> - это тот идентификатор кошелька который мы получили в первом запросе.
      'secret' - какой то секретный код, для защиты нашего приложения. Мы будем его сверять на странице колбэка.

      <?php
        $json_data = array (
          "callback" => array(
              'url'=> 'http://example.com/callback',
             'data' => array (
              'secret' => "abrakadabra",
              'url' => "https://bits.media/",
              'logo' => "https://bits.media/local/templates/bits.media/images/bits3.png"
              )
          )
        );
      
        $wallet = "8133edaa7e1c8040963159b2ef8b2d30";
        $api_base = "https://apirone.com/api/v2/btc/wallet/". $wallet ."/address";
      
       $curl = curl_init($api_base);
        curl_setopt($curl, CURLOPT_HTTPHEADER, array("Content-Type: application/json"));
        curl_setopt($curl, CURLOPT_POST, 1);
        curl_setopt($curl, CURLOPT_POSTFIELDS, json_encode($json_data));
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
        $http_status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE);
        $response = curl_exec($curl);
        curl_close($curl);
      
      	  $decoded = json_decode($response, true);
      	  echo "Please send the payment to the following bitcoin address: " .
      	  $decoded["address"];
      	?>
      

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

      Для удобства оплаты выводим QR код, с помощью АПИ:
      https://apirone.com/ru/docs/get-qr-code

      Обработка колбэка. Callback.php

      alt text
      Страница колбэка нужна для обработки данных от платежного сервиса. Apirone передает адрес на который поступил платеж, сумму, транзакцию, количество подтверждений и данные которые предоставленные пользователем: secret, url, logo. Данные передаются POST запросом в формате JSON, так удобнее и безопаснее.

      <?php
      $secret = "abrakadabra";
      
      //receive JSON data
      $data = file_get_contents('php://input');
      
      if ($data) {
          $params = json_decode($data, true);
      
      // проверяем наш секретный код
      if ($params["data"]["secret"] !== $secret) die();
      
      $url = $params["data"]["url"];
      $logo = $params["data"]["logo"];
      $input_address = $params["input_address"];
      $value_in_satoshi = $params["value"];
      
      //Save unconfirmed transaction and data to your Database.
      if ($params["confirmations"] == 0) {
      
      	// записываем URL и LOGO в базу данных
      	
      }
      
      if ($params["confirmations"] >= 3) {
      	
      	// обновляем количество конфирмов в базе данных
      	// по завершению сделки, сообщаем серверу *ok*
      	
      	echo "*ok*";
      	}
      }
      ?>
      

      Оплату за донаты от доверительных плательщиков, можно принимать по нулевому подтверждению Биткоин сети. Но если вы продаете что то дорогое и значимое, мы рекомендуем завершать сделку по 2-3 подтверждениям сети.
      После завершения оплаты, в ответ серверу сообщаем ok. После этого колбэки по оплате прекращаются.

      Завершение оплаты и размещение логотипа

      alt text
      Чтобы показать клиенту о проведенной оплате, мы должны её периодически проверять. Мы будем проверять её в созданной таблице. Ведь как только платежный сервер сделает колбэк, у нас сохраняется сгенерированный адрес и ссылки в БД. С помощью Ajax JQuery запроса с периодичностью в 3 секунды, проверяем оплату в БД по идентификатору - сгенерированному биткоин адресу. Как альтернатива, можно проверять транзакцию напрямую в блокчейне, например через blockchain.info или любой другой открытый API или открытая подписка по сокету.
      Именно поэтому все входящие платежи должны быть бесплатными, а не брать за это процент. Транзакции всегда можно проверить в блокчейне.

      Как только мы нашли транзакцию, пишем плательщику что оплата прошла успешно и перезагружаем страницу. Теперь его логотип со ссылкой будет на сайте. Размер логотипа = сумма оплаты / 10000 Сатоши.

      Отладка

      Чтобы проверить работу колбэка без оплаты, достаточно его эмулировать cURL запросом:

       curl -X POST -H "Content-type: application/json" -d '{
        "data":
        {"url": "https://bits.media/", "logo": 	"https://bits.media/local/templates/bits.media/images/bits3.png", "secret": "abrakadabra"},
        "input_address": "1E2VSRsaW3Kb1gDkdRUGDo6knAKfi9iYsb",
        "confirmations": 0,
        "input_transaction_hash": 	"4a5e1e4baab89f3a32518a88c31bc87f618f76673e2cc77ab2127b7afdeda33b",
        "value" : 100000000
      }' -i http://example.com/callback.php
      

      http://example.com - замените на свой ресурс.

      Так мы отправляем запрос с "data" - данными пользователя и информацию о транзакции в формате JSON.
      Вы можете поменять секретный код, ссылки, количество подтверждений, сумму и увидеть, что на это отвечает страница callback.php.

      Заключение

      Предложенный код, вы можете использовать и модифицировать как угодно. Например выставлять логотипы одного размера, а сумма оплаты это время размещения в минутах. Или сумма это занимаемая площадь, а может даже клетка на шахматной доске или приоритет в списке. Как вам будет угодно.

      GitHub: https://github.com/Apirone/supporter
      Документация по разворачиванию проекта: https://apirone.com/ru/integrations/become-a-supporter
      Рабочий пример: https://allprivatekeys.com/become-a-supporter.php
      Документация: https://apirone.com/ru/docs/wallet

      1 ответ Последний ответ Ответить Цитировать 0
      • Первое сообщение
        Последнее сообщение