支付功能在app中的实现及支付功能模块化调用流程图

简介: 支付功能在app中的实现及支付功能模块化调用流程图

支付宝IOS2.2.1支付

将Demo中AlipaySDK.bundle AlipaySDK.framework libel.a lib crypto.a openssl Util加入到工程,在需要调用的地方加#import

-(void)apily{


    /*
     *商户的唯一的parnter和seller。
     *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
     */

    /*============================================================================*/
    /*=======================需要填写商户app申请的===================================*/
    /*============================================================================*/
    NSString *partner = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Partner"];
    NSString *seller = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"Seller"];
    NSString *privateKey = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"RSA private key"];
    /*============================================================================*/
    /*============================================================================*/
    /*============================================================================*/

    //partner和seller获取失败,提示
    if ([partner length] == 0 ||
        [seller length] == 0 ||
        [privateKey length] == 0)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                        message:@"缺少partner或者seller或者私钥。"
                                                       delegate:self
                                              cancelButtonTitle:@"确定"
                                              otherButtonTitles:nil];
        [alert show];
        return;
    }

    /*
     *生成订单信息及签名
     */
    //将商品信息赋予AlixPayOrder的成员变量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self.dict valueForKey:@"orderNumber"]; //订单ID(由商家自行制定)
    order.productName =@"标题"; //商品标题
    order.productDescription = @"描述"; //商品描述
    order.amount =self.strMoney; //商品价格
//     order.amount =@"0.01"; //商品价格
    order.notifyURL = @"http://test.testcom.cn:8081/phone/test/shopRechageRequestAlipayResult.htm"; //回调URL

    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay =[CommonUtils getDateForStringTime:[self.dict valueForKey:@"disableTime"] withFormat:nil];
    order.showUrl = @"m.alipay.com";

    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @"mddy";

    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"~~~~~~~~~~~~~~~~~~~~~~~~~~~orderSpec = %@",orderSpec);

    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];

    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];

        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"!!!!reslut = %@",resultDic);
             NSLog(@"@@@memo = %@,resultStatus =%@",[resultDic valueForKey:@"memo"],[resultDic valueForKey:@"resultStatus"]);

            if ([[[resultDic valueForKey:@"resultStatus"] toString]isEqualToString:@"9000"]) {

                [[NSNotificationCenter defaultCenter]postNotificationName:ZHIDURESULT object:self userInfo:@{@"info":@"1"}];
            }else{

                [[NSNotificationCenter defaultCenter]postNotificationName:ZHIDURESULT object:self userInfo:@{@"info":@"0"}];

            }

        }];

    }



}

上面这段代码,payOrder 没有客户端的情况是从这里进的,支付流程中响应事件也是这个方法,但当客户端的时候,auth_V2WithInfo 会进入,响应事件的方法是下面processAuth_V2Result 方法,但是,当payOrder ,auth_V2WithInfo 在一起的时候,会很纠结,结果是wap或者客户端总有一个回调方法不响应,可能是自己搞不清文档的意思,可是你妹的写清楚点行不。然后,wap的时候进入的方法不变,客户端的时候响应方法加上processOrderWithPaymentResult ,你会发现,响应的方法和wap的方法是同一个,好像是把支付流程重新传入了payOrder里边。

#define ZHIDURESULT     @"zhifuResult" //收到支付后发出
RechQueRenViewController.m文件
- (void)viewDidLoad {
    [super viewDidLoad];
    self.navigationController.navigationBar.barTintColor = [UIColor colorWithHex:0xededed];
    self.navigationItem.hidesBackButton = YES;
    UIButton* button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:[UIImage imageNamed:@"backWithTitle.png"] forState:UIControlStateNormal];
    button.frame = CGRectMake(0, 0, 53, 19);
    UIBarButtonItem* rithtBarItem = [[UIBarButtonItem alloc]initWithCustomView:button];
    [button addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = rithtBarItem ;
    button = nil;
    rithtBarItem = nil;

    self.title = @"充值确认";
    self.tableView =[[UITableView alloc]initWithFrame:CGRectMake(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT-64) style:UITableViewStyleGrouped];
    self.tableView.delegate =self;
    self.tableView.dataSource = self;
    [self.view addSubview:self.tableView];
    self.isAiLiPay = YES;

    UIButton* buttonCancel = [UIButton buttonWithType:UIButtonTypeCustom];
    [buttonCancel addTarget:self action:@selector(buttonPressedQueRen) forControlEvents:UIControlEventTouchUpInside];
    [buttonCancel setTitle:@"确认支付" forState:UIControlStateNormal];
    float red = 252/255.0;
    float green = 102/255.0;
    float blue = 5/255.0;
    [buttonCancel setBackgroundColor: [UIColor colorWithRed:red green:green blue:blue alpha:1.0]];
    buttonCancel.layer.cornerRadius = 3;
//    buttonCancel.frame = CGRectMake(16, 195+80+50, WINDOW_WIDTH-32, 44);
//    [self.tableView addSubview:buttonCancel];
    buttonCancel.frame = CGRectMake(16, WINDOW_HEIGHT-44-64-10, WINDOW_WIDTH-32, 44);
    [self.view addSubview:buttonCancel];
    self.tableView.bounces = NO;
    self.isCanPay = YES;
    self.isCanAlert =YES;


    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(zhifuResult:) name:ZHIDURESULT object:nil];
    // Do any additional setup after loading the view.
}
-(void)zhifuResult:(NSString*)result{
    if (self.timer) {
        [self.timer invalidate];
        self.timer = nil;
    }
    if ([result isEqualToString:@"1"]) {
        for (UIViewController* vc in self.navigationController.viewControllers) {
            if ([vc isKindOfClass:[AccountRechargeViewController class]]) {
                [self.navigationController  popToViewController:vc animated:YES];

            }
        }
        [[NSNotificationCenter defaultCenter]postNotificationName:ZHIFUSUCCESS object:self];
    }else{//建行支付失败,返回到支付页面,进行提示
        [self.navigationController popViewControllerAnimated:YES];
        [[NSNotificationCenter defaultCenter]postNotificationName:ZHIDURESULT object:self userInfo:@{@"info":@"0"}];  
    }
}

- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {

    if ([url.host isEqualToString:@"safepay"]) {
//                   
//        [[AlipaySDK defaultService] processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
//            NSLog(@"result = %@",resultDic);
//            NSString *resultStr = resultDic[@"result"];
//            NSLog(@"memo = %@,resultStatus =%@",[resultDic valueForKey:@"memo"],[resultDic valueForKey:@"resultStatus"]);
//                        
//            if ([[[resultDic valueForKey:@"resultStatus"] toString]isEqualToString:@"9000"]) {
//                
//            }else{

//            
//        }];
        [[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);

        }];
    }
//    if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
//        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
//            NSLog(@"result = %@",resultDic);
//        }];
//    }

    return YES;
}

notifyURL 是客户端传给支付宝的,当客户端支付完成后,支付宝会根据这个url异步调用服务端的接口,同步支付结果的数据,这个要服务器给的,确保你的私钥,合作者id是准确的。


建设银行支付

只支持html5的方式访问,建行等N多银行没有提供由生态系统直接实现的SDK,当然html5页面的建行支付需要我们伟大的前端工程师实现了,我们只能通过向服务器发送请求加载html5页面。

注意:html5有四种加载方式。

第一种,在h5页面加入工程,本地加载方式。

第二种,判断本地是否有h5页面文件,若没有向服务发送文件请求,下载h5页面,然后本地加载。

第三种,不经过服务器以加载页面的方式加载页面。

第四种,向服务器发送请求获得html5页面的加载方式。

详细的见博客:http://blog.csdn.net/jia12216/article/details/46966425

下面是以第四种方式加载h5页面为例子。

JianHangWebView.m文件

- (void)viewDidLoad {
    self.title = @"建行卡支付";
    [self jianHangPay];

    self.navigationController.navigationBar.barTintColor = [UIColor colorWithHex:0xededed];
    self.button = [UIButton buttonWithType:UIButtonTypeCustom];
    [self.button setTitle:@"00:00" forState:UIControlStateNormal];
    [self.button setTitleColor:UICOLOR(248, 78, 11, 1) forState:UIControlStateNormal];
    self.button.frame = CGRectMake(0, 0, 53, 19);
    UIBarButtonItem* rithtBarItem = [[UIBarButtonItem alloc]initWithCustomView:self.button];
    self.navigationItem.rightBarButtonItem = rithtBarItem ;
    rithtBarItem = nil;


    self.navigationItem.hidesBackButton = YES;
    UIButton* button1 = [UIButton buttonWithType:UIButtonTypeCustom];
    [button1 setImage:[UIImage imageNamed:@"backWithTitle.png"] forState:UIControlStateNormal];
    button1.frame = CGRectMake(0, 0, 53, 19);
    UIBarButtonItem* leftBarItem = [[UIBarButtonItem alloc]initWithCustomView:button1];
    [button1 addTarget:self action:@selector(back) forControlEvents:UIControlEventTouchUpInside];
    self.navigationItem.leftBarButtonItem = leftBarItem ;
    button1 = nil;
    leftBarItem = nil;


    if (self.timer) {
        [self.timer invalidate];
        self.timer = nil;
    }
    self.timer =   [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(progressTimerChangeJianHang) userInfo:nil repeats:YES];
    [self.timer fire];

}

