Coinpayments и yii2 (оплата на сайте)

117
05 февраля 2021, 19:00

Мне нужна оплата через сайт coinpayment. Я сделал контроллер на формирование платежа. Все нормально работает, перекидывает на страницу с оплатой. Вопрос, как мне получить ответ, что средства были зачислены? Вот контроллер:

public function actionPayments($summa, $id){
    if(\Yii::$app->user->isGuest) {
        throw new \yii\web\HttpException(404, Yii::t('common', 'You are not authorized to view.'));
    }else {
        $u = Users::findOne($id);
        $cps = new CoinPaymentsAPI();
        $cps->Setup($u->private_key, $u->public_key);
        $result = $cps->CreateTransactionSimple($summa, 'USD', 'BTC', $u->username, '', 'ipn_url');
        if ($result['error'] == 'ok') {
            $le = php_sapi_name() == 'cli' ? "\n" : '<br />';
            return $this->redirect($result['result']['status_url'] . $le);
        } else {
            print 'Error: ' . $result['error'] . "\n";
        }
    }
}

Вот исходник откуда брал:

<?php
/*
CoinPayments.net API Example
Copyright 2014 CoinPayments.net. All rights reserved.   
License: GPLv2 - http://www.gnu.org/licenses/gpl-2.0.txt
*/
require('./coinpayments.inc.php');
$cps = new CoinPaymentsAPI();
$cps->Setup('Your_Private_Key', 'Your_Public_Key');
$result = $cps->GetBalances();
if ($result['error'] == 'ok') {
    print 'Coins returned: '.count($result['result'])."\n";
    $le = php_sapi_name() == 'cli' ? "\n" : '<br />';
    foreach ($result['result'] as $coin => $bal) {
        print $coin.': '.sprintf('%.08f', $bal['balancef']).$le;
    }
} else {
    print 'Error: '.$result['error']."\n";
}

coinpayments.inc.php

