<?php
include_once __DIR__ . '/WapkassaClass.php';
try {
// Инициализация класса с id сайта и секретным ключом
$wapkassa = new WapkassaClass(1, '1234567890');
// основные параметры - сумма и комментарий платежа
$wapkassa->setParams(1.55, 'Тестовая покупка кирпича');
// допольнительные параметры в виде массива, необязательно
$wapkassa->setParamsAdd(array(
'user_id' => 100,
'count' => 10,
));
// получаем данные для генерации формы
$formValue = $wapkassa->getValue();
// генерируем форму
echo '<form method="post" action="https://wapkassa.ru/merchant/payment2">';
foreach ($formValue as $key => $value) {
echo '<input type="hidden" name="' . $key . '" value="' . $value . '">';
}
echo '<button>Оплатить</button>';
echo '</form>';
} catch (Exception $e) {
// вывод ошибки
echo 'Ошибка: ' . $e->getMessage() . PHP_EOL;
}
<?php
include_once __DIR__ . '/WapkassaClass.php';
try {
// Инициализация класса с id сайта и секретным ключом
$wapkassa = new WapkassaClass(1, '1234567890');
// основные параметры - сумма и комментарий платежа
$wapkassa->setParams(1.55, 'Тестовая покупка кирпича');
// допольнительные параметры в виде массива, необязательно
$wapkassa->setParamsAdd(array(
'user_id' => 100,
'count' => 10,
));
// получаем данные для генерации формы
$formValue = $wapkassa->getValue();
// генерируем ссылку
echo '<a href="https://wapkassa.ru/merchant/payment2?' . http_build_query($formValue) . '">Оплатить</a>';
} catch (Exception $e) {
// вывод ошибки
echo 'Ошибка: ' . $e->getMessage() . PHP_EOL;
}
<?php
include_once __DIR__ . '/WapkassaClass.php';
try {
// Инициализация класса с id сайта и секретным ключом
$wapkassa = new WapkassaClass(1, '1234567890');
// основные параметры - сумма и комментарий платежа
$wapkassa->setParams(1.55, 'Тестовая покупка кирпича');
// допольнительные параметры в виде массива, необязательно
$wapkassa->setParamsAdd(array(
'user_id' => 100,
'count' => 10,
));
// получаем от wapkassa id платежа и ссылку для редиректа пользователя
$value = $wapkassa->getPaymentUrl();
if (!empty($value['success'])) {
// id платежа в системе wapkassa, можно использовать для сохранения на своей стороне
$value['success']['id'];
// уникальная ссылка платежа для редиректа пользователя
$value['success']['url'];
// редирект пользователя
header('Location:' . $value['success']['url']);
exit;
}
} catch (Exception $e) {
// вывод ошибки
echo 'Ошибка: ' . $e->getMessage() . PHP_EOL;
}
<?php
// основные параметры - сумма и комментарий платежа
$wapkassa->setParams(1.55, 'Тестовая покупка кирпича', 'windows-1251');
// допольнительные параметры в виде массива, необязательно
$wapkassa->setParamsAdd(array(
'user_id' => 100,
'count' => 10,
), 'windows-1251');
<?php
include_once __DIR__ . '/WapkassaClass.php';
try {
// Инициализация класса с id сайта и секретным ключом
$wapkassa = new WapkassaClass(1, '1234567890');
// Проверка обработчика (PING)
if ($wapkassa->ping($_POST)) {
// возврат успешной проверки
echo $wapkassa->successPing();
} else {
// Парсинг входящих параметров
$params = $wapkassa->parseRequest($_POST);
$params['id']; // id платежа в системе wapkassa
$params['site_id']; // id площадки
$params['time']; // время оплаты в unixtime
$params['comm']; // комментарий платежа
$params['amount']; // сумма платежа
$params['add']; // массив с допольнительными параметрами
// собственный код зачисления платежа на сайте
// ..
// ..
// ..
// возврат успешной обработки
echo $wapkassa->successPayment();
}
} catch (Exception $e) {
// вывод ошибки
echo 'Ошибка: ' . $e->getMessage() . PHP_EOL;
}
<?php
// Парсинг входящих параметров
$params = $wapkassa->parseRequest($_POST, 'windows-1251');
<?php
class WapkassaClass
{
private $url = 'https://wapkassa.ru/api/';
private $userAgent = 'Mozilla/5.0 (Windows NT 6.1; rv:12.0) Gecko/20100101 Firefox/12.0';
private $site_id;
private $site_secret;
private $params = array();
public function __construct($site_id, $site_secret)
{
if (empty($site_id)) {
throw new Exception('Пустой id площадки');
}
if (empty($site_secret)) {
throw new Exception('Пустой секретный код площадки');
}
$this->site_id = $site_id;
$this->site_secret = $site_secret;
}
public function getValue()
{
$this->setHash();
return $this->params;
}
public function getPaymentUrl()
{
$this->setHash();
$result = $this->curl('merchant/getPaymentUrl', $this->params);
if (empty($result)) {
throw new Exception('Неверный ответ от wapkassa api');
}
return $result;
}
public function setHash()
{
$this->params['WK_PAYMENT_HASH'] = $this->genHash($this->params);
return true;
}
public function setParams($amount, $comment, $encode = null)
{
if (empty($amount) || $amount <= 0) {
throw new Exception('Неверная сумма');
}
if (empty($comment) || mb_strlen($comment) < 5) {
throw new Exception('Неверный комментарий');
}
if (!empty($encode)) {
$comment = iconv($encode, 'UTF-8', $comment);
}
$this->params['WK_PAYMENT_SITE'] = $this->site_id;
$this->params['WK_PAYMENT_AMOUNT'] = $amount;
$this->params['WK_PAYMENT_COMM'] = base64_encode($comment);
return true;
}
public function setParamsAdd($params = array(), $encode = null)
{
if (!is_array($params) || count($params) > 10) {
throw new Exception('Неверный параметры');
}
ksort($params);
if (!empty($encode)) {
foreach ($params as $key => $value) {
$params[$key] = iconv($encode, 'UTF-8', $value);
}
}
if (PHP_VERSION_ID >= 50400) {
$this->params['WK_PAYMENT_ADD'] = base64_encode(json_encode($params, JSON_UNESCAPED_UNICODE));
} else {
$this->params['WK_PAYMENT_ADD'] = base64_encode(json_encode($params));
}
return true;
}
public function ping($request)
{
if (empty($request['WK_PAY_PING'])) {
return false;
}
$hash = $request['WK_PAY_HASH'];
unset($request['WK_PAY_HASH']);
if (strcasecmp($hash, $this->genHash($request)) !== 0) {
throw new Exception('Неверный HASH');
}
return true;
}
public function parseRequest($request, $encode = null)
{
if (empty($request) || !is_array($request) || !isset($request['WK_PAY_ID'], $request['WK_PAY_SITE'], $request['WK_PAY_TIME'], $request['WK_PAY_AMOUNT'], $request['WK_PAY_COMM'], $request['WK_PAY_ADD'], $request['WK_PAY_HASH'])) {
throw new Exception('Неверный запрос');
}
$hash = $request['WK_PAY_HASH'];
unset($request['WK_PAY_HASH']);
if (strcasecmp($hash, $this->genHash($request)) !== 0) {
throw new Exception('Неверный HASH');
}
$this->params['id'] = $request['WK_PAY_ID'];
$this->params['site_id'] = $request['WK_PAY_ID'];
$this->params['time'] = $request['WK_PAY_TIME'];
$this->params['amount'] = $request['WK_PAY_AMOUNT'];
$this->params['comm'] = base64_decode($request['WK_PAY_COMM']);
$this->params['add'] = json_decode(base64_decode($request['WK_PAY_ADD']), true);
if (!empty($encode)) {
foreach ($this->params as $key => $value) {
$this->params[$key] = iconv('UTF-8', $encode, $value);
}
}
return $this->params;
}
public function successPayment()
{
return $this->params['id'] . '|YES';
}
public function successPing()
{
return 'PONG';
}
private function genHash($arr_value)
{
ksort($arr_value);
$arr_value[] = $this->site_secret;
return strtoupper(hash('sha256', implode(":", $arr_value)));
}
private function curl($method, $params)
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->url . $method);
curl_setopt($ch, CURLOPT_USERAGENT, $this->userAgent);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_NOBODY, false);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params));
$res = curl_exec($ch);
if ($res === false) {
return false;
}
return json_decode($res, true);
}
}