爲了節約開發成本,不少Native-H5混合App採用手機網站支付的方式去實現支付模塊。但手機網站支付的網絡依賴比較嚴重,也一般須要通過更多的驗證,這種種緣由致使手機網站支付的成功率比Native支付低,對商戶的利益形成影響。c++
官方文檔使用的是UIWebViewDelegate協議web
獲取到的url order info,從h5連接中獲取訂單串接口函數以下:api
- (NSString*)fetchOrderInfoFromH5PayUrl:(NSString*)urlStr;
- (void)payUrlOrder:(NSString *)orderStr
fromScheme:(NSString *)schemeStr
callback:(CompletionBlock)completionBlock;
複製代碼
上面兩個函數自版本15.4.0起已廢棄。bash
新版本推薦使用下面方法微信
/**
* 從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
把iOS包中的壓縮文件中如下文件拷貝到項目文件夾下,並導入到項目工程中。ide
AlipaySDK.bundle
AlipaySDK.framework
複製代碼
在Build Phases選項卡的Link Binary With Libraries中,增長如下依賴:函數
注意:
若是是Xcode 7.0以後的版本,須要添加libc++.tbd、libz.tbd。
若是是Xcode 7.0以前的版本,須要添加libc++.dylib、libz.dylib。
在須要調用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]]];
}
複製代碼
[[AlipaySDK defaultService]fetchOrderInfoFromH5PayUrl: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);
}
}
複製代碼
支付寶客戶端返回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 交流
若是哪裏有什麼不對或者不足的地方,還望讀者多多提意見或建議
如需轉載請聯繫我,通過受權方可轉載,謝謝