轉(zhuǎn)載---iOS支付寶H5支付無(wú)法返回APP解決方案

本文只討論已成功調(diào)起支付寶支付后荆残,無(wú)法返回自己的APP的問(wèn)題稀火,iOS支付寶H5支付不在討論范圍內(nèi)。提供下列參考:
支付寶H5支付官方文檔
支付寶H5支付官方Demo下載Demo使用文檔

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

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

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

what? 官方直接跟我們說(shuō)GG了仑嗅?樓主不甘心宴倍,還是想嘗試一下。
借鑒之前 iOS微信H5支付無(wú)法返回APP解決方案 的經(jīng)驗(yàn)仓技,先在 return_url 這個(gè)參數(shù)上做個(gè)嘗試吧鸵贬。

支付寶和微信不同的是,支付寶的return_url不需要在支付寶管理后臺(tái)備案(填寫(xiě))浑彰,微信的redirect_url是需要的恭理。

第一次嘗試
webView攔截請(qǐng)求https://mapi.alipay.com/gateway.do,修改return_url參數(shù)為自己的URLScheme郭变,比如 URLEncode(A.company.com://)颜价,結(jié)果失敗了,進(jìn)入支付寶報(bào)錯(cuò)的頁(yè)面诉濒。仔細(xì)看了一下請(qǐng)求的其它參數(shù)周伦,居然有個(gè)sign!支付寶文檔上也有這個(gè)參數(shù)未荒,居然校驗(yàn)了參數(shù)簽名的专挪,好吧,客戶端篡改參數(shù)的方案宣告失斊拧寨腔!

