iOS支付寶H5支付無法返回APP解決方案

本文只討論你已經(jīng)成功實(shí)現(xiàn)客戶端->支付寶支付流程,僅僅是支付完成后無法返回自己的APP的問題。

如果你的支付流程是客戶端->Safari->支付寶不在本文討論范圍之類辛馆。

iOS支付寶H5支付不在討論范圍內(nèi)风范。提供下列參考:

支付寶H5支付官方文檔

支付寶H5支付官方Demo下載Demo使用文檔

本文前大段在講樓主是如何解決這個(gè)問題的,以及中間遇到的麻煩庆锦。趕時(shí)間的同學(xué)可以直接看最后的最終解決方案

在討論之前轧葛,我們先看看官方文檔上的一句話:

注意:在iOS系統(tǒng)中搂抒,喚起支付寶App支付完成后艇搀,不會(huì)自動(dòng)回到瀏覽器或商戶APP。用戶可手工切回到瀏覽器或商戶APP求晶;支付寶H5收銀臺(tái)會(huì)自動(dòng)跳轉(zhuǎn)回商戶return_url指定的頁面焰雕。

what? 官方直接跟我們說GG了?樓主不甘心芳杏,還是想嘗試一下矩屁。

借鑒之前iOS微信H5支付無法返回APP解決方案的經(jīng)驗(yàn),先在return_url這個(gè)參數(shù)上做個(gè)嘗試吧爵赵。

支付寶和微信不同的是吝秕,支付寶的return_url不需要在支付寶管理后臺(tái)備案(填寫),微信的redirect_url是需要的空幻。

第一次嘗試

webView攔截請求https://mapi.alipay.com/gateway.do烁峭,修改return_url參數(shù)為自己的URLScheme,比如 URLEncode(A.company.com://)秕铛,結(jié)果失敗了约郁,進(jìn)入支付寶報(bào)錯(cuò)的頁面。仔細(xì)看了一下請求的其它參數(shù)但两,居然有個(gè)sign鬓梅!支付寶文檔上也有這個(gè)參數(shù),居然校驗(yàn)了參數(shù)簽名的谨湘,好吧绽快,客戶端篡改參數(shù)的方案宣告失敗悲关!

第二次嘗試

