接入網(wǎng)頁版微信支付

產(chǎn)品給了個(gè)需求:我們的應(yīng)用需要接第三方支付(微信和支付寶)

由于我們的APP內(nèi)需要購買的是虛擬物品(比如金幣,鉆石等),所以蘋果是不讓使用第三方支付的,那怎么辦嘞?

首先,客戶端的第三方支付是肯定接不了的,因?yàn)樘峤粦?yīng)用的時(shí)候,蘋果會(huì)掃描代碼。接了客戶端版的第三方支付,后果很嚴(yán)重?。?/p>

其次,既然要接第三方支付,又不能直接使用客戶端去接第三方支付。那結(jié)果就很明顯了,接網(wǎng)頁版的第三方支付。

最后,接網(wǎng)頁版的好啊,客戶端都不需要啥工作,直接掉一個(gè)網(wǎng)頁就搞定了,多么美好的生活啊。可惜,事與愿違!

具體的支付代碼就略過了,網(wǎng)上一大堆。

問題一:網(wǎng)頁版第三方支付如何跳轉(zhuǎn)微信客戶端

UIWebView:

不用做任何處理,能夠直接調(diào)起微信客戶端

WKWebView:

需要H5和Native交互

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

{

    NSString *url = navigationAction.request.URL.absoluteString;

    // WKWebView 處理特殊標(biāo)簽方法

    if ([url hasPrefix:@"weixin://"]) {

        decisionHandler(WKNavigationActionPolicyCancel);

        [[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

    }

}

問題二:支付成后如何返回APP

這一步比較麻煩。不管是UIWebView還是WKWebView,支付成功或失敗時(shí)都是返回safari的一個(gè)頁面。不會(huì)直接返回APP。

這里參考

可能是遇到的情況不同吧,按照參考鏈接的步驟并沒有解決我的問題,還是不能跳轉(zhuǎn)到APP。但是這也給了我一下參考。

創(chuàng)建一個(gè)UIWebView的子類

.h

#import <UIKit/UIKit.h>

@interface TDWeChatPayH5View : UIView

- (void)loadingURL:(NSString *)url;

@end

.m

#import "TDWeChatPayH5View.h"

@interface TDWeChatPayH5View ()<UIWebViewDelegate>

@property (strong, nonatomic) UIWebView *myWebView;

@end

@implementation TDWeChatPayH5View

- (instancetype)initWithFrame:(CGRect)frame

{

    self = [super initWithFrame:frame];

    if (self) {

        self.myWebView = [[UIWebView alloc] initWithFrame:self.frame];

        self.myWebView.delegate = self;

        [self addSubview:self.myWebView];

    }

    return self;

}

- (void)loadingURL:(NSString *)url

{

    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];

    [self.myWebView loadRequest:request];

}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

    NSURL *url = [request URL];

    NSString *newUrl = url.absoluteString;

    NSMutableURLRequest* newRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];

    if ([newUrl hasPrefix:@"weixin://"]) {

        self.myWebView = nil;

        UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

        [self addSubview:web];

        [web loadRequest:newRequest];

        return YES;

    }

    return YES;

}

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

    [self removeFromSuperview];

}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

{

    [self removeFromSuperview];

}

@end

1.然后在微信支付頁面攔截URL進(jìn)行處理

// WKWebView

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