-(void)jianHangPay{
    self.view.backgroundColor = [UIColor colorWithHex:0xf5f5f5];
    if (!self.webView) {
        self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, WINDOW_WIDTH, WINDOW_HEIGHT-64)];
        self.webView.backgroundColor = [UIColor whiteColor];
        [self.webView setScalesPageToFit:YES];
        [self.view addSubview:self.webView];



        [WebViewJavascriptBridge enableLogging];

        _bridge = [WebViewJavascriptBridge bridgeForWebView:self.webView webViewDelegate:self handler:^(id data, WVJBResponseCallback responseCallback) {
            FLDDLogDebug(@"ObjC received message from JS: %@", data);
            responseCallback(@"Response for message from ObjC");
        }];

//        [_bridge registerHandler:@"testJavascriptHandler" handler:^(id data, WVJBResponseCallback responseCallback) {
//            FLDDLogDebug(@"reloadPage");
//            //            [self reLoginReloadPage];
//        }];

        [_bridge registerHandler:@"mddyCallback" handler:^(id data, WVJBResponseCallback responseCallback) {
            FLDDLogDebug(@"testObjcCallback called: %@", data);


            NSString *html = [data toString];
//            NSLog(@"%@",html);
            if ([html isEqualToString:@"true"]) {
                [self zhifuResult:@"1"];
            }else{
//                 [self resultFailReXiaDan];
                [self zhifuResult:@"0"];


            }


            responseCallback(@"Response from testObjcCallback");
        }];

//        [_bridge registerHandler:@"WebViewJavascriptBridgeReady" handler:^(id data, WVJBResponseCallback responseCallback) {
//            FLDDLogDebug(@"testObjcCallback called: %@", data);
//            
//            
//            NSString *html = [data toString];c
//            NSLog(@"%@",html);
//            
//            responseCallback(@"Response from testObjcCallback");
//        }];

        [_bridge send:@"123"];

//        [_bridge send:@"A string sent from ObjC to JS" responseCallback:^(id response) {
//            NSLog(@"sendMessage got response: %@", response);
//        }];

        NSURLRequest *request = [User getBookPageRequestWithOrderNumb:[self.dict valueForKey:@"orderNumber"]];
        if(request != nil)
        {
            [self.webView loadRequest:request];
        }

    }


}

现在的公司代码不能贴出来。分享下支付功能模块化后的调用流程图吧!对咱们程序猿来说,流程图比实际的代码更重要,可以根据流程图做出不同的模块,完全抄袭不单牵涉到知识产权问题,也不利于扩展。


目录
相关文章
|
缓存 Java PHP
解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题
解决Hbuilder打包的APP微信支付时无法唤起支付,且提示{“code“:-100,“message“:“[payment微信:-1]General errors“}的问题
|
移动开发 Java 测试技术
iOS的App模块化编程的框架实现方案——BeeHive
BeeHive是用于iOS的App模块化编程的框架实现方案,吸收了Spring框架Service的理念来实现模块间的API耦合。
iOS的App模块化编程的框架实现方案——BeeHive
|
XML 移动开发 小程序
抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)
字节跳动也开放了小程序给商家接入,可以在旗下APP如抖音、今日头条、今日头条极速版等应用中即点即用,基于庞大的数亿用户量为其引流,帮助商家获取用户流量,销售商品,其模式和微信小程序差不多。
1923 0
抖音小程序开发 唤起收银台支付(可以选择支付宝APP支付或微信H5支付)
|
4月前
|
移动开发 前端开发 JavaScript
|
Java 开发工具 Android开发
利用Android Studio在App中集成第三方支付
利用Android Studio在App中集成第三方支付
|
监控 安全 数据挖掘
短视频app开发,如何实现高质量的支付系统架构?
短视频app开发,如何实现高质量的支付系统架构?
APP - 查询名下微信实名账户(可注销微信封号账户支付功能)
APP - 查询名下微信实名账户(可注销微信封号账户支付功能)
756 0
APP - 查询名下微信实名账户(可注销微信封号账户支付功能)
|
移动开发 前端开发 Android开发
支付宝H5嵌入APP内部支付
前景:由于苹果支付收取手续费太高,决定采用APP内嵌套H5进行微信和支付宝进行支付。安卓手机可以直接使用APP支付功能(APP支付和H5支付,只有两个参数不同而已,以及返回的参数格式不同,仅此而已)
【Google Play】App Bundle 使用详解 ( 应用模块化 )(二)
【Google Play】App Bundle 使用详解 ( 应用模块化 )(二)
211 0
【Google Play】App Bundle 使用详解 ( 应用模块化 )(二)
|
Android开发 开发者
【Google Play】App Bundle 使用详解 ( 应用模块化 )(一)
【Google Play】App Bundle 使用详解 ( 应用模块化 )(一)
212 0
【Google Play】App Bundle 使用详解 ( 应用模块化 )(一)

热门文章

最新文章

下一篇
DataWorks