第一次写的文章,写的不好,请大家多多指教.这几天看了一下关于URL Scheme相关的知识.通过使用这个知识点来实现类似第三方微信支付的效果.我们先来看一下效果图.是用自己的工程去调用一个类似微信的工程.
我们先来了解一个关于类似微信这样的app,提供给别的app调起它的支付,那么他是怎么实现的呢.其实就是通过URL Scheme来调起微信app,同时通过传过来的URL进行定位,跳转到对应的支付页面.在微信工程(工程名:payTestDemo,以下称微信工程,原工程为用户建的工程)的Target中设置Info的URL Types,这个URL Types就是别的App调起我们微信工程的统一的入口.
app在启动的时候都会注册自己的URL Types,我们可以利用浏览器来测试URL Types是否有效.在地址栏上面输入我们的URL链接.例如:payDemo:// ,浏览器可以帮我们调起微信工程,通过URLTypes来唤起app的时候,我们又是怎么才能够定位到相应的界面呢.下面我们就来聊聊URL Scheme.
我们在app启动的时候,会先初始化app,我在MainTabController这个类中.创建导航的时候监听了"payDemo"这个命名空间.
[[LLPayRoute llPayRoute] monitorRouteWithNameSpace:@"payDemo" routeType:@"viewController&paycount&shopID" handler:^(NSDictionary*params) {
if ([params[@"viewController"] isEqualToString:@"PaymentViewController"]) {
Class class = NSClassFromString(params[@"viewController"]);
PaymentViewController *vc = [[class alloc]init];
vc.payCount = params[@"paycount"]; //获取支付金额
vc.shopID = params[@"shopID"]; //获取对应的商家ID 类似微信开放平台上的商家ID 作为支付成功之后的返回路径.
[nav pushViewController:vc animated:YES];
}];
通过注册"payDemo"这个命名,在收到一条对应payDemo://的请求的时候.就会执行handler中的Block方法,需要注意的是routeType参数需要和请求参数一一对应.routType是一个请求模板,请求的链接需要满足这个模板才能执行回调的Block.
app在获取到一条请求链接的时候,会在AppDelegate中调用一个方法,
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary*)options {
NSString *str = url.absoluteString; //获取当前链接
NSArray *urlArray = [str componentsSeparatedByString:@"://"]; //获取参数和命名空间
if (urlArray.count > 1) {
[[LLPayRoute routeWihtNameSpace:urlArray[0]] sendRouteURLString:urlArray[1]]; //发送路由请求
}
return YES;
}
在这个方法中是可以获取到当前请求的链接,LLPayRoute是一个处理路由请求的类.小伙伴导出我的项目的时候可以自己看看,有时间的话,我也会写一下关于我的路由处理的思路.通过分割链接,例如请求的链接是:payDemo://PaymentViewController&500&payShopID777,分割链接.得到一个是payDemo的命名空间以及一串参数.通过sendRoutURL这个方法.发送事件.之后调起仿的微信支付.
支付完成之后,通过调用openURL回到你自己工程,同时返回的对应成功或失败的状态码进行处理.原工程在调起微信工程的时候,有把对应的原工程的URL Types作为参数传到微信工程.取的微信工程的URL Types作为返回链接的协议首部,例如:payShopID777.
[[UIApplication sharedApplication]openURL:[NSURL URLWithString:[NSString stringWithFormat:@"%@://200",self.shopID]]]; // 200支付成功 500失败.
同时在原工程也需要获得微信工程返回的状态码进行回调.在原工程的APPDelegate类中,实现
openURL这个方法.于微信工程中类似,此处就不进行封装了.
[[LLPayRoute llPayRoute]monitorRouteWithNameSpace:@"payShopID777" routeType:@"status" handler:^(NSDictionary*params) {
if ([params[@"status"] isEqualToString:@"500"]) {
//用户取消
}else if ([params[@"status"] isEqualToString:@"200"]) {
//支付成功
}
}];
以下附上微信工程地址欢迎大家下载:
仿微信支付工程:
github.com/DifficultyToCreatName/ThirdPayDemo
自建工程:
github.com/DifficultyToCreatName/YourSelfProject
希望朋友们点个星星,