既然不能篡改谎僻,那直接下單的時(shí)候填吧娄柳,請求后臺(tái)的同學(xué)協(xié)助一下寓辱,在下單的時(shí)候把return_url參數(shù)改成 URLEncode(A.company.com://),結(jié)果還是失敗了赤拒。后臺(tái)同學(xué)提示我秫筏,return_url必須是HTTP/HTTPS開頭,支付寶文檔上有說明挎挖。

第三次嘗試

那加上http試試这敬,我又讓后臺(tái)同學(xué)把return_url改成? URLEncode(httpA.company.com://),同時(shí)把APP的URLSchemes改成httpA.company.com蕉朵,再次嘗試崔涂,調(diào)起支付寶返回的時(shí)候打開了Safari,在Safari里面顯示了我們支付中心的錯(cuò)誤頁面始衅,return_url方案徹底失敗了冷蚂!

要不就算了缭保,跟產(chǎn)品說支付寶無法實(shí)現(xiàn)支付完成后跳回APP,反正支付寶官方文檔上都這么寫了蝙茶。

雖然這么想了艺骂,但是我還是繼續(xù)翻看支付寶的文檔,希望能找到點(diǎn)蛛絲馬跡隆夯。

突然看到了這里钳恕,手機(jī)網(wǎng)站支付轉(zhuǎn)Native支付

支付寶文檔

支付寶文檔

schemeStr,這個(gè)關(guān)鍵字讓我眼前一亮蹄衷。

手機(jī)網(wǎng)站支付轉(zhuǎn)Native支付:支付寶的意思是忧额,我們提供了一個(gè)SDK,你接了之后就可以很方便的實(shí)現(xiàn)H5收銀臺(tái)(即在web上輸入支付寶賬號(hào)密碼支付)到支付寶APP收銀臺(tái)的過渡愧口。

如果你是一個(gè)"正規(guī)"APP開發(fā)者宙址,至此已經(jīng)可以解決你的問題了。按照支付寶文檔接支付寶SDK即可调卑,就能實(shí)現(xiàn)H5支付回調(diào)APP了抡砂。

但,這不是樓主想要的方案恬涧,由于工作需求的原因注益,樓主不想也不敢接支付寶的SDK,怕被蘋果爸爸審核掃包啊溯捆。如果你的APP"應(yīng)該"用蘋果支付丑搔,即使你沒有用到支付寶的功能,但是包含了支付寶的SDK提揍,審核被發(fā)現(xiàn)了啤月,也可能被拒絕的。

繼續(xù)尋找解決辦法劳跃。

下載了支付寶的Demo谎仲,試了下確實(shí)可以跳回APP。

樓主琢磨著刨仑,既然SDK能實(shí)現(xiàn)這個(gè)功能郑诺,說明支付寶還是支持的H5支付完成后返回APP功能的,并不是向文檔上說的杉武,"在iOS系統(tǒng)中辙诞,喚起支付寶App支付完成后,不會(huì)自動(dòng)回到瀏覽器或商戶APP轻抱。用戶可手工切回到瀏覽器或商戶APP"飞涂,只是支付寶不愿意公開而已。

那就以這個(gè)支付寶Demo為切入點(diǎn)吧,雖然SDK中有schemeStr這個(gè)參數(shù)较店,但是SDK是黑盒啊志鹃,你不知道它在里面做了些什么。

/** * 支付接口 * *@paramorderStr 訂單信息 *@paramschemeStr 調(diào)用支付的app注冊在info.plist中的scheme *@paramcompletionBlock 支付結(jié)果回調(diào)Block泽西,用于wap支付結(jié)果回調(diào)(非跳轉(zhuǎn)錢包支付) */- (void)payOrder:(NSString *)orderStr fromScheme:(NSString *)schemeStr callback:(CompletionBlock)completionBlock;

追本溯源曹铃,最終打開支付寶APP都會(huì)走

[UIApplicationsharedApplication] openURL:]

在Demo工程里搜了一下,沒有捧杉。但我肯定SDK里面肯定有陕见!

whatever —— Method Swizzling

#import<UIKit/UIKit.h>

#import<objc/runtime.h>

@implementationUIApplication(TrackTimer)

+ (void)load{

staticdispatch_once_toneToken;dispatch_once(&oneToken, ^{? ? ? ??

SEL mySelector =NSSelectorFromString(@"my_openURL:");? ? ? ??

SEL orginalSelector =NSSelectorFromString(@"openURL:");? ? ? ??

Method myMethod = class_getInstanceMethod([selfclass], mySelector);? ? ? ??

Method orginalMethod = class_getInstanceMethod([selfclass], orginalSelector);

BOOLdidAddMethod = class_addMethod([selfclass], orginalSelector, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));

if(didAddMethod) {? ? ? ? ? ?

class_replaceMethod([selfclass], mySelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod));? ? ? ??

}else{? ? ? ? ? ??

method_exchangeImplementations(myMethod, orginalMethod);? ? ? ?

?}? ?

?});}

- (void)my_openURL:(NSURL*)url{

NSLog(@"%@",url);? ??

[selfmy_openURL:url];

}

打印結(jié)果如下

alipaymatrixbwf0cml3://alipayclient/?%7B%0A%20%20%22fromAppUrlScheme%22%20%3A%20%22alisdkdemo%22%2C%0A%20%20%22requestType%22%20%3A%20%22SafePay%22%2C%0A%20%20%22dataString%22%20%3A%20%22trade_no%3D%5C%222018041921001001270586523089%5C%22%26pay_phase_id%3D%5C%22%5C%22%26biz_type%3D%5C%22trade%5C%22%26biz_sub_type%3D%5C%22TRADE%5C%22%26app_name%3D%5C%22tb%5C%22%26extern_token%3D%5C%221fc77c67c70ef70d58e2bf7c513d91a5%5C%22%26appenv%3D%5C%22%5C%22%26pay_channel_id%3D%5C%22alipay_sdk%5C%22%26bizcontext%3D%5C%22%7B%5C%22av%5C%22%3A%5C%221%5C%22%2C%5C%22sc%5C%22%3A%5C%22h5tonative%5C%22%2C%5C%22ty%5C%22%3A%5C%22ios_lite%5C%22%2C%5C%22appkey%5C%22%3A%5C%222014052600006128%5C%22%2C%5C%22sv%5C%22%3A%5C%22h.a.3.5.3%5C%22%2C%5C%22an%5C%22%3A%5C%22com.antfin.AliSDKDemo%5C%22%7D%5C%22%22%0A%7D

