Уведомление о поступление платежей из Бланк - банка

Готовое решение для уведомления о поступившем платеже от Бланк-банка по API. Удобно автоматом разносить поступающие по СБП платежи в режиме реального времени. Для получения уведомления нужно получить в чате банка:
define("ClientId","external.xxxxxxxxxxxxxxxxxxxxxxxxx.m2m");
define("ClientSecret","xxxxxxxxxx-xxxxxx-xxxxxx-xxxxx-xxxxxxxxxxx");
define("ObjectId","xxxxxxxxxxx-xxxxxxxxx-xxxxxx-xxxxxxx-xxxxxxxxxx");

Далее используйте данный код на php для получения уведомления об операциях. Полезно при приеме платежей по СБП сразу проставлять признак оплаты в вашей учетной системе.

Не забудьте пробить чек, т.к. все что вы получаете по СБП от физ.лиц - должно пробиваться по кассе!

Файл /blanc/webhook.php:

define("ClientId","external.xxxxxxxxxxxxxxxxxxxxxxxxx.m2m");
define("ClientSecret","xxxxxxxxxx-xxxxxx-xxxxxx-xxxxx-xxxxxxxxxxx");
define("Scopes",'partners:webhooks');
define("ObjectId","xxxxxxxxxxx-xxxxxxxxx-xxxxxx-xxxxxxx-xxxxxxxxxx");

$input=file_get_contents("php://input");

syslog(LOG_INFO,  'input:'.$input."\nServer:".json_encode($_SERVER));

try{
    @$update=json_decode($input,true);
}catch(Exception $e){
    syslog(LOG_INFO, "json_decode Error\n".$input);
    exit;
}

if(empty($update)) { // если данных нет, установлю webhook
    syslog(LOG_INFO,  "устанавливаю webhook");
    echo "<br>получаю токен ";
    $ret = api('api/sso/connect/token', [
        'client_id' => ClientId,
        'client_secret' => ClientSecret,
        'scope' => Scopes,
        'grant_type' => 'client_credentials'
    ]);
    var_dump($ret);

    if (!isset($ret['error'])&&!empty($ret['access_token'])) {
        $token = $ret['access_token'];
        echo "<br>подписываюсь на операции ";
        $ret = api('api/gateway-webhook-service/v1/subscriptions', [
            "Topic" => "CompanyTransactionCompleted",
            "ObjectId" => ObjectId,
            "Url" => 'https://' . Get::SERVER_NAME() . '/blanc/webhook.php',
            "Secret" => ClientSecret
        ]);
        var_dump($ret);

        echo "<br>получение списка всех подписок ";
        $ret = api('api/gateway-webhook-service/v1/subscriptions');
        var_dump($ret);
        if(!empty($ret['value'])&&count($ret['value'])>1) {// если больше одной, удаляю лишние
            echo "<br>удаление одной подписки ";
            $ret = api('api/gateway-webhook-service/v1/subscriptions/'.$ret['value'][0]['id'], [],"DELETE");
            var_dump($ret);
        }
        echo "<br>получение списка всех подписок ";
        $ret = api('api/gateway-webhook-service/v1/subscriptions');
        var_dump($ret);
    }


}else{ // пришли деньги
    if(!empty($update['Purpose']) && !strpos($update['Purpose'], 'Зачисление средств по платежу СБП')!==false){
        // это поступление по СБП
    }
    die('Ok');
}


/**
 * @param string $cmd  - команда
 * @param array  $post - данные
 * @param string $method - '' | DELETE | PUT
 * @return mixed|null
 */
function api($cmd, $post=[], $method=''){
    //$ch = curl_init("https://api-gate.vestabankdev.ru/release/" . $cmd); // это тестовый сервер
    $ch = curl_init('https://m.blanc.ru/' . $cmd);
    if($post) curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    global $token;
    if(empty($token)) {
        $headers = ['Content-type: application/x-www-form-urlencoded'];
        if($post) curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($post));
    }else{
        $headers = ['Content-Type: application/json', 'Authorization: Bearer '.$token];
        if($post) curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($post,JSON_UNESCAPED_UNICODE));
    }
    if(!empty($method))curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);

    $body = curl_exec($ch);
    $info = curl_getinfo($ch);
    curl_close($ch);

    $body=json_decode($body);
    syslog(LOG_INFO, $cmd."\n".json_encode($post,JSON_UNESCAPED_UNICODE)."\nres: ".json_encode($body,JSON_UNESCAPED_UNICODE));
    return $body;
}

Нужна помощь, - обращайтесь.


.