第二次嘗試
既然不能篡改,那直接下單的時(shí)候填吧率寡,請(qǐng)求后臺(tái)的同學(xué)協(xié)助一下迫卢,在下單的時(shí)候把return_url參數(shù)改成 URLEncode(A.company.com://),結(jié)果還是失敗了冶共。后臺(tái)同學(xué)提示我乾蛤,return_url必須是HTTP/HTTPS開(kāi)頭每界,支付寶文檔上有說(shuō)明。

第三次嘗試
那加上http試試家卖,我又讓后臺(tái)同學(xué)把return_url改成 URLEncode(httpA.company.com://)眨层,同時(shí)把APP的URLSchemes改成 httpA.company.com,再次嘗試上荡,調(diào)起支付寶返回的時(shí)候打開(kāi)了Safari趴樱,在Safari里面顯示了我們支付中心的錯(cuò)誤頁(yè)面,return_url方案徹底失敗了榛臼!

要不就算了伊佃,跟產(chǎn)品說(shuō)支付寶無(wú)法實(shí)現(xiàn)支付完成后跳回APP,反正支付寶官方文檔上都這么寫(xiě)了沛善。
雖然這么想了航揉,但是我還是繼續(xù)翻看支付寶的文檔,希望能找到點(diǎn)蛛絲馬跡金刁。

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

image

schemeStr,這個(gè)關(guān)鍵字讓我眼前一亮尤蛮。
手機(jī)網(wǎng)站支付轉(zhuǎn)Native支付:支付寶的意思是媳友,我們提供了一個(gè)SDK,你接了之后就可以很方便的實(shí)現(xiàn)H5收銀臺(tái)(即在web上輸入支付寶賬號(hào)密碼支付)到支付寶APP收銀臺(tái)的過(guò)渡产捞。
如果你是一個(gè)"正規(guī)"APP開(kāi)發(fā)者醇锚,至此已經(jīng)可以解決你的問(wèn)題了。按照支付寶文檔接支付寶SDK即可坯临,就能實(shí)現(xiàn)H5支付回調(diào)APP了焊唬。

但,這不是樓主想要的方案看靠,由于工作需求的原因赶促,樓主不想也不敢接支付寶的SDK,怕被蘋(píng)果爸爸審核掃包啊挟炬。如果你的APP"應(yīng)該"用蘋(píng)果支付鸥滨,即使你沒(méi)有用到支付寶的功能,但是包含了支付寶的SDK谤祖,審核被發(fā)現(xiàn)了婿滓,也可能被拒絕的。

繼續(xù)尋找解決辦法粥喜。

下載了支付寶的Demo空幻,試了下確實(shí)可以跳回APP。
樓主琢磨著容客,既然SDK能實(shí)現(xiàn)這個(gè)功能秕铛,說(shuō)明支付寶還是支持的H5支付完成后返回APP功能的,并不是向文檔上說(shuō)的缩挑,"在iOS系統(tǒng)中但两,喚起支付寶App支付完成后,不會(huì)自動(dòng)回到瀏覽器或商戶APP供置。用戶可手工切回到瀏覽器或商戶APP"谨湘,只是支付寶不愿意公開(kāi)而已。

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

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

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

[UIApplication sharedApplication] openURL:]

在Demo工程里搜了一下物遇,沒(méi)有乖仇。但我肯定SDK里面肯定有!

whatever —— Method Swizzling

#import <UIKit/UIKit.h>
#import <objc/runtime.h>

@implementation UIApplication (TrackTimer)

+ (void)load
{
    static dispatch_once_t oneToken;
    dispatch_once(&oneToken, ^{
        SEL mySelector = NSSelectorFromString(@"my_openURL:");
        SEL orginalSelector = NSSelectorFromString(@"openURL:");
        Method myMethod = class_getInstanceMethod([self class], mySelector);
        Method orginalMethod = class_getInstanceMethod([self class], orginalSelector);
        BOOL didAddMethod = class_addMethod([self class], orginalSelector, method_getImplementation(myMethod), method_getTypeEncoding(myMethod));
        if (didAddMethod) {
            class_replaceMethod([self class], mySelector, method_getImplementation(orginalMethod), method_getTypeEncoding(orginalMethod));
        }
        else {
            method_exchangeImplementations(myMethod, orginalMethod);
        }
    });
}

- (void)my_openURL:(NSURL*)url
{
    NSLog(@"%@",url);
    [self my_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://請(qǐng)求的蜀铲,攔截它,看看參數(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蝙茶。
對(duì)比一下發(fā)現(xiàn),SDK中傳入的schemeStr參數(shù)對(duì)應(yīng)就是alipay:// 中的 fromAppUrlScheme字段诸老。
由此樓主猜測(cè)隆夯,在 alipay:// 打開(kāi)支付寶時(shí),傳入 fromAppUrlScheme别伏,支付結(jié)束后就會(huì)跳到對(duì)應(yīng)的APP蹄衷。

最終,樓主在自己的項(xiàng)目中驗(yàn)證了上述猜測(cè)厘肮。
總結(jié)下吧

最終解決方案

方案一

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

方案二

不需要接SDK类茂,不需要添加支付寶白名單耍属,webView攔截 alipay://alipayclient 請(qǐng)求托嚣,追加或修改參數(shù) fromAppUrlScheme為你自己的URLScheme值(這一步可沒(méi)那么簡(jiǎn)單,自己動(dòng)手吧厚骗,偷笑)示启,生成新的NSURL,然后用 [[UIApplication sharedApplication] openURL:] 打開(kāi)即可领舰。

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

總有人私信我問(wèn)我怎么追加fromAppUrlScheme夫嗓。可能是我說(shuō)的"webView攔截"冲秽,讓初學(xué)者不明白吧舍咖,簡(jiǎn)單提一下。
在webView"發(fā)起請(qǐng)求的代理方法"里面攔截請(qǐng)求的URL锉桑,即如果請(qǐng)求是alipay://alipayclient開(kāi)頭的排霉,說(shuō)明這個(gè)請(qǐng)求就跳轉(zhuǎn)支付寶的請(qǐng)求。替換里面fromAppUrlScheme的值為你自己的scheme值刨仑。(當(dāng)然如果更嚴(yán)謹(jǐn)?shù)脑捴E担瑧?yīng)該是判斷fromAppUrlScheme這個(gè)key是否存在,存在則替換其值杉武,不存在則追加)辙诞。用替換好的字符串生成一個(gè)NSURL,用[[UIApplication sharedApplication] openURL:newURL]跳轉(zhuǎn)支付寶轻抱。代理方法返回NO飞涂,即終止這次請(qǐng)求。

作者:CocoaKier
鏈接:http://www.reibang.com/p/0d8dd04fe94e
來(lái)源:簡(jiǎn)書(shū)
簡(jiǎn)書(shū)著作權(quán)歸作者所有祈搜,任何形式的轉(zhuǎn)載都請(qǐng)聯(lián)系作者獲得授權(quán)并注明出處较店。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市容燕,隨后出現(xiàn)的幾起案子梁呈,更是在濱河造成了極大的恐慌,老刑警劉巖蘸秘,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件官卡,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡醋虏,警方通過(guò)查閱死者的電腦和手機(jī)寻咒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)颈嚼,“玉大人毛秘,你說(shuō)我怎么就攤上這事。” “怎么了叫挟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵艰匙,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我霞揉,道長(zhǎng)旬薯,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任适秩,我火速辦了婚禮,結(jié)果婚禮上硕舆,老公的妹妹穿的比我還像新娘秽荞。我一直安慰自己,他們只是感情好抚官,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布扬跋。 她就那樣靜靜地躺著,像睡著了一般凌节。 火紅的嫁衣襯著肌膚如雪钦听。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天倍奢,我揣著相機(jī)與錄音朴上,去河邊找鬼。 笑死卒煞,一個(gè)胖子當(dāng)著我的面吹牛痪宰,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播畔裕,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼衣撬,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了扮饶?” 一聲冷哼從身側(cè)響起具练,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎甜无,沒(méi)想到半個(gè)月后扛点,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毫蚓,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年占键,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片元潘。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡畔乙,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出翩概,到底是詐尸還是另有隱情牲距,我是刑警寧澤返咱,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站牍鞠,受9級(jí)特大地震影響咖摹,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜难述,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一萤晴、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧胁后,春花似錦店读、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至侣诺,卻和暖如春殖演,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背年鸳。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工趴久, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人阻星。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓朋鞍,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親妥箕。 傳聞我的和親對(duì)象是個(gè)殘疾皇子滥酥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 此項(xiàng)目已開(kāi)源 趕快來(lái)圍觀 Start支持下吧 【客戶端開(kāi)源地址-JPay】【服務(wù)端端開(kāi)源地址-在com.javen...
    LucasAdam閱讀 1,938評(píng)論 0 3
  • 整個(gè)支付邏輯分為兩個(gè)部分 對(duì)訂單模型order的總結(jié) 訂單模型中分為兩個(gè)部分商品模型 訂單模型 快速完成支付功能步...
    winlee閱讀 13,128評(píng)論 4 7
  • 1. App支付iOS集成 按照支付寶的官方文檔就可以集成,很順利畦幢。但是有16處warning坎吻。 warning:...
    從你的全世界路過(guò)哈哈哈哈閱讀 2,252評(píng)論 4 0
  • 1.去支付寶官網(wǎng)下載官方Demo,把a(bǔ)ppid和私鑰寫(xiě)入宇葱,驗(yàn)證拿到的賬號(hào)信息是否正確瘦真。之前接入支付寶的時(shí)候,就是因...
    小胖QAQ閱讀 1,989評(píng)論 0 3
  • 1黍瞧、人在企業(yè)會(huì)有三種角色 執(zhí)行者:給出結(jié)果的人 管理者:通過(guò)他人完成工作的人 領(lǐng)導(dǎo)者:通過(guò)營(yíng)造氣氛提升工作績(jī)效的人...
    鐸悅教育集團(tuán)閱讀 676評(píng)論 0 0