产品给了个需求:我们的应用需要接第三方支付(微信和支付宝)

由于我们的APP内需要购买的是虚拟物品(比如金币,钻石等),所以苹果是不让使用第三方支付的,那怎么办嘞?

首先,客户端的第三方支付是肯定接不了的,因为提交应用的时候,苹果会扫描代码。接了客户端版的第三方支付,后果很严重啊!

其次,既然要接第三方支付,又不能直接使用客户端去接第三方支付。那结果就很明显了,接网页版的第三方支付。

最后,接网页版的好啊,客户端都不需要啥工作,直接掉一个网页就搞定了,多么美好的生活啊。可惜,事与愿违!

具体的支付代码就略过了,网上一大堆。

问题一:网页版第三方支付如何跳转微信客户端

UIWebView:

不用做任何处理,能够直接调起微信客户端

WKWebView:

需要H5和Native交互

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

{

NSString *url = navigationAction.request.URL.absoluteString;

// WKWebView 处理特殊标签方法

if ([url hasPrefix:@"weixin://"]) {

decisionHandler(WKNavigationActionPolicyCancel);

[[UIApplication sharedApplication] openURL:[NSURL URLWithString:url]];

}

}

问题二:支付成后如何返回APP

这一步比较麻烦。不管是UIWebView还是WKWebView,支付成功或失败时都是返回safari的一个页面。不会直接返回APP。

可能是遇到的情况不同吧,按照参考链接的步骤并没有解决我的问题,还是不能跳转到APP。但是这也给了我一下参考。

创建一个UIWebView的子类

.h

#import

@interface TDWeChatPayH5View : UIView

- (void)loadingURL:(NSString *)url;

@end

.m

#import "TDWeChatPayH5View.h"

@interface TDWeChatPayH5View ()

@property (strong, nonatomic) UIWebView *myWebView;

@end

@implementation TDWeChatPayH5View

- (instancetype)initWithFrame:(CGRect)frame

{

self = [super initWithFrame:frame];

if (self) {

self.myWebView = [[UIWebView alloc] initWithFrame:self.frame];

self.myWebView.delegate = self;

[self addSubview:self.myWebView];

}

return self;

}

- (void)loadingURL:(NSString *)url

{

NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];

[self.myWebView loadRequest:request];

}

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType

{

NSURL *url = [request URL];

NSString *newUrl = url.absoluteString;

NSMutableURLRequest* newRequest = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:30.0];

if ([newUrl hasPrefix:@"weixin://"]) {

self.myWebView = nil;

UIWebView *web = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

[self addSubview:web];

[web loadRequest:newRequest];

return YES;

}

return YES;

}

- (void)webViewDidFinishLoad:(UIWebView *)webView

{

[self removeFromSuperview];

}

