mirror of
https://github.com/chillpadclub/bedolaga-cabinet.git
synced 2026-07-28 09:33:46 +00:00
fix(payments): open_url_direct payment URL opens externally in Telegram (#654272)
The reported #654272 case ('функция немедленного открытия ссылки', reproduced on RollyPay AND YooKassa, fine on desktop) is the open_url_direct flow — not the connection deep-link opener fixed in 325e221.
When a payment method has open_url_direct, the cabinet did window.location.href = payment_url INSIDE the Telegram in-app WebView. SBP/RollyPay/YooKassa pages then hand off to a bank app via a custom scheme, which the WebView can't open: Android shows net::ERR_UNKNOWN_URL_SCHEME, iOS opens nothing ('приложение не определяется'); link generation logs fine. Desktop works because it's a real browser.
Add openPaymentUrl(): in Telegram open via openLink (external browser — the OS hands off to the bank app, return_url brings the user back); on web keep same-tab navigation (no popup blocker). Applied to TopUpAmount (top-up) and GiftSubscription (gift purchase). QuickPurchase is a web landing page (no platform abstraction) and is unaffected.
This commit is contained in:
24
src/utils/openPaymentUrl.ts
Normal file
24
src/utils/openPaymentUrl.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
/**
|
||||
* Open a payment-provider URL the right way for the current platform.
|
||||
*
|
||||
* In the Telegram in-app WebView, navigating the SAME container to the provider page
|
||||
* (window.location.href) breaks when that page hands off to a bank app via a custom scheme
|
||||
* — SBP/RollyPay/YooKassa do this. Android then shows a full-page net::ERR_UNKNOWN_URL_SCHEME
|
||||
* and iOS opens nothing ("приложение не определяется"), even though link generation succeeded
|
||||
* (Telegram bug #654272). Opening in the EXTERNAL browser (openLink) lets the OS hand off to
|
||||
* the bank app, and the provider's return_url brings the user back.
|
||||
*
|
||||
* On the web platform a real browser handles the hand-off inline, so same-tab navigation is
|
||||
* correct — and it isn't popup-blocked the way window.open() from an async callback would be.
|
||||
*/
|
||||
export function openPaymentUrl(
|
||||
url: string,
|
||||
platform: string,
|
||||
openLink: (url: string) => void,
|
||||
): void {
|
||||
if (platform === 'telegram') {
|
||||
openLink(url);
|
||||
} else {
|
||||
window.location.href = url;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user