iOS 微信 sdk 支付回调:universal link 与 url scheme 详解

2024-06-05
来源:网络整理

背景:

iOS微信SDK1.8.7及以上版本使用苹果推荐的链接实现支付完成(成功、失败、取消)回调。

Link 和 url 是在应用程序之间跳转的两种方式。

网址

在你的项目中配置URL,以便其他APP可以跳转到你的APP,URL需要唯一,如果和其他APP或者系统APP相同则不会跳转,在项目中配置:

这里的配置是为了让支付宝和微信支付完成后可以跳转回自己的APP。

支付宝或者微信支付完成后,支付结果会传到我们的APP,需要在下面方法中进行回调处理。

这里有个疑问:我们使用的插件,微信插件和支付宝插件是两个独立的插件,所以

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options

这个方法会回调,会不会冲突?如果支付宝的回调走到微信插件的回调,那么下面这个方法会返回NO。因为支付宝的回调URL是以“://”开头的,如果这里返回NO,那么自然会走到支付宝插件里的这个方法,在那里返回YES。这个方法返回NO,也就是不处理URL回调。微信回调也是一样。

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *, id> *)options {     return [WXApi handleOpenURL:url delegate:[FluwxResponseHandler defaultManager]]; }

下面的示例展示了其他应用如何跳转到我们的应用。以下是跳转代码:

当然,你首先需要像上面那样配置URL:

同时需要将URL加入白名单,://后面还可以带参数

#pragma mark - DemoA -> MyApp - (IBAction)jumpToMyApp:(id)sender { NSString *urlString = @"MyAppScheme://";//没有参数 NSURL *url = [NSURL URLWithString:urlString]; if ([[UIApplication sharedApplication] canOpenURL:url]) { [[UIApplication sharedApplication] openURL:url options:@{} completionHandler:^(BOOL success) { }]; } else { [self showMessage:@"没有该应用"]; } }

如何添加白名单:

这里有个疑问:很多APP都接入了支付宝和微信的SDK,为什么支付宝和微信APP不需要注册其他APP的白名单呢?原因如下:

关联

苹果在应用程序之间跳转的新方法

一个广泛使用的例子:用户将某APP内的某内容分享到微信,当用户在微信聊天中点击这个(链接),例如:?id=1…,就能直接跳转到APP内的个人主页页面!但微信会检测这个链接,禁止跳转。一般的解决办法是提示用户在微信浏览器网页中打开该网页,然后在网页中打开该网页,就能直接跳转到APP内。

配置步骤:

1.在公司官网服务器和域名(尽量使用一级域名)下新建一个.well-文件夹(苹果建议新建文件夹!!!)。里面放上-app-site-,记住没有后缀。文件内容为json格式,建议使用在线编辑。

2.在苹果开发者账户后台打开。

3、添加。

4.代码中处理链接跳转:

//universal link的处理方式 - (BOOL)application:(UIApplication *)application continueUserActivity:(NSUserActivity *)userActivity restorationHandler:(void (^)(NSArray * _Nonnull))restorationHandler{         return [WXApi handleOpenUniversalLink:userActivity delegate:[FluwxResponseHandler defaultManager]]; }

link 的原理是,当用户第一次安装 app 并打开 app 时,会从配置的地址(即公司官网一级域名)拉取 -app-site- 文件并注册到系统中,这样就形成了 link 连接和 app id 的对应关系。这样在(下拉)或者备忘录里,点击链接就能直接打开 app 了。

问题是:如果用户安装完app后第一次打开,由于各种原因(网络不好等)导致-app-site-文件没有被拉取,网上写着苹果系统会在适当的时候拉取这个文件。

对服务器上的-app-site-进行更新不会导致iOS本地的-app-site-进行同步更新,也就是说iOS只会在App首次启动时请求一次,除非App更新或者重新安装,否则每次打开都不会请求-app-site-。

当其他APP获取到我们的链接后,如何使用代码进行跳转:

[[UIApplication sharedApplication] openURL:@"universal link" options:@{         UIApplicationOpenURLOptionUniversalLinksOnly:@YES     } completionHandler:nil];

Only 设置为YES,意思是你打开一个http或者URL,如果APP没有安装,那么就返回失败,打不开。这个是为了防止一些APP广告。如果只是在APP之间跳转,那么就设置为NO,因为应用跳转不能是合法的URL,而且APP之间跳转不要加特殊符号,字母就行。比如你要跳转到zyyc这个APP,就不要写成这种格式。我被骗了一天,加了白名单也没用……

另外需要注意的是,微信支付回调处理需要同时处理link和url,以兼容新旧版本的微信客户端。

我公司应用程序的-app-site-file:

至于其他APP或者H5,只要链接使用了我们公司域名//***,就可以跳转到我们的APP。***可以用来区分不同的APP和H5。比如我们在微信开放平台注册的链接是:

当然你也可以在-app-site-文件中为不同的第三方配置多个不同的路径。

微信

微信SDK,免密码签名,必须使用link方式。

微信支付和微信H5跳转APP都可以使用URL和链接两种方式,在调试过程中发现,两种方式都配置的时候,还是使用URL的方式。

微信内H5跳转APP,使用开放标签

iOS冷启动杀毒后,微信H5跳转App需要获取启动URL

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {     if (launchOptions != nil) {         NSURL *url = (NSURL *)launchOptions[UIApplicationLaunchOptionsURLKey];         _launchURL = [url absoluteString];     }     return YES; }

参考文章:

分享