URLDecode

alipaymatrixbwf0cml3://alipayclient/?{

"fromAppUrlScheme" : "alisdkdemo",

"requestType" : "SafePay",

"dataString" : "trade_no="2018041921001001270586523089"&pay_phase_id=""&biz_type="trade"&biz_sub_type="TRADE"&app_name="tb"&extern_token="1fc77c67c70ef70d58e2bf7c513d91a5"&appenv=""&pay_channel_id="alipay_sdk"&bizcontext="{"av":"1","sc":"h5tonative","ty":"ios_lite","appkey":"2014052600006128","sv":"h.a.3.5.3","an":"com.antfin.AliSDKDemo"}""

}

為什么前面會(huì)有一點(diǎn)亂碼,alipaymatrixbwf0cml3味抖,不管它了评甜。fromAppUrlScheme,是不是很驚喜仔涩。

是不是支付寶H5支付都有這個(gè)參數(shù)呢忍坷?樓主趕緊用自己的項(xiàng)目嘗試了一下,webView最終會(huì)有一個(gè)alipay://請求的熔脂,攔截它佩研,看看參數(shù)

URLDecode以后(部分字段我做了屏蔽)

alipay://alipayclient/?{"dataString":"h5_route_token="xxxxxxxxxxxxx"&is_h5_route="true"","requestType":"SafePay","fromAppUrlScheme":"alipays"}

也有fromAppUrlScheme這個(gè)參數(shù),而且默認(rèn)是支付寶APP的URLScheme:alipays霞揉。

對比一下發(fā)現(xiàn)旬薯,SDK中傳入的schemeStr參數(shù)對應(yīng)就是alipay:// 中的 fromAppUrlScheme字段。

由此樓主猜測适秩,在 alipay:// 打開支付寶時(shí)绊序,傳入 fromAppUrlScheme,支付結(jié)束后就會(huì)跳到對應(yīng)的APP秽荞。

最終骤公,樓主在自己的項(xiàng)目中驗(yàn)證了上述猜測。

總結(jié)下吧

最終解決方案

方案一

接支付寶提供的SDK扬跋,schemeStr參數(shù)傳入自己APP的URLScheme即可阶捆。 具體的手機(jī)網(wǎng)站支付轉(zhuǎn)Native支付

方案二

不需要接SDK,不需要添加支付寶白名單胁住,webView攔截alipay://alipayclient請求趁猴,追加或修改參數(shù) fromAppUrlScheme為你自己的URLScheme值(這一步可沒那么簡單刊咳,自己動(dòng)手吧彪见,偷笑),生成新的NSURL娱挨,然后用 [[UIApplication sharedApplication] openURL:] 打開即可余指。

2018.5.24更新(上面看懂了下面這段可以不用看)

總有人私信我問我怎么追加fromAppUrlScheme。可能是我說的"webView攔截"酵镜,讓初學(xué)者不明白吧碉碉,簡單提一下。

在webView"發(fā)起請求的代理方法"里面攔截請求的URL淮韭,即如果請求是alipay://alipayclient開頭的垢粮,說明這個(gè)請求就跳轉(zhuǎn)支付寶的請求。替換里面fromAppUrlScheme的值為你自己的scheme值靠粪。(當(dāng)然如果更嚴(yán)謹(jǐn)?shù)脑捓桑瑧?yīng)該是判斷fromAppUrlScheme這個(gè)key是否存在,存在則替換其值占键,不存在則追加)昔善。用替換好的字符串生成一個(gè)NSURL,用[[UIApplication sharedApplication] openURL:newURL]跳轉(zhuǎn)支付寶畔乙。代理方法返回NO君仆,即終止這次請求。

常見問題

1.支付后沒有返回app而是跳到了Safari