- (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

{

[self removeFromSuperview];

}

@end

1.然后在微信支付页面拦截URL进行处理

// WKWebView

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

{

NSString *url = navigationAction.request.URL.absoluteString;

if ([url hasPrefix:@"weixin://"]) {

decisionHandler(WKNavigationActionPolicyCancel);

TDWeChatPayH5View *h5View = [[TDWeChatPayH5View alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

[h5View loadingURL:url];

[self.view addSubview:h5View];

}

}

2.info.plist文件修改

在 URL types中添加

CFBundleURLTypes

CFBundleURLName

com.xxx.xxx

CFBundleURLSchemes

[www.test.com](http://www.test.com)

这里的string是自己定义的,随便填写。但是CFBundleURLSchemes对应的xxx.xxx.com必须是域名形式,而且此域名需要在微信支付平台提前填写好的。

3.服务端修改内容

redirect_url = @"[www.test.com://](www.test.com://)";

相信大家都懂这个意思。我们在safari中输入www.test.com://可以打开我们的应用,前提是在info.plist配置了相应的信息。

这样我们就可以返回APP了。

问题三:返回应用后如何通知用户购买成功或失败

问题又来了,既然是H5支付,那么如何通知用户购买成功或失败呢?

// WKWebView

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(nonnull WKNavigationAction *)navigationAction decisionHandler:(nonnull void (^)(WKNavigationActionPolicy))decisionHandler

{

// WKWebView 处理特殊标签方法

NSString *url = navigationAction.request.URL.absoluteString;

if ([url hasPrefix:@"weixin://"]) {

decisionHandler(WKNavigationActionPolicyCancel);

TDWeChatPayH5View *h5View = [[TDWeChatPayH5View alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];

[h5View loadingURL:url];

[self.view addSubview:h5View];

}else if ([url hasPrefix:@"[www.test.com://](www.test.com://)"]) {

decisionHandler(WKNavigationActionPolicyCancel);

// 上面提到我们需要服务端配置redirect_url = @"[www.test.com://](www.test.com://)"。这里在双斜杠后面我们可以加上查询返回结果的H5页面,H5页面需要的订单号信息由服务端一起配置好。

NSString *payResultUrl = [url substringFromIndex:15];

_linkUrl = [NSString stringWithFormat:@"%@%@",URLHEADER,payResultUrl];

// 配置好完整的结果查询链接,有服务端根据订单号查询结果,并显示页面。

[self loadRequest];

}

微信支付的官方文档中提到:如果在微信客户端停留超过5秒,就会主动调用redirect_url的返回链接。这就会造成还没有支付成功,就调用了结果页。所以我们不要直接配置结果页,而是配置一个结果查询页面,提供查询按钮,让用户返回应用后主动去查询结果。

问题四:如何使苹果支付和第三方支付共存

这里我们采取的是采用同一个链接的方式。即支付页面链接不变,由服务端控制显示苹果支付还是微信支付。

具体的实现需要WKWebView与js交互。

微信链接到服务器端网页,接入网页版微信支付相关推荐

  1. (第三方平台)开发相关,解除80端口占用,微信公众号分享jssdk实现,微信开放平台登录接口接入,2022微信分享接入本地调试,微信分享定制

    一.开发相关 1.平台地址 微信开放平台 QQ互联平台SDK 2.文章收集 来自CSDN兄台的QQ登录使用的教程 微信网站应用开发的详细流程和引导 VueJs单页应用实现微信网页授权及微信分享功能 [ ...

  2. android微信照片,一张能让安卓版微信崩溃的图片

    这两天,有一张 gif 图片在群里疯传,就是下面的这张: 样本文件 md5:653b5f03a500b82a3949740d6aedc0f9 安卓版微信在加载这张图的过程中,会出现闪退,而且概率非常高 ...

  3. C语言微信控制windows电脑代码,Windows电脑版微信实现多开 无需第三方软件(bat命令实现)...

    如何使用电脑同时登录多个微信?由于软件的限制无法让PC端电脑板微信多开.电脑版微信多开很简单,不需要第三方软件,下面就介绍一下如何多开电脑版微信. 操作步骤 1.查看微信安装路径:选中微信程序快捷方式 ...

  4. android微信被隐藏,Android|6.5.10版微信号可以隐藏了|五爷

    原标题:Android|6.5.10版微信号可以隐藏了|五爷 安卓微信用户的们终于可以隐藏自己的微信号了,以下是安卓版本6.5.10的微信,其他版本的可以自行测试以下,苹果用户暂时还没有这项功能. 首 ...

  5. 微信商城二次开发php,php版微信小店API二次开发及使用示例-微信开发

    本文实例讲述了php版微信小店API二次开发及使用方法.分享给大家供大家参考,具体如下: 1. weixiaodian.php页面: class wXd { public $AppID = " ...

  6. 老板到底能不能,监控到电脑版微信聊天?

    这是「进击的Coder」的第 423 篇技术分享 作者:车小胖 来源:车小胖谈网络 " 阅读本文大概需要 3 分钟. " 三个月前其实已经写了一篇,但是在那篇文章里只提到了网页版微 ...

  7. linux安装Wine版微信(正常显示中文,可以发送文件)

    在linux安装微信首推electronic-wechat版微信,该版微信是基于微信网页版做的.安装简单,功能也齐全. 但有些微信账号被安全保护了,登录不了微信网页版,所以用不了electronic- ...

  8. Windows版微信加密存储图片的解密工具GUI程序

    摘要 摘要:本文主要对PC版微信的图片存储加密方式进行了研究,通过探讨图片文件中文件头信息中保存的文件标识字符数据得过程,得出了解密还原为正常图片的方式.并采用UI与业务逻辑分离的模式设计了对非程序员 ...

  9. html5pc转微信小程序,微信电脑版终于支持小程序 新版PC版微信实测

    PC版的微信终于要更新了,这次给用户带来了一个新的实用功能--支持小程序!一起来看看吧.此次PC版微信的升级版本为2.7.0,目前仍处于测试版阶段.PC版微信2.7.0测试版的安装包大小为85.3 M ...

最新文章

  1. EXT.JS的PROXY放在哪里,STORE放在哪里,绝对是个技术活儿啊。
  2. Seamless cloning泊松克隆
  3. 关于Android中的onCreate()多次被调用导致bindService被多次调用的问题...
  4. Chrome 私人珍藏-stylus插件实现个性化百度界面定制
  5. 各种语言速度之比,实验验证Cgojuliajavapythonoctave
  6. mysql 导入sql文件,source命令
  7. (十)数据结构之“堆”
  8. 如何判断用户使用的模拟器还是真正的安卓设备?
  9. php asrot,PHP项目部署,Composer install Do not run Composer as root/super user!
  10. 【操作系统】虚拟存储器(下)-思维导图
  11. IDEA2019.3 双击启动无反应解决方法
  12. hbase 查询_不用ES也能海量数据复杂查询秒回
  13. 全面详解c语言使用cJSON解析JSON字符
  14. Java发送HttpRequest
  15. oracle中批量修改表,Oracle 批量修改某个用户下表的表空间
  16. java实现线性填充空值_为什么我的Java字符串用空值填充?
  17. Mac上java开发工具
  18. 【黑马Python】(3)
  19. 全国路网数据SHP、全国矢量数据 行政区划边界(省市区县乡镇)、行政地名
  20. 湖畔大学梁宁:比能力重要1000倍的,是你的底层操作系统,与CSDN伙伴们一起共勉!

热门文章

  1. 生产签名进行 Base64 编码
  2. windows优化大师和闪游浏览器
  3. 计算机专业大一学生适合做哪些事情
  4. 全方位解析Telerik平台(一)
  5. 【常识】MySQL怎么读/正确发音
  6. LTDC-DMA2D液晶显示原理(一)
  7. 项目整体流程及各阶段主要任务
  8. 美国人竟然是这样教育小学生(转)
  9. 京东物流出问题了?褥了30块羊毛 浅析系统架构
  10. 头条与百万英雄——划水贴