Данные

  • 
    таблица = 'email_orders'
    
  • 
    валюты = '["USD", "EUR", "AED", "HKD", "GEL", "CHF", "ARS", "AUD", "BDT", "BHD", "BRL", "CAD", "CLP", "CNY", "CZK", "DKK", "GBP", "HUF", "IDR", "ILS", "INR", "JPY", "KRW", "KWD", "LKR", "MMK", "MXN", "MYR", "NGN", "NOK", "NZD", "PHP", "PKR", "PLN", "RUB", "SAR", "SEK", "SGD", "THB", "TRY", "TWD", "UAH", "VEF", "VND", "ZAR"]'
    

Статусы

  • Черновик = 'DRAFT'
  • Создан = 'CREATED'
  • Остальные статусы дублируют инвойс, когда уже по нему проходит процедура оплаты (PAID, TIMEOUT...)

Создание инвойса (payment invoice)

Перед созданием проверяем если ли уже созданное приложение под инвойсы

1. проверяем существует ли настройка пользователя для POS - email-orders

SELECT
	*
FROM
	`laravel`.`settings`
WHERE (`user_id` = $user_id)
	AND(`field` = 'email-order-app-id')
ORDER BY
	`id`
LIMIT 1;


----
где, ($user_id = 5 к примеру)
                        
                    
2. если настройки не существует, то создаем POS и настройку

Массив данных для создания POS
[
    'ownerId'      => $user_id,
    'name'         => 'Email Order', - имя, можно менять, но оно скрыто для пользователя
    'type'         => 'email-order', - тип POSa
    'date'         => date('Y-m-d H:i:s'), - php функция, формат даты '2020-06-10 13:05:20'
    'api_key'      => 'API КЛЮЧ', - генерирую через uuid4
    'callback_url' => 'https://checkout.ivendpay.com/email-order-invoice-hook' - для отработки хуков
]

Массив данных для создания настроки
[
    'user_id' => $user_id,
    'field'   => 'email-order-app-id, - имя настройки
    'value'   => 'полученный ID созданного POS',
    'created_at' => date('Y-m-d H:i:s'), - php функция, формат даты '2020-06-10 13:05:20',
    'updated_at' => date('Y-m-d H:i:s'), - php функция, формат даты '2020-06-10 13:05:20',
]

----
где, ($user_id = 5 к примеру)
created_at и updated_at - одинаковые даты при создании
                        
                    
3. Создаем invoice

$setting = в переменную вытаскиваем настройку, существующую или созданную (см. п: Перед созданием проверяем если ли уже созданное приложение под инвойсы)

Массив данных для создания инвойса
[
    'user_id'  => $user_id,
    'app_id'   => $setting->value, - сохраненный в настроку полученный ID созданного POS email-order
    'hash'     => 'КЛЮЧ', - генерирую hash ключ для открытия созданного инвойса (пример http://checkout.app-ivendpay.art/email-order/68b3db84-c881-4aa8-8133-6b89a9243980)
    'status'   => 'статус', - см. Статусы
    'email'    => 'email или NULL', - указываем email адрес или NULL
    'total'    => '', - сумма согласно Items (price*count)
    'currency' => '', - указываем валюту, см. Данные -> валюты
    'emails'   => '', - указываем json формат доп. почт [{"email":"email1gmail.com"}, {"email":"email2gmail.com"}]
    'items'    => '', - указываем json формат Items [{"title":"item 1","price":"1","quantity":"10"},{"title":"item 2","price":"20.30","quantity":"6"}]
    'expired'  => '', - дата истекания срока действия инвойса, формат - 2023-12-27 15:01:00
    'exp_date' => '', - дата, формат 2023-12-27
    'exp_hour' => '', - часы, целое число (например 35)
    'exp_minute' => '', - минуты, целое число (1-59)
    'created_at' => date('Y-m-d H:i:s'), - php функция, формат даты '2020-06-10 13:05:20',
    'updated_at' => date('Y-m-d H:i:s'), - php функция, формат даты '2020-06-10 13:05:20',
]

----
где, ($user_id = 5 к примеру)
created_at и updated_at - одинаковые даты при создании

----
как делаю расчет expired поля:

protected function expired()
{
    if (! empty($this->exp_date) ||
        ! empty($this->exp_minute) ||
        ! empty($this->exp_hour)
    ) {
        if (empty($this->exp_date)) {
            $expired = new \DateTime(now()->format('Y-m-d H:i'));
        } else {
            $expired = new \DateTime($this->exp_date .' '. date('H:i'));
        }

        if (! empty($this->exp_hour)) {
            $expired->modify("+{$this->exp_hour} hours");
        }

        if (! empty($this->exp_minute)) {
            $expired->modify("+{$this->exp_minute} minutes");
        }

        return $expired->format('Y-m-d H:i:s');
    }

    return null;
}
                        
                    

Использование

После того как созан инвойс, у нас формируется ссылка

(пример http://checkout.app-ivendpay.art/email-order/68b3db84-c881-4aa8-8133-6b89a9243980)

При переходе на нее открывается форма выбора монеты для оплаты и нажатие кнопки формирования инвойса для оплаты

После нажатия кнопки формирования инвойса для оплаты в таблицу email_orders сохраняется номер инвойса и меняется статус согласно инвойсу оплаты, осуществляется редирект на форму оплаты

Далее полный сценарий оплаты