iOS 微信H5支付
2019-04-16 本文已影响0人
一亩三分甜
App中引入微信H5支付
1.App中的H5页面打开微信客户端进行支付。一般有两种支付方式,支付宝支付(网页支付)和微信支付(调用客户端支付),选择微信支付后跳转至微信支付。跳转的地址为:

https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx15212526420602e9f8342cea2751269182&package=2390737855&redirect_url=https%3A%2F%2Fqy-h5-dev.xxxxxxxx.cn%2F%3F%26_action%3Dpay%26_token%3DO-PYesBZQOWwwHDob29Akwe6D4OUWeo6%26orderId%3D5cb48556d9773a0007d75057%26payType%3DWX%26success%3Dnull%26fail%3Dnull,
转UTF8编码得到
https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx15212526420602e9f8342cea2751269182&package=2390737855&redirect_url=https://qy-h5-dev.xxxxxxxx.cn/?&_action=pay&_token=O-PYesBZQOWwwHDob29Akwe6D4OUWeo6&orderId=5cb48556d9773a0007d75057&payType=WX&success=null&fail=null。
如果不做任何处理,点击微信支付0.01元后链接为:
weixin://wap/pay?prepayid=wx161116039550534025ab07422230559720&package=3243884962&noncestr=1555384580&sign=a578a86a9f03c1062a231e4ff893e620
跳入微信支付成功后,点击完成会自动打开Safari。


此处链接中的redirect_url是微信支付之后的结果界面,如果在此链接中拼接了redirect_url,那么Safari是一定会被打开的,如果前端拼接了此地址,那么可以让前端来对iOS端区别操作,不拼接redirect_url。当然(自己能做的就自己做)也可以参数截取https://qy-h5-dev.xxxxxxxx.cn/?&_action=pay&_token=O-PYesBZQOWwwHDob29Akwe6D4OUWeo6&orderId=5cb48556d9773a0007d75057&payType=WX&success=null&fail=null。这个链接后面支付完成后需要加载获取支付结果。
2.输入支付密码微信支付完成后,点击完成如何回到App。先注册Scheme,qy-h5-dev.xxxxxxxx.cn。

// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
NSLog(@"decidePolicyForNavigationAction:%@", navigationAction.request.URL);
NSURL *navigationURL = navigationAction.request.URL;
if ([navigationURL.absoluteString containsString:@"wx.tenpay.com"] && [navigationURL.absoluteString containsString:@"redirect_url"]) {
NSURLRequest *request = [self resolveWXH5PayWithRequest:navigationAction.request];
decisionHandler(WKNavigationActionPolicyCancel);
[webView loadRequest:request];
} else if ([navigationURL.absoluteString hasPrefix:@"weixin:"]) {
if([[UIApplication sharedApplication] canOpenURL:navigationURL]) {
[[UIApplication sharedApplication] openURL:navigationURL];
}
//允许跳转
decisionHandler(WKNavigationActionPolicyCancel);
} else if ([navigationURL.absoluteString hasPrefix:@"https://itunes.apple.com"]) {
[[UIApplication sharedApplication] openURL:navigationURL];
//允许跳转
decisionHandler(WKNavigationActionPolicyCancel);
}else{
//允许跳转
decisionHandler(WKNavigationActionPolicyAllow);
}
}
#pragma mark - 微信h5支付处理
- (NSURLRequest *)resolveWXH5PayWithRequest:(NSURLRequest *)request {
NSArray *querys = [request.URL.query componentsSeparatedByString:@"&"];
NSString *redirect_url;
for (NSString *query in querys.reverseObjectEnumerator) {
if ([query hasPrefix:@"redirect_url"]) {
redirect_url = [NSString stringWithFormat:@"&%@",query];
break;
}
}
NSMutableURLRequest *r = request.mutableCopy;
NSString *urlStr = request.URL.absoluteString;
if (redirect_url.length) {
urlStr = [urlStr stringByReplacingOccurrencesOfString:redirect_url withString:@""];
}
r.URL = [NSURL URLWithString:urlStr];
NSDictionary *headers = [r allHTTPHeaderFields];
if (![[headers objectForKey:@"Referer"] isEqualToString:@"qy-h5-dev.xxxxxxxx.cn://"]) {
[r setValue:@"qy-h5-dev.xxxxxxxx.cn://" forHTTPHeaderField:@"Referer"];
}
return r;
}
如果链接中拼接了redirect_url,那么系统会用Safari打开此链接,将此链接相关配置删除之后,在请求头部添加Referer之后,那么将会打开Referer对应的链接。由于我们这里给Referer配置的qy-h5-dev.***.com://协议,之前已经在App中注册了Schemes,那么在Safari打开此协议时将会直接打开App。
到此,支付逻辑可以返回App了,若不注册scheme则无法从微信跳回App。
3.支付结果确认。支付完成后或延时3秒或5秒加载redirect_url或弹窗提示查询支付结果。
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler{
NSLog(@"decidePolicyForNavigationAction:%@", navigationAction.request.URL);
NSURL *navigationURL = navigationAction.request.URL;
if ([navigationURL.absoluteString containsString:@"wx.tenpay.com"] && [navigationURL.absoluteString containsString:@"redirect_url"]) {
NSURLRequest *request = [self resolveWXH5PayWithRequest:navigationAction.request];
decisionHandler(WKNavigationActionPolicyCancel);
[webView loadRequest:request];
} else if ([navigationURL.absoluteString hasPrefix:@"weixin:"]) {
if([[UIApplication sharedApplication] canOpenURL:navigationURL])
{
[[UIApplication sharedApplication] openURL:navigationURL];
}
if ([navigationURL.absoluteString hasPrefix:@"weixin://wap/pay"]) {
dispatch_time_t delayTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC));
dispatch_after(delayTime, dispatch_get_main_queue(), ^{
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"https://qy-h5-dev.xxxxxxxx.cn/?&_action=pay&_token=O-PYesBZQOWwwHDob29Akwe6D4OUWeo6&orderId=5cb48556d9773a0007d75057&payType=WX&success=null&fail=null"]]];
});
}
//允许跳转
decisionHandler(WKNavigationActionPolicyCancel);
} else if ([navigationURL.absoluteString hasPrefix:@"https://itunes.apple.com"]) {
[[UIApplication sharedApplication] openURL:navigationURL];
//允许跳转
decisionHandler(WKNavigationActionPolicyCancel);
}else{
//允许跳转
decisionHandler(WKNavigationActionPolicyAllow);
}
}
查询结果页为调用微信支付之前截取的redirect_url:https://qy-h5-dev.xxxxxxxx.cn/?&_action=pay&_token=O-PYesBZQOWwwHDob29Akwe6D4OUWeo6&orderId=5cb48556d9773a0007d75057&payType=WX&success=null&fail=null。
*打印信息加载url如下:3秒后加载redirect_url进而进行查询弹窗。
2019-04-29 17:53:01.524764+0800 XXXX[3001:1665094] decidePolicyForNavigationAction:weixin://wap/pay?prepayid%3Dwx2917530103893249669ab9092054418457&package=4174633921&noncestr=1556531581&sign=d56faf6b5d124e0a190e601ef8c37086
2019-04-29 17:53:04.480594+0800 XXXX[3001:1665094] decidePolicyForNavigationAction:https://qy-h5-dev.xxxxxxxx.cn/?_action=pay&_token=_u4uksdESS6QlYBbXDJrEA3208rLgT21&orderId=5cc6c96c4dd80e00070343ba&payType=WX&schema=null&success=null&fail=null&_theme=xiaohua&_partner=xiaohua
2019-04-29 17:53:04.671299+0800 XXXX[3001:1665094] decidePolicyForNavigationAction:https://qy-h5-dev.xxxxxxxx.cn/#/pages/pay-next/index?orderId=5cc6c96c4dd80e00070343ba&openid=null&payType=WX&success=null&fail=null
2019-04-29 17:53:06.215915+0800 XXXX[3001:1665094] didFinishNavigation:https://qy-h5-dev.xxxxxxxx.cn/#/pages/pay-next/index?orderId=5cc6c96c4dd80e00070343ba&openid=null&payType=WX&success=null&fail=null