原文地址: Android 通過scheme跳轉支付寶實現支付 - Stars-One的雜貨小窩
需求的來源是支付功能,由於支付寶不允許個人開通具有webhook的支付服務,所以是對接了一個支付系統(應該算作四方支付)。建立訂單後,系統會返回一個h5連結。
對於PC版的軟體,將此連結轉為二維條碼,然後提示使用者使用支付寶掃碼就能夠觸發付款操作;
而對於Android軟體來說,這樣的流程可不合適
實際上,掃碼之後就是通過支付寶內建瀏覽器開啟了h5,如果我能有個方法,可以觸發讓支付寶去開啟支付的h5連結,那麼就是相當於實現了喚起APP支付的功能了
於是就輪到了今天所說的scheme實現了功能
首先,我們要知道對應的scheme,這個是重點,但好在酷安人均大佬,已經有人找到了,就是下面的這個,需要在後面拼接下網址即可
alipays://platformapi/startapp?appId=20000067&url=
關於觸發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 |
---|---|---|
指定QQ號聊天頁跳轉 | mqqwpa://im/chat?chat_type=wpa&uin=qq號 | |
QQ群聊天頁 | mqqwpa://im/chat?chat_type=group&uin=群號 | |
指定群資料頁 | mqqapi://card/show_pslcard?src_type=internal&version=1&uin=群號&card_type=group | |
指定QQ號資料頁 | mqqapi://card/show_pslcard?src_type=internal&version=1&uin=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)