Android 通過scheme跳轉支付寶實現支付

2023-04-25 18:01:13

原文地址: Android 通過scheme跳轉支付寶實現支付 - Stars-One的雜貨小窩

需求的來源是支付功能,由於支付寶不允許個人開通具有webhook的支付服務,所以是對接了一個支付系統(應該算作四方支付)。建立訂單後,系統會返回一個h5連結。
對於PC版的軟體,將此連結轉為二維條碼,然後提示使用者使用支付寶掃碼就能夠觸發付款操作;
而對於Android軟體來說,這樣的流程可不合適

實際上,掃碼之後就是通過支付寶內建瀏覽器開啟了h5,如果我能有個方法,可以觸發讓支付寶去開啟支付的h5連結,那麼就是相當於實現了喚起APP支付的功能了

於是就輪到了今天所說的scheme實現了功能

步驟

1.知道對應的scheme

首先,我們要知道對應的scheme,這個是重點,但好在酷安人均大佬,已經有人找到了,就是下面的這個,需要在後面拼接下網址即可

alipays://platformapi/startapp?appId=20000067&url=

2.觸發scheme

關於觸發scheme,這裡就涉及到Android裡的Intent相關的知識了,這裡不詳細說明了,直接上程式碼

val payUrl =""//支付的h5地址
val scheme = "alipays://platformapi/startapp?appId=20000067&url=${payUrl}"
val intent = Intent(Intent.ACTION_VIEW, Uri.parse(scheme))
ActivityUtils.startActivity(intent)

PS: ActivityUtils是個AndroidUtilCode庫裡的一個工具類,各位也可以直接用activity物件的startActivity方法

當然,這裡我們還得加上個判斷,來判斷使用者是否安裝了支付寶應用

//判斷是否安裝支付寶
if (AppUtils.isAppInstalled("com.eg.android.AlipayGphone")) {
    val scheme = "alipays://platformapi/startapp?appId=20000067&url=${payUrl}"
    val intent = Intent(Intent.ACTION_VIEW, Uri.parse(scheme))
    ActivityUtils.startActivity(intent)
} else {
    ToastUtils.showShort("抱歉,當前手機未安裝支付寶APP...")
}

【開源庫推薦】#2 AndroidUtilCode Android常用工具類大全(附API使用說明) - Stars-One的雜貨小窩

不過這裡遇到了個問題了,由使用者反饋說支付不了

排查一下,發現是我專案裡的target SDK變更為了30,而API 30,無法獲取包名,詳情可見此文宣告軟體包可見性需求  |  Android 開發者  |  Android Developers

不過由於我用的是工具庫,所以把AndroidUtilCode庫更新到最新版本就解決了此問題

PS: 實際上實現效果與官方支付寶的APP支付有些不同,上述的實現效果就是,會先觸發支付寶開啟一個網頁,然後再彈出一個付款的對話方塊;

而官方支付寶的APP支付的話,就是會直接彈出付款的對話,沒有開啟網頁的這一步操作,不過也是還能接受

最後我碎碎念下,微信這個APP就是垃圾,限制太多了,對開發者極度不友好,不同於支付寶,它是直接限制了scheme,除非你是它白名單裡,否則不允許你用它裡面瀏覽器開啟頁面

所以估計我以後不會對接微信支付!!

補充 scheme收集

下面是我從上面文章裡抽取一些可能開發會用的scheme:

應用 說明 scheme
QQ 指定QQ號聊天頁跳轉 mqqwpa://im/chat?chat_type=wpa&uin=qq號
QQ QQ群聊天頁 mqqwpa://im/chat?chat_type=group&uin=群號
QQ 指定群資料頁 mqqapi://card/show_pslcard?src_type=internal&version=1&uin=群號&card_type=group
QQ 指定QQ號資料頁 mqqapi://card/show_pslcard?src_type=internal&version=1&uin=QQ號
QQ 空間跳轉 mqqapi://qzone/activefeed
微信 付款 android-app://com.tencent.mm/#Intent;action=com.tencent.mm.action.BIZSHORTCUT;launchFlags=0x4000000;S.LauncherUI.Shortcut.LaunchType=launch_type_offline_wallet;end
微信 掃一掃 #Intent;action=com.tencent.mm.action.BIZSHORTCUT;launchFlags=0x4000000;B.LauncherUI.From.Scaner.Shortcut=true;end
微信 聯絡人/群聊/公眾號跳轉 android-app://com.tencent.mm/#Intent;action=com.tencent.mm.action.BIZSHORTCUT;B.LauncherUI.From.Biz.Shortcut=true;S.LauncherUI.Shortcut.Username=ID;end
微信 跳轉微信收藏
微信

上面微信的聯絡人跳轉,需要個ID,關於如何獲取,可見下圖

補充 - 跳轉網易雲音樂開啟連結

val intent = Intent(Intent.ACTION_VIEW)
intent.data = Uri.parse("https://www.cnblogs.com/stars-one")
intent.setPackage("com.netease.cloudmusic")
ActivityUtils.startActivity(intent)