{

    NSString *url = navigationAction.request.URL.absoluteString;

    if ([url hasPrefix:@"weixin://"]) {

        decisionHandler(WKNavigationActionPolicyCancel);

        TDWeChatPayH5View *h5View = [[TDWeChatPayH5View alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

        [h5View loadingURL:url];

        [self.view addSubview:h5View];

    }

}

2.info.plist文件修改

在 URL types中添加

<key>CFBundleURLTypes</key>

<array>

    <dict>

        <key>CFBundleURLName</key>

        <string>com.xxx.xxx</string>

        <key>CFBundleURLSchemes</key>

        <array>

            <string>[www.test.com](http://www.test.com)</string>

        </array>

    </dict>

</array>

這里的string是自己定義的,隨便填寫。但是CFBundleURLSchemes對應(yīng)的xxx.xxx.com必須是域名形式,而且此域名需要在微信支付平臺(tái)提前填寫好的。

3.服務(wù)端修改內(nèi)容

redirect_url = @"[www.test.com://](www.test.com://)";

相信大家都懂這個(gè)意思。我們在safari中輸入www.test.com://可以打開我們的應(yīng)用,前提是在info.plist配置了相應(yīng)的信息。

這樣我們就可以返回APP了。

問題三:返回應(yīng)用后如何通知用戶購買成功或失敗

問題又來了,既然是H5支付,那么如何通知用戶購買成功或失敗呢?

// WKWebView

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

{

    // WKWebView 處理特殊標(biāo)簽方法

    NSString *url = navigationAction.request.URL.absoluteString;

    if ([url hasPrefix:@"weixin://"]) {

        decisionHandler(WKNavigationActionPolicyCancel);

        TDWeChatPayH5View *h5View = [[TDWeChatPayH5View alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

        [h5View loadingURL:url];

        [self.view addSubview:h5View];

    }else if ([url hasPrefix:@"[www.test.com://](www.test.com://)"]) {

        decisionHandler(WKNavigationActionPolicyCancel);

        // 上面提到我們需要服務(wù)端配置redirect_url = @"[www.test.com://](www.test.com://)"。這里在雙斜杠后面我們可以加上查詢返回結(jié)果的H5頁面,H5頁面需要的訂單號(hào)信息由服務(wù)端一起配置好。

        NSString *payResultUrl = [url substringFromIndex:15];

        _linkUrl = [NSString stringWithFormat:@"%@%@",URLHEADER,payResultUrl];

        //  配置好完整的結(jié)果查詢鏈接,有服務(wù)端根據(jù)訂單號(hào)查詢結(jié)果,并顯示頁面。

        [self loadRequest];

    }
微信支付的官方文檔中提到:如果在微信客戶端停留超過5秒,就會(huì)主動(dòng)調(diào)用redirect_url的返回鏈接。這就會(huì)造成還沒有支付成功,就調(diào)用了結(jié)果頁。所以我們不要直接配置結(jié)果頁,而是配置一個(gè)結(jié)果查詢頁面,提供查詢按鈕,讓用戶返回應(yīng)用后主動(dòng)去查詢結(jié)果。

問題四:如何使蘋果支付和第三方支付共存

這里我們采取的是采用同一個(gè)鏈接的方式。即支付頁面鏈接不變,由服務(wù)端控制顯示蘋果支付還是微信支付。

具體的實(shí)現(xiàn)需要WKWebView與js交互。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 15,036評(píng)論 4 61
  • WebSocket-Swift Starscream的使用 WebSocket 是 HTML5 一種新的協(xié)議。它實(shí)...
    香橙柚子閱讀 24,696評(píng)論 8 183
  • Honey . 楽 2006-12-17 17:38 真心游戲你敢玩嗎? 要玩的游戲規(guī)則:是每個(gè)回復(fù)者都必須回答樓...
    47fec8ee8117閱讀 406評(píng)論 0 0
  • 1.博庫書城門口就有明顯的內(nèi)部指示圖,方便顧客查詢位置。影城大廳可以擺放此類內(nèi)部示意圖,方便顧客查詢每個(gè)廳的位置,...
    隔壁老王啊啊閱讀 571評(píng)論 0 0
  • 我喜歡一切美好的事物。 我喜歡四季。喜歡初春時(shí)節(jié)柳枝上的第一抹嫩黃,喜歡盛夏的酷暑里樹蔭的清涼,喜歡中秋時(shí)節(jié)隨風(fēng)而...
    初心和始終閱讀 373評(píng)論 0 3

友情鏈接更多精彩內(nèi)容