美文网首页iOS Developer
基于URL路由层实现第三方支付效果

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

作者: 别舔我丶 | 来源:发表于2017-03-29 20:36 被阅读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

    希望朋友们点个星星,

    相关文章

      网友评论

        本文标题:基于URL路由层实现第三方支付效果

        本文链接:https://www.haomeiwen.com/subject/lvfyottx.html