iOS 手機網站支付轉Native支付(使用WKUIDelegate協議獲取url)

weixin_34337265發表於2017-07-04

為了節約開發成本,很多Native-H5混合App採用手機網站支付的方式去實現支付模組。但手機網站支付的網路依賴比較嚴重,也通常需要經過更多的驗證,這種種原因導致手機網站支付的成功率比Native支付低,對商戶的利益造成影響。

官方使用方法,UIWebViewDelegate協議
下面我就給大家介紹一下使用WKUIDelegate協議怎麼解決手機網站支付轉Native支付:

一:sdk匯入流程請檢視

二:使用說明:
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) {
                
                NSString *orderInfo = [[AlipaySDK defaultService]fetchOrderInfoFromH5PayUrl:navigationAction.request.URL.absoluteString];
                NSLog(@"orderInfo----%@",orderInfo);
                
                if (orderInfo.length > 0) {
                    // 呼叫支付介面進行支付
                    [[AlipaySDK defaultService]payUrlOrder:orderInfo fromScheme:@"alisdkdemo" callback:^(NSDictionary* result) {
                        // 處理返回結果
                        NSString* resultCode = result[@"resultCode"];
                        //建議操作: 根據resultCode做處理
                        
                        NSLog(@"%@",resultCode);
                        
                        // returnUrl 代表 第三方App需要跳轉的成功頁URL
                        NSString* returnUrl = result[@"returnUrl"];
                        
                        NSLog(@"第三方url----%@",returnUrl);
                        //建議操作: 開啟returnUrl
                    }];
                    
                }
                
            }];
        }
    } 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技術交流群:668562416

2829694-48307b4d71bc5800.jpg

相關文章