Setting Up Internet Acquiring on 1C-Bitrix | Custom Payment Processing

How to Set Up Internet Acquiring on 1C-Bitrix? The task of "connecting card payment" seems trivial until the first production incident: order statuses don't update, money arrived but the order hangs in "Awaiting payment". The reason is that the bank's webhook doesn't reach the server due to WAF o

Our competencies:

Frequently Asked Questions

Latest works

  • image_website-b2b-advance_0.webp
    B2B ADVANCE company website development
    1460
  • image_bitrix-bitrix-24-1c_fixper_448_0.webp
    Website development for FIXPER company
    1019
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Development based on Bitrix, Bitrix24, 1C for the company Development of an Online Appointment Booking Widget for a Medical Center
    761
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Development based on 1C Enterprise for MIRSANBEL
    882
  • image_crm_dolbimby_434_0.webp
    Website development on CRM Bitrix24 for DOLBIMBY
    809
  • image_crm_technotorgcomplex_453_0.webp
    Development based on Bitrix24 for the company TECHNOTORGKOMPLEKS
    1163

How to Set Up Internet Acquiring on 1C-Bitrix?

The task of "connecting card payment" seems trivial until the first production incident: order statuses don't update, money arrived but the order hangs in "Awaiting payment". The reason is that the bank's webhook doesn't reach the server due to WAF or PHP error. One project — an auto parts online store with a catalog of 50,000 items. When migrating to a dedicated server, Cloudflare blocked POST requests from the bank. Diagnosis took two hours, solution — configuring firewall exceptions. Afterwards, we developed a universal checklist for checking notification delivery. We, engineers with ten years of experience in Bitrix development, will cover the full cycle: from choosing a scheme to diagnostics. Our approach — reliability and transparency, we guarantee the integration works.

More about webhook technology can be read on Wikipedia Webhook.

Three Approaches to Integration

Ready Module from Marketplace — Sberbank, Tinkoff, YooKassa, Alfa-Bank have official modules. Installed via /bitrix/admin/update_system.php. Fast, vendor-supported, but limited flexibility.

Custom Handler in /local/ — when the standard module doesn't cover needs: non-standard status mapping, custom fiscalization, multiple acquirers.

JS Widget Acquiring — CloudPayments, Robokassa embed via a script. Part of the work on the client, server only verifies the result.

Installation and Configuration (Example: Tinkoff)

After installing the module from the Marketplace: Store → Settings → Payment Systems → Add → Tinkoff.

Parameter Source
Terminal Key Tinkoff Business → Internet Acquiring
Secret Key Same place
Notification URL https://shop.ru/bitrix/tools/sale_ps_result.php
Success URL Order success page

Custom Handler: Minimal Skeleton

<?php // local/php_interface/include/sale_payment/mybank/handler.php use Bitrix\Sale\PaySystem\BaseServiceHandler; use Bitrix\Sale\PaySystem\ServiceResult; use Bitrix\Sale\Payment; use Bitrix\Main\Request; class MyBankHandler extends BaseServiceHandler { public function initiatePay(Payment $payment, Request $request): ServiceResult { $result = new ServiceResult(); $order = $payment->getCollection()->getOrder(); $session = $this->createGatewaySession( $order->getId(), $payment->getSum() ); if (empty($session['payUrl'])) { $result->addError(new \Bitrix\Main\Error('Gateway error: ' . ($session['error'] ?? ''))); return $result; } $result->setPaymentUrl($session['payUrl']); return $result; } public function processRequest(Payment $payment, Request $request): ServiceResult { $result = new ServiceResult(); $data = json_decode(file_get_contents('php://input'), true); // ALWAYS verify signature — don't trust request data if (!$this->verifySignature($data)) { $result->addError(new \Bitrix\Main\Error('Invalid signature')); return $result; } if (($data['status'] ?? '') === 'PAID') { $result->setOperationType(ServiceResult::MONEY_COMING); } return $result; } } 

Diagnostics: Webhook Not Arriving

The most common reason — order statuses don't change, though money is debited. Diagnostic algorithm:

# 1. Check endpoint accessibility from outside curl -v -X POST https://shop.ru/bitrix/tools/sale_ps_result.php \ -d 'test=1' # Should return 200, not 403 # 2. Check access.log for requests from bank IP grep "sale_ps_result" /var/log/nginx/access.log | tail -50 # 3. Temporary logging (debug only!) file_put_contents('/tmp/ps_debug.log', date('Y-m-d H:i:s') . ' ' . $_SERVER['REMOTE_ADDR'] . ' ' . file_get_contents('php://input') . PHP_EOL, FILE_APPEND ); 

Typical culprits: Cloudflare Bot Fight Mode blocks POST requests without User-Agent; fail2ban blocks bank IP by request count; PHP fatal error without log entry; HTTP→HTTPS redirect loses POST body.

Why a Custom Handler is Better Than a Ready Module?

A ready module doesn't allow flexible mapping of order statuses: for example, Tinkoff's "SUCCESS" status could mean "Paid" or "Awaiting confirmation". A custom handler gives 100% control over the logic, plus the ability to combine multiple acquirers into one interface. When integrating with 1C and fiscalization (54-FZ), a custom approach is mandatory — ready modules often don't support ATOL in non-standard scenarios. 54-FZ requirements are regulated by Federal Law.

When is Fiscalization Needed?

Fiscalization is mandatory for all online payments in the Russian Federation. When paying by card, a fiscal receipt must be sent to the buyer electronically. Setting up fiscalization includes integration with OFD and ATOL. In our stack — ATOL Online, which supports 54-FZ. Connecting fiscalization adds 1–2 days to the development timeline.

How We Ensure Integration Reliability?

After setup, we conduct load testing: emulate up to 50 simultaneous requests from the bank, check correct handling of duplicates and failures. For critical stores, we configure webhook monitoring via cron — every 5 minutes check that the endpoint returns 200. In the contract, we stipulate a delivery guarantee: if the order is paid, the status will change within a maximum of 30 seconds.

Two-Stage Acquiring

For stores that ship after reserving goods:

// On order placement — hold (PayType=T for Tinkoff) // On status change to "Shipped" — confirm capture AddEventHandler('sale', 'OnSaleStatusOrder', function(\Bitrix\Main\Event $event) { $order = $event->getParameter('ENTITY'); if ($order->getField('STATUS_ID') !== 'OD') return; foreach ($order->getPaymentCollection() as $payment) { if ($payment->getField('PS_STATUS') === 'hold') { capturePayment($payment->getField('PS_INVOICE_ID')); } } }); 

What's Included?

The full package when ordering acquiring setup: audit of the current payment system, selection of the optimal scheme, development or customization of the handler (including fiscalization), webhook configuration and notification delivery testing, integration with 1C (status exchange, synchronization), documentation of settings and logging, warranty support for 1 month after launch.

Timelines and Our Numbers

Task Duration
Installation and setup of a ready module 0.5–1 day
Custom handler from scratch 2–4 days
Two-stage acquiring +1–2 days
Webhook debugging and testing 0.5–1 day

We have been working with 1C-Bitrix for over 10 years and have completed 200+ projects for online stores and B2B portals. Over 50 of them with custom acquiring. In case of issues, we respond within 2 hours, provide certificates of conformity.

The cost is calculated individually — contact us to evaluate your project. Order the acquiring setup service and get a reliable integration.