iOS Developer

基于URL路由层实现第三方支付效果

2017-03-29  本文已影响0人  别舔我丶

第一次写简书的文章,写的不好,请大家多多指教.这几天看了一下关于URL Scheme相关的知识.通过使用这个知识点来实现类似第三方微信支付的效果.我们先来看一下效果图.是用自己的工程去调用一个类似微信的工程.


支付成功

  我们先来了解一个关于类似微信这样的app,提供给别的app调起它的支付,那么他是怎么实现的呢.其实就是通过URL Scheme来调起微信app,同时通过传过来的URL进行定位,跳转到对应的支付页面.在微信工程(工程名:payTestDemo,以下称微信工程,原工程为用户建的工程)的Target中设置Info的URL Types,这个URL Types就是别的App调起我们微信工程的统一的入口.

URL Types

  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

希望朋友们点个星星,

上一篇下一篇

猜你喜欢

热点阅读