The payment window in websites and apps
The payment window is a page of its own, which the payer reaches by a redirect and leaves by one. Most problems come from trying to keep it inside something else.
Websites
Create the link on your server when the payer clicks Pay, never in the browser, as your API key must not reach it. Then redirect:
HTTP/1.1 303 See Other
Location: https://pay.gjold.com/q3z3amhrkmyrgk6i
or set window.location to the "url" in your page's script.
The window can't be put in an iframe: it sends
Content-Security-Policy: frame-ancestors 'none' and
X-Frame-Options: DENY, so browsers refuse to show it in one. A popup
works, but browsers block popups that a click did not open, and Apple
Pay and banking apps work best in a full tab.
When the payer has paid, the window redirects to your "successurl",
as a plain GET with nothing added. Put the order in the URL, and
treat the page as the place to say thank you, not as the proof of
payment: see Orders and payment links.
Apps
Create the link on your server, as for a website, and open it in the
system's browser view: SFSafariViewController on iOS, or a
Custom Tab on
Android. Both are the system browser, so Apple Pay, 3-D Secure, and the
switch to a banking app or to MobilePay work without code of yours.
Avoid a WebView if you can. If you must use one:
- Allow navigation to other domains, as 3-D Secure runs on the bank's site.
- Open links to banking apps and to MobilePay yourself, with the system, as a WebView won't.
- Don't inject JavaScript into it. Apple Pay is turned off in a
WKWebViewthat runs scripts of yours throughWKUserScriptorevaluateJavaScript.
Back to the app
The payer leaves your app for the browser view, and perhaps for a banking app or MobilePay, and may not come back on their own:
- Make your
"successurl"a universal link on iOS, or an App Link on Android, so that it opens your app when it is installed, and a web page when it is not. - Ask your server for the order's state whenever your app comes back to the foreground, as the payer may have paid and closed the browser view, or finished in their default browser after a banking app sent them there.
Your server knows that the order is paid from seq, not from the app, so the app only has to ask it.
Language
The window takes its language from the link's "language", or else
from the browser's Accept-Language. In an app whose language the user
chose apart from the system's, send it as "language".