WKUIDelegate協議 - 手機網站支付轉Native支付

一:介紹

爲了節約開發成本,不少Native-H5混合App採用手機網站支付的方式去實現支付模塊。但手機網站支付的網絡依賴比較嚴重,也一般須要通過更多的驗證,這種種緣由致使手機網站支付的成功率比Native支付低,對商戶的利益形成影響。c++

官方文檔使用的是UIWebViewDelegate協議web

二:新舊版本區別

1. 舊版本

獲取到的url order info,從h5連接中獲取訂單串接口函數以下:api

- (NSString*)fetchOrderInfoFromH5PayUrl:(NSString*)urlStr;
- (void)payUrlOrder:(NSString *)orderStr
         fromScheme:(NSString *)schemeStr
           callback:(CompletionBlock)completionBlock;
複製代碼

上面兩個函數自版本15.4.0起已廢棄。bash

2. 新版本

新版本推薦使用下面方法微信

/**
 *  從h5連接中獲取訂單串並支付接口(自版本15.4.0起,推薦使用該接口)
 *
 *  @param urlStr     攔截的 url string
 *
 *  @return YES爲成功獲取訂單信息併發起支付流程;NO爲沒法獲取訂單信息,輸入url是普通url
 */
- (BOOL)payInterceptorWithUrl:(NSString *)urlStr
                   fromScheme:(NSString *)schemeStr
                     callback:(CompletionBlock)completionBlock;
複製代碼

舊版本在官方推薦的UIWebViewDelegate協議中使用,暫時沒有遇到問題。網絡

若是在WKUIDelegate協議中使用fetchOrderInfoFromH5PayUrl函數,得到的獲取到的url order info爲空,沒法調起支付。併發

下面我就給你們介紹一下使用WKUIDelegate協議怎麼解決手機網站支付轉Native支付。app

三:SDK導入流程

1.下載sdk

把iOS包中的壓縮文件中如下文件拷貝到項目文件夾下,並導入到項目工程中。ide

AlipaySDK.bundle
AlipaySDK.framework
複製代碼

2.添加依賴

在Build Phases選項卡的Link Binary With Libraries中,增長如下依賴:函數

h5alipay.png

注意:

若是是Xcode 7.0以後的版本,須要添加libc++.tbd、libz.tbd。

若是是Xcode 7.0以前的版本,須要添加libc++.dylib、libz.dylib。

四:使用說明:

1.頭文件引用

在須要調用AlipaySDK的文件中,增長頭文件引用。

#import <AlipaySDK/AlipaySDK.h>

#define SCREEN_WIDTH [UIScreen mainScreen].bounds.size.width
#define SCREEN_HEIGHT [UIScreen mainScreen].bounds.size.height
@interface ViewController ()<WKNavigationDelegate,WKUIDelegate>

@property (weak, nonatomic) WKWebView *webView;
//進度條
@property (weak, nonatomic) CALayer *progresslayer;

@end
複製代碼

//初始化

- (void)stopRunning{
    
    WKWebView *webView = [[WKWebView alloc]initWithFrame:CGRectMake(0, 64, SCREEN_WIDTH, SCREEN_HEIGHT-64)];
    
    [self.view addSubview:webView];
    self.webView = webView;
    
    webView.navigationDelegate = self;
    webView.UIDelegate = self;
    
    //添加屬性監聽
    [webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
    
    //進度條
    UIView *progress = [[UIView alloc]initWithFrame:CGRectMake(0, 64, CGRectGetWidth(self.view.frame), 3)];
    progress.backgroundColor = [UIColor clearColor];
    [self.view addSubview:progress];
    CALayer *layer = [CALayer layer];
    layer.frame = CGRectMake(0, 0, 0, 3);
    layer.backgroundColor = [UIColor blueColor].CGColor;
    [progress.layer addSublayer:layer];
    self.progresslayer = layer;
    [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:_customLabel.text]]];
     
}
複製代碼

2.調用接口

[[AlipaySDK defaultService]fetchOrderInfoFromH5PayUrl:url]
複製代碼

3.實現WKUIDelegate協議,攔截H5的URL

若是返回的resultCode爲9000,接入方能夠提示用戶支付成功;

返回結果不是9000的狀況,無需作任何處理。若是returnUrl不爲空,建議接入方跳轉到該returnUrl。

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction*)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler {
    
    decisionHandler(WKNavigationActionPolicyAllow);//容許跳轉
    
    NSLog(@"%@",navigationAction.request.URL.absoluteString);
    
    if ([navigationAction.request.URL.absoluteString hasPrefix:@"alipay://alipayclient/"]) {
        decisionHandler(WKNavigationActionPolicyCancel);
        
        if ([[UIApplication sharedApplication] canOpenURL:navigationAction.request.URL]) {
            [[UIApplication sharedApplication] openURL:navigationAction.request.URL options:@{UIApplicationOpenURLOptionUniversalLinksOnly: @NO} completionHandler:^(BOOL success) {
                
                __weak APWebViewController* wself = self;
                BOOL isIntercepted = [[AlipaySDK defaultService] payInterceptorWithUrl:[navigationAction.request.URL absoluteString] fromScheme:@"alisdkdemo" callback:^(NSDictionary *result) {
                    // 處理支付結果
                    NSLog(@"%@", result);
                    // isProcessUrlPay 表明 支付寶已經處理該URL
                    if ([result[@"isProcessUrlPay"] boolValue]) {
                        // returnUrl 表明 第三方App須要跳轉的成功頁URL
                        NSString* urlStr = result[@"returnUrl"];
                        [wself loadWithUrlStr:urlStr];
                    }
                }];
                
                if (isIntercepted) {
                    
                    NSLog(@"URL非支付寶支付URL");
                }
                
                
            }];
        }
    } else {
        decisionHandler(WKNavigationActionPolicyAllow);
    }
}
複製代碼

4.支付結果回調處理

支付寶客戶端返回url處理方法,在AppDelegate.m文件中,增長頭文件引用

#import <AlipaySDK/AlipaySDK.h>
複製代碼

在@implementation AppDelegate中增長以下代碼:

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
 
    //若是極簡開發包不可用,會跳轉支付寶錢包進行支付,須要將支付寶錢包的支付結果回傳給開發包
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    //【因爲在跳轉支付寶客戶端支付的過程當中,商戶app在後臺極可能被系統kill了,因此pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法裏面處理跟callback同樣的邏輯】
            NSLog(@"result = %@",resultDic);
        }];
    }
    if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登受權返回authCode
  
        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【因爲在跳轉支付寶客戶端支付的過程當中,商戶app在後臺極可能被系統kill了,因此pay接口的callback就會失效,請商戶對standbyCallback返回的回調結果進行處理,就是在這個方法裏面處理跟callback同樣的邏輯】
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}
複製代碼

關注 【網羅開發】微信公衆號,網羅天下方法,方便你我開發,更多iOS技術乾貨等待領取,全部文檔會持續更新,歡迎關注一塊兒成長!

但願能夠幫助你們,若有問題可加QQ羣: 668562416 交流

若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議

如需轉載請聯繫我,通過受權方可轉載,謝謝

相關文章
相關標籤/搜索