class CoinPaymentsAPI {
private $private_key = '';
private $public_key = '';
private $ch = null;
public function Setup($private_key, $public_key) {
    $this->private_key = $private_key;
    $this->public_key = $public_key;
    $this->ch = null;
}
/**
 * Gets the current CoinPayments.net exchange rate. Output includes both crypto and fiat currencies.
 * @param short If short == TRUE (the default), the output won't include the currency names and confirms needed to save bandwidth.
 */
public function GetRates($short = TRUE) {
    $short = $short ? 1:0;
    return $this->api_call('rates', array('short' => $short));
}
/**
 * Gets your current coin balances (only includes coins with a balance unless all = TRUE).<br />
 * @param all If all = TRUE then it will return all coins, even those with a 0 balance.
 */
public function GetBalances($all = FALSE) {     
    return $this->api_call('balances', array('all' => $all ? 1:0));
}
/**
 * Creates a basic transaction with minimal parameters.<br />
 * See CreateTransaction for more advanced features.
 * @param amount The amount of the transaction (floating point to 8 decimals).
 * @param currency1 The source currency (ie. USD), this is used to calculate the exchange rate for you.
 * @param currency2 The cryptocurrency of the transaction. currency1 and currency2 can be the same if you don't want any exchange rate conversion.
 * @param buyer_email Set the buyer's email so they can automatically claim refunds if there is an issue with their payment.
 * @param address Optionally set the payout address of the transaction. If address is empty then it will follow your payout settings for that coin.
 * @param ipn_url Optionally set an IPN handler to receive notices about this transaction. If ipn_url is empty then it will use the default IPN URL in your account.
 */
public function CreateTransactionSimple($amount, $currency1, $currency2, $buyer_email, $address='', $ipn_url='') {      
    $req = array(
        'amount' => $amount,
        'currency1' => $currency1,
        'currency2' => $currency2,
        'buyer_email' => $buyer_email,
        'address' => $address,
        'ipn_url' => $ipn_url,
    );
    return $this->api_call('create_transaction', $req);
}
public function CreateTransaction($req) {
    // See https://www.coinpayments.net/apidoc-create-transaction for parameters
    return $this->api_call('create_transaction', $req);
}
/**
 * Creates an address for receiving payments into your CoinPayments Wallet.<br />
 * @param currency The cryptocurrency to create a receiving address for.
 * @param ipn_url Optionally set an IPN handler to receive notices about this transaction. If ipn_url is empty then it will use the default IPN URL in your account.
 */
public function GetCallbackAddress($currency, $ipn_url = '') {      
    $req = array(
        'currency' => $currency,
        'ipn_url' => $ipn_url,
    );
    return $this->api_call('get_callback_address', $req);
}
/**
 * Creates a withdrawal from your account to a specified address.<br />
 * @param amount The amount of the transaction (floating point to 8 decimals).
 * @param currency The cryptocurrency to withdraw.
 * @param address The address to send the coins to.
 * @param auto_confirm If auto_confirm is TRUE, then the withdrawal will be performed without an email confirmation.
 * @param ipn_url Optionally set an IPN handler to receive notices about this transaction. If ipn_url is empty then it will use the default IPN URL in your account.
 */
public function CreateWithdrawal($amount, $currency, $address, $auto_confirm = FALSE, $ipn_url = '') {      
    $req = array(
        'amount' => $amount,
        'currency' => $currency,
        'address' => $address,
        'auto_confirm' => $auto_confirm ? 1:0,
        'ipn_url' => $ipn_url,
    );
    return $this->api_call('create_withdrawal', $req);
}
/**
 * Creates a transfer from your account to a specified merchant.<br />
 * @param amount The amount of the transaction (floating point to 8 decimals).
 * @param currency The cryptocurrency to withdraw.
 * @param merchant The merchant ID to send the coins to.
 * @param auto_confirm If auto_confirm is TRUE, then the transfer will be performed without an email confirmation.
 */
public function CreateTransfer($amount, $currency, $merchant, $auto_confirm = FALSE) {      
    $req = array(
        'amount' => $amount,
        'currency' => $currency,
        'merchant' => $merchant,
        'auto_confirm' => $auto_confirm ? 1:0,
    );
    return $this->api_call('create_transfer', $req);
}
/**
 * Creates a transfer from your account to a specified $PayByName tag.<br />
 * @param amount The amount of the transaction (floating point to 8 decimals).
 * @param currency The cryptocurrency to withdraw.
 * @param pbntag The $PayByName tag to send funds to.
 * @param auto_confirm If auto_confirm is TRUE, then the transfer will be performed without an email confirmation.
 */
public function SendToPayByName($amount, $currency, $pbntag, $auto_confirm = FALSE) {       
    $req = array(
        'amount' => $amount,
        'currency' => $currency,
        'pbntag' => $pbntag,
        'auto_confirm' => $auto_confirm ? 1:0,
    );
    return $this->api_call('create_transfer', $req);
}
private function is_setup() {
    return (!empty($this->private_key) && !empty($this->public_key));
}
private function api_call($cmd, $req = array()) {
    if (!$this->is_setup()) {
        return array('error' => 'You have not called the Setup function with your private and public keys!');
    }
    // Set the API command and required fields
$req['version'] = 1;
    $req['cmd'] = $cmd;
    $req['key'] = $this->public_key;
    $req['format'] = 'json'; //supported values are json and xml
    // Generate the query string
    $post_data = http_build_query($req, '', '&');
    // Calculate the HMAC signature on the POST data
    $hmac = hash_hmac('sha512', $post_data, $this->private_key);
    // Create cURL handle and initialize (if needed)
    if ($this->ch === null) {
        $this->ch = curl_init('https://www.coinpayments.net/api.php');
        curl_setopt($this->ch, CURLOPT_FAILONERROR, TRUE);
        curl_setopt($this->ch, CURLOPT_RETURNTRANSFER, TRUE);
        curl_setopt($this->ch, CURLOPT_SSL_VERIFYPEER, 0);
    }
    curl_setopt($this->ch, CURLOPT_HTTPHEADER, array('HMAC: '.$hmac));
    curl_setopt($this->ch, CURLOPT_POSTFIELDS, $post_data);
    $data = curl_exec($this->ch);                
    if ($data !== FALSE) {
        if (PHP_INT_SIZE < 8 && version_compare(PHP_VERSION, '5.4.0') >= 0) {
            // We are on 32-bit PHP, so use the bigint as string option. If you are using any API calls with Satoshis it is highly NOT recommended to use 32-bit PHP
            $dec = json_decode($data, TRUE, 512, JSON_BIGINT_AS_STRING);
        } else {
            $dec = json_decode($data, TRUE);
        }
        if ($dec !== NULL && count($dec)) {
            return $dec;
        } else {
            // If you are using PHP 5.5.0 or higher you can use json_last_error_msg() for a better error message
            return array('error' => 'Unable to parse JSON result ('.json_last_error().')');
        }
    } else {
        return array('error' => 'cURL error: '.curl_error($this->ch));
    }
}
READ ALSO
PHP String to Array

PHP String to Array

подскажите правильное решение по переводу строки в массивЕсть метод класса который возвращает ответ в виде массива `

141
Как получить все цены из торгового каталога Битрикс и вывести их на сайт?

Как получить все цены из торгового каталога Битрикс и вывести их на сайт?

Есть элемент инфоблока - товарУ него 2 типа цены - базовая, и дистрибьютерская

137
Хранить длинные дробные числа в mysql

Хранить длинные дробные числа в mysql

Необходимо сохранить в базу число вида 1234567890123456 (6 цифр после запятой, 10 перед запятой)

114