app 中要集成H5微信支付,網(wǎng)上有些資料但是寫的很不完整,結(jié)合自己的開(kāi)發(fā)整理一下。
WKWebView為例
開(kāi)始之前先看H5 頁(yè)面在手機(jī)瀏覽器能不能用參考:https://wxpay.wxutil.com/mch/pay/h5.v2.php
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:self.url] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[self.webView loadRequest:request];
這個(gè)加載H5發(fā)起支付的地址,不多說(shuō)
//注冊(cè)通知 回調(diào)用,下面說(shuō)
[[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(payBack) name:@"payReturn" object:nil];
核心部分(主要是吊起微信。?;氐紸PP)
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler
{
NSString *url = navigationAction.request.URL.absoluteString;
if ([url containsString:@"weixin://wap/pay"]) {
self.load = NO;
NSLog(@"-00--%@---%@",navigationAction.request.URL,navigationAction.request.allHTTPHeaderFields);
// 第二步到這 吊起微信支付
[[UIApplication sharedApplication] openURL:navigationAction.request.URL];
decisionHandler(WKNavigationActionPolicyCancel);
}
else if ([url containsString:@"https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?"] && !self.load) {
// 發(fā)起微信支付后先到這里 我們要做的是設(shè)置Referer這個(gè)參數(shù),解決回調(diào)到safari 瀏覽器,而不是APP 問(wèn)題。。(借助URL Scheme 喚起APP 相關(guān)知識(shí))
NSURLRequest *request = navigationAction.request;
NSMutableURLRequest *newRequest = [[NSMutableURLRequest alloc] init];
newRequest.allHTTPHeaderFields = request.allHTTPHeaderFields;
#warning scheme 要改
//Referer這個(gè)參數(shù)。value值是在H5開(kāi)發(fā)者中心填寫的一級(jí)域名,不要加 http,記得加://
[newRequest setValue:@"www.123.com://" forHTTPHeaderField: @"Referer"];
newRequest.URL = request.URL;
//修改完成之后加載
[webView loadRequest:newRequest];
self.load = YES;
decisionHandler(WKNavigationActionPolicyCancel);
} else
{
// 其他請(qǐng)求正常進(jìn)行
decisionHandler(WKNavigationActionPolicyAllow);
}
}
關(guān)于不能回調(diào)到APP,多說(shuō)一句,這個(gè)地址有時(shí)候加了redirect_url這個(gè)回調(diào)的網(wǎng)址,會(huì)回調(diào)瀏覽器,,
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx20161110163838f231619da20804912345&package=1037687096&redirect_url=https%3A%2F%2Fwww.wechatpay.com.cn
我把newRequest.URL 對(duì)字符串處理,,在load 之前把redirect_url參數(shù)去掉,但是這個(gè)值要記錄到一個(gè)全局變量self.reUrl之中,,回調(diào)到APP中做查詢結(jié)果之用
關(guān)于回調(diào)
一般會(huì)發(fā)生白屏情況
//appdelegate 里面方法,,應(yīng)該懂吧
(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{
NSString *urlStr = [NSString stringWithFormat:@"%@",url];
//BUG修改
if([urlStr hasPrefix:@"www.123.com://"]){
//發(fā)送通知
[[NSNotificationCenter defaultCenter] postNotificationName:@"payReturn" object:nil];
return YES;
}
}
// H5支付頁(yè)面方法,別混了
-(void)payBack
{
NSLog(@"支付回來(lái)了----");
// self.reUrl 就是記錄的那個(gè)全局變量,,再次加載,一般做查詢支付是否成功----到此結(jié)束
NSString *str = [self URLDecodedString:self.reUrl];
NSMutableURLRequest* request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:str] cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];
[self.webView loadRequest:request];
}
還有一點(diǎn)

屏幕快照 2019-07-30 下午3.04.51.png
我可以了,,你們看看吧,,有問(wèn)題可以指出來(lái)