公司要上線一款APP軟件,採用的是H5開發,用的dcloud.io。APP有支付功能,支付寶和銀聯都已搞定,只有微信支付卡住了。javascript
微信支付有html
一、微信APP支付,原生SDK的,不過dcloud有集成,但由於沒有審覈經過因此沒法使用;java
二、微信H5支付,這個強大的功能···微信並無對外部開放,只有像京東啊這類大平臺有權限;android
這樣看來貌似無法,只有等審覈經過了···因而咱們又找了許多第三方平臺,偶然發現有平臺打出旗號說能夠在微信調用公衆號支付···咱們開始還覺得對方搞錯了,沒想到咱們本身找到一款APP,竟然就能在微信外部喚醒微信並打開公衆號支付,是的,沒看錯,就是在微信外面調用本應該只能在微信內瀏覽器才能用的公衆號支付,既然別人能實現,咱們就也應該能夠。後端
反編譯了下找到的那款APP,又和第三方給的SDK作了對比,發現他們的調用方法同樣,並且參數也同樣,據猜想參數應該是某個大平臺的。瀏覽器
intent://dl/businessWebview/link?(後面是參數,略)
既然有了方法拿來用就是了,結果發現高興早了。微信
dcloud中能夠用<a>標籤來設置UrlScheme喚醒第三方,例如:函數
weixin://
結果我把intent://換上以後發點擊無效,而在手機瀏覽器中直接打開頁面則能夠正常跳轉到微信內部瀏覽器,因而又是新的一輪查資料~微信支付
說實話,我一個PHP後端開發爲啥老幹不沾邊的事兒····沒想到這一查資料,就走遠了···url
一、Intent scheme URL attack 這裏介紹了intent的一種攻擊方法,也就是intent://能喚醒其它APP的原理。
二、Android 解析 Intent 協議並打開程序,接着又看了Android的原生寫法,看不懂···
三、5+ App開發Native.js入門指南,還要研究下Native.js如何調用Android原生函數···看懵比了
開始模仿寫,先看下第三方給的SDK接口的原生寫法:
Intent intent = null; try { intent = Intent.parseUri(URL, 1); intent.addCategory("android.intent.category.BROWSABLE"); intent.setComponent(null); startActivity(intent); } catch (URISyntaxException e) { e.printStackTrace(); }
而後用Native.js模擬調用···我其實不懂咋寫,寫的亂七八糟,後來dcloud官方的磊子給作了改正:
var Intent = plus.android.importClass("android.content.Intent"); var context = plus.android.runtimeMainActivity(); // 建立Intent的實例對象 var intent = new Intent(URL,1); intent.addCategory("android.intent.category.BROWSABLE"); intent.setComponent(null); context.startActivity(intent);
其中的URL就是intent://地址,其實這就至關於一個連接,能夠喚醒指定Scheme的APP。將URL換成intent://dl/businessWebview/link?並把代碼放到Dcloud中用同步到手機APP中,就能夠成功喚醒微信內部瀏覽器,加上相應的參數就能夠調用公衆號支付了。
後來,在和Dcloud羣裏一熱心網友交流時,他發來plus.runtime.openURL讓我試試看,果真一句代碼就搞定了……
plus.runtime.openURL("intent://dl/businessWebview/link/?");
查了下資料http://ask.dcloud.net.cn/article/670,plus.runtime.openURL是5+ API,能夠啓動url scheme,能夠說這句代碼就是對上面原生的一個「封裝」。
至此,功能實現了,雖然解決過程當中走了不彎路,幸虧學到了不少知識~
我一個後端,漲了很多姿式~