Предполагается, что пользователь оформил заказ, данные добавлены в БД и есть ID заказа, также есть список заказанных товаров в виде массива для формирования чека. Подробнее о протоколе передачи данных можно посмотреть в документации JSON API.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 |
/* Доступы к Paykeeper */ $server = 'https://xxxxx.server.paykeeper.ru'; $user = 'admin'; $password = 'xxxxxxxxxx'; /* Данные клиента */ $email = ''; $phone = ''; /* Номер заказа */ $order_id = 9999; /* Массив товаров в заказе */ $basket = array( array( 'name' => 'Тортилья, 20 см, 756 г', 'count' => '5', 'price' => '381.00' ) ); /* Собираем массив товаров для paykeeper */ /* https://docs.paykeeper.ru/onlain-kassa-54-fz/tovary-v-cheke-54-fz-full/ */ $total = 0; $prods = array(); foreach ($basket as $row) { $prods[] = array( 'name' => $row['name'], 'price' => $row['price'], 'quantity' => $row['count'], 'sum' => $row['price'] * $row['count'], 'tax' => 'none', 'item_type' => 'goods', ); $total += $row['price'] * $row['count']; } /* Доставка */ $prods[] = array( 'name' => 'Доставка', 'price' => 300, 'quantity' => 1, 'sum' => 300, 'tax' => 'none', 'item_type' => 'service', ); $total += 300; /* Авторизация в Paykeeper */ $base64 = base64_encode($user . ':' . $password); $headers = array(); array_push($headers, 'Content-Type: application/x-www-form-urlencoded'); array_push($headers, 'Authorization: Basic ' . $base64); $curl = curl_init($server . '/info/settings/token/'); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $response = curl_exec($curl); $response = json_decode($response, true); /* В ответе должен быть token, иначе ошибка */ if (isset($response['token'])) { $token = $response['token']; /* Готовим запрос 3.4 JSON API на получение счёта */ $payment_data = array ( 'pay_amount' => $total, 'orderid' => $order_id, 'service_name' => ';PKC|' . json_encode($prods) . '|', 'client_email' => $email, 'client_phone' => $phone, ); $request = http_build_query(array_merge($payment_data, array('token' => $token))); curl_setopt($curl, CURLOPT_URL, $server . '/change/invoice/preview/'); curl_setopt($curl, CURLOPT_HTTPHEADER , $headers); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl, CURLOPT_POSTFIELDS, $request); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $response = curl_exec($curl); curl_close($curl); $response = json_decode($response, true); /* В ответе должен быть invoice_id */ if (isset($response['invoice_id'])) { $invoice_id = $response['invoice_id']; /* Сохранение invoice_id в заказе (PDO) */ $sth = $dbh->prepare("UPDATE `orders` SET `invoice_id` = ? WHERE `id` = ?"); $sth->execute(array($invoice_id, $order_id)); /* Редирект на форму оплаты */ $link = $server . '/bill/' . $invoice_id . '/'; header('Location: ' . $link, true, 301); echo "<script>window.location.replace('" . $link . "');</script>"; echo 'Перейдите по <a href="' . $link . '">ссылке<</a>.'; exit(); } } |
После авторизации пользователь будет перенаправлен на страницу оплаты.
Для удобства, в панели управления заказами можно получить и вывести текущее состояние платежа.
1 2 3 4 5 6 7 8 9 10 11 |
<h4>Статус online платежа</h4> <strong>ID:</strong> <?php echo $response['id']; ?> <strong>Сумма:</strong> <?php echo $response['pay_amount']; ?> <strong>Состояние:</strong> <?php switch ($response['status']) { case 'created': echo 'Создан'; break; case 'sent': echo 'Отправлен'; break; case 'paid': echo 'Оплачен'; break; case 'expired': echo 'Просрочен'; break; } ?> |
В PayKeeper возможен полный возврат платежа с помощью метода /change/payment/reverse/. Возврат могут делать только пользователи с включённой функцией возврата. Подробнее можно ознакомиться в документации JSON API. Пример запроса на полный возврат:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
/* Номер платежа */ $invoice_id = '123456789'; /* Доступы к Paykeeper */ $server = 'https://xxxxx.server.paykeeper.ru'; $user = 'admin'; $password = 'xxxxxxxxxx'; /* Авторизация в Paykeeper */ $base64 = base64_encode($user . ':' . $password); $headers = array( 'Content-Type: application/x-www-form-urlencoded', 'Authorization: Basic ' . $base64 ); $curl = curl_init($server . '/info/invoice/byid/?id=' . $invoice_id); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $info = curl_exec($curl); curl_close($curl); $info = json_decode($info, true); if (!empty($info['paymentid'])) { $curl = curl_init($server . '/info/settings/token/'); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'GET'); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $response = curl_exec($curl); $response = json_decode($response, true); /* В ответе должен быть token, иначе ошибка */ if (isset($response['token'])) { $request = http_build_query( array( 'id' => $info['paymentid'], 'amount' => 500, 'partial' => false, 'token' => $response['token'] ) ); $curl = curl_init($server . '/change/payment/reverse/'); curl_setopt($curl, CURLOPT_CUSTOMREQUEST, 'POST'); curl_setopt($curl, CURLOPT_POSTFIELDS, $request); curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); curl_setopt($curl, CURLOPT_HEADER, false); $response = curl_exec($curl); curl_close($curl); $response = json_decode($response, true); var_dump($response); exit; } } |
Пример кода взят отсюда: https://snipp.ru/php/paykeeper