forked from Tadrisino/MathApp_frontend
Payment from the Android app: reach Zarinpal through pay.html so it carries our Referer
The app hands every outside URL to the phone browser, which sends no Referer, and Zarinpal's StartPay refuses a request without our domain as Referer («دسترسی از این دامنه مجاز نمیباشد»). Checked against production on a pending order: no Referer → refused; Referer https://math.tadrisino2.ir/ → forwards to the bank (sep.shaparak.ir). - pay.html + src/pay.ts: opened in the phone browser, forwards only to our own /api/payment/orders/<id>/pay link (anything else is refused), so the Referer is math.tadrisino2.ir. The app opens it as http:// (the WebView keeps only https on its own host); ArvanCloud moves it to https, and the link rides in the fragment, which never reaches a server. - MainActivity.kt (next APK): payment pages (our subdomains, zarinpal, shaparak) stay inside the WebView and `paysInApp()` tells the frontend to navigate directly. Not built. Not checked: a full payment on a real phone. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -48,6 +48,15 @@ class MainActivity : AppCompatActivity() {
|
||||
/** فقط خودِ سایت و فقط با https؛ «http://دامنهی ما» قابلِ دستکاریِ شبکه است و نباید پل داشته باشد. */
|
||||
private fun isOurPage(uri: Uri?): Boolean = uri != null && uri.scheme == "https" && uri.host == webHost
|
||||
|
||||
/** API و درگاه: زیردامنههای دامنهی خودمان (mathapi…)، زرینپال و صفحههای بانکیِ شاپرک؛ فقط https. پل اینجا کار نمیکند. */
|
||||
private fun isPaymentPage(uri: Uri?): Boolean {
|
||||
val host = uri?.host ?: return false
|
||||
if (uri.scheme != "https") return false
|
||||
val ours = webHost.substringAfter('.')
|
||||
return host == ours || host.endsWith(".$ours") ||
|
||||
host == "zarinpal.com" || host.endsWith(".zarinpal.com") || host.endsWith(".shaparak.ir")
|
||||
}
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
override fun onCreate(savedInstanceState: Bundle?) {
|
||||
super.onCreate(savedInstanceState)
|
||||
@@ -66,6 +75,9 @@ class MainActivity : AppCompatActivity() {
|
||||
// در صفحههای خودمان در دسترس است.
|
||||
override fun shouldOverrideUrlLoading(view: WebView, request: WebResourceRequest): Boolean {
|
||||
if (isOurPage(request.url)) return false
|
||||
// پرداخت با درگاه داخلِ خودِ اپ میماند: زرینپال بیRefererِ دامنهی ما صفحه را باز نمیکند و مرورگرِ
|
||||
// بیرونی Referer نمیفرستد. بعد از پرداخت، زرینپال به سایتِ ما برمیگرداند و نتیجه همینجا دیده میشود.
|
||||
if (isPaymentPage(request.url)) return false
|
||||
// فقط http(s) به مرورگرِ گوشی میرود؛ intent:، file: و schemeهای سفارشی بیصدا بسته میشوند
|
||||
// (پیشتر هر آدرسی بیرونِ دامنه به ACTION_VIEW میرفت و صفحه میتوانست اپِ دلخواه باز کند).
|
||||
if (request.url.scheme == "https" || request.url.scheme == "http") {
|
||||
@@ -193,6 +205,10 @@ class MainActivity : AppCompatActivity() {
|
||||
else @Suppress("DEPRECATION") vibrator.vibrate(timings, -1)
|
||||
}
|
||||
|
||||
/** فرانت با این میفهمد درگاه داخلِ اپ باز میشود (isPaymentPage)، نه در مرورگرِ بیرونی. */
|
||||
@JavascriptInterface
|
||||
fun paysInApp(): Boolean = true
|
||||
|
||||
@JavascriptInterface
|
||||
fun bazaarConsume(purchaseToken: String) {
|
||||
runOnUiThread {
|
||||
|
||||
Reference in New Issue
Block a user