原因:你的Xcode配置里面URLSheme沒寫或者寫錯(cuò)了牲距,和支付寶請求參數(shù)中的fromAppUrlScheme不一致返咱。

解決:Xcode配置中新增或者修改URLSheme,確保和alipay://alipayclient請求參數(shù)中的fromAppUrlScheme一致牍鞠。

2.并沒有看到作者說的alipay: //alipayclient

原因:可能你的app不是在客戶端直接和支付寶通信洛姑,而是中間加了一道跳轉(zhuǎn)到網(wǎng)頁,由你的后臺(tái)(或前端)調(diào)起支付寶皮服。所以你是攔截不到這個(gè)請求的楞艾。我文中所說的方式是基于,“客戶端->支付寶” 這種模式龄广,而你的是“客戶端->Safari->支付寶”模式硫眯,后者無法按照文中說述實(shí)現(xiàn)返回app。

解決:方案1择同,修改你的支付模式為“客戶端->支付寶”两入,這樣改動(dòng)恐怕有點(diǎn)大,工作量主要在你們后臺(tái)敲才。方案2裹纳,在不改模式的情況下,需要后臺(tái)(或前端)的同事去解決這個(gè)問題紧武,原理和本文差不多剃氧,在后臺(tái)和支付寶通訊的參數(shù)中找到一個(gè)類似于fromAppUrlScheme的參數(shù),然后將這個(gè)參數(shù)修改成你的app的URLScheme阻星,至于具體怎處理樓主沒做研究朋鞍,如果你有好的方法,可以分享一下。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末滥酥,一起剝皮案震驚了整個(gè)濱河市更舞,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌坎吻,老刑警劉巖缆蝉,帶你破解...
    沈念sama閱讀 207,113評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瘦真,居然都是意外死亡返奉,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評(píng)論 2 381
  • 文/潘曉璐 我一進(jìn)店門吗氏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來芽偏,“玉大人,你說我怎么就攤上這事弦讽∥畚荆” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵往产,是天一觀的道長被碗。 經(jīng)常有香客問我,道長仿村,這世上最難降的妖魔是什么锐朴? 我笑而不...
    開封第一講書人閱讀 55,449評(píng)論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蔼囊,結(jié)果婚禮上焚志,老公的妹妹穿的比我還像新娘。我一直安慰自己畏鼓,他們只是感情好酱酬,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評(píng)論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著云矫,像睡著了一般膳沽。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上让禀,一...
    開封第一講書人閱讀 49,166評(píng)論 1 284
  • 那天挑社,我揣著相機(jī)與錄音,去河邊找鬼巡揍。 笑死痛阻,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的吼肥。 我是一名探鬼主播录平,決...
    沈念sama閱讀 38,442評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼麻车,長吁一口氣:“原來是場噩夢啊……” “哼缀皱!你這毒婦竟也來了斗这?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,105評(píng)論 0 261
  • 序言:老撾萬榮一對情侶失蹤啤斗,失蹤者是張志新(化名)和其女友劉穎表箭,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體钮莲,經(jīng)...
    沈念sama閱讀 43,601評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡免钻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了崔拥。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片极舔。...
    茶點(diǎn)故事閱讀 38,161評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖链瓦,靈堂內(nèi)的尸體忽然破棺而出拆魏,到底是詐尸還是另有隱情,我是刑警寧澤慈俯,帶...
    沈念sama閱讀 33,792評(píng)論 4 323
  • 正文 年R本政府宣布渤刃,位于F島的核電站,受9級(jí)特大地震影響贴膘,放射性物質(zhì)發(fā)生泄漏卖子。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評(píng)論 3 307
  • 文/蒙蒙 一刑峡、第九天 我趴在偏房一處隱蔽的房頂上張望洋闽。 院中可真熱鬧,春花似錦突梦、人聲如沸喊递。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽骚勘。三九已至,卻和暖如春撮奏,著一層夾襖步出監(jiān)牢的瞬間俏讹,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評(píng)論 1 261
  • 我被黑心中介騙來泰國打工畜吊, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留泽疆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,618評(píng)論 2 355
  • 正文 我出身青樓玲献,卻偏偏與公主長得像殉疼,于是被迫代替她去往敵國和親梯浪。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評(píng)論 2 344