美文网首页
iOS-支付宝支付的实现+可能遇到的问题及解决办法

iOS-支付宝支付的实现+可能遇到的问题及解决办法

作者: 树根曰 | 来源:发表于2016-12-28 21:34 被阅读0次

    关于支付宝支付, 首先了解一下, 支付流程:

    1.用户点击支付
    2.客户端请求服务器用户支付
    3.服务器接收请求生成金额订单等要给第三方支付的一切信息,并生成回调参数传给客户端
    4.客户端接收信息(一般会再让用户确认支付或者干脆购买后是生成订单,然后才是付款)并将服务器给的信息分别传入SDK需要的参数中,调用SDK的支付方法
    5.由支付宝SDK向支付宝自己的服务器发出支付请求,支付宝的服务器接收支付请求处理成功后,给客户端本身与公司的后台都发送一条支付成功的消息,客户端与后台根据这条消息再做处理.

    开发步骤
    第一步: 仔细看开发文档, 并 下载 SDK
    开发文档 很重要, 建议先把开发文档仔仔细细看一遍, 可以避免很多坑, 特别是交互流程:

    支付功能的交互流程

    第二步: 集成 SDK
    1 . 将 SDK 拖进 工程

    06181012_0A7u.png

    2 . 在Build Phases 选项卡的 Link Binary With Libraries 中,增加以下依赖:

    添加SDK依赖的类库

    3 . 设置为URL Schemes

    设置为URL Schemes

    4 . 添加支付逻辑代码,完成支付过程

    在支付页面:

    #import <AlipaySDK/AlipaySDK.h>
    #import "Order.h"
    #import "DataSigner.h"
    
    //宏定义 PID, 收款账户 和 私钥
    //这里的三个参数是公司和支付宝签约之后得到的,没有这三个参数无法完成支付
    //合作者身份(PID)
    #define Partner @"合作者身份(PID)"
    //商家支付宝账号
    #define Seller @"商家支付宝账号"
    
    #define KPrivate_key @"私钥"
    
    #pragma mark 支付宝支付
    - (void)aLiPay {
        Order *order = [[Order alloc] init];
        //合作者身份(PID)
        order.partner = Partner;
        //商家支付宝账号
        order.seller = Seller;
        //订单ID
        order.tradeNO = @"订单ID";
        //产品名称
        order.productName = @"产品名称";
        //商品描述
        order.productDescription = @"商品描述";
        //商品价格
        order.amount = self.orderValue;
        //回调URL
        order.notifyURL = @"回调URL";
        order.service = @"mobile.securitypay.pay";
        //支付类型:1(商品购买)
        order.paymentType = @"1";
        //编码格式
        order.inputCharset = @"utf-8";
        //订单超时时间
        order.itBPay = @"30m";
        
        NSString * appSchem = @"TaoYuanLe";
        //将商品信息拼接成字符串   该方法支付宝已经封好
        NSString *orderSpec = [order description];
        
        //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
        //使用私钥进行签名
        id<DataSigner>signer = CreateRSADataSigner(KPrivate_key);
        //调用签名 签名我的订单描述
        NSString *sinedString = [signer signString:orderSpec];
        
        //将签名成功字符串格式化为订单字符串,请严格按照该格式
        NSString *orderString = nil;
        
        if (sinedString != nil) {
            
            orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec,sinedString,@"RSA"];
            // 发起支付
            [[AlipaySDK defaultService] payOrder:orderString fromScheme:appSchem callback:^(NSDictionary *resultDic) {
                
                //NSLog(@"支付结果result= %@",resultDic);
                
                if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) {
                    //9000为支付成功
                    
                    //在这里可以对支付结果进行判断, 也可以在```AppDelegate.m```回调方法中处理支付结果
                }
            }];
        }
    }
    

    同时在 AppDelegate.m 中,

    #import <AlipaySDK/AlipaySDK.h>//支付宝支付
    
    #pragma mark 跳转支付宝, 微信 进行支付,处理支付结果
    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
        
        NSString *urlStr = [NSString stringWithFormat:@"%@",url];
        
        if ([url.host isEqualToString:@"safepay"]) {  //判断支付宝回调
            //跳转支付宝钱包进行支付,处理支付结果
            [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
                //TY_Log(@"result = %@",resultDic);
                //处理支付结果
            }];
            
        }else if ([sourceApplication isEqualToString:@"com.tencent.xin"] && [urlStr containsString:@"pay"]){ //判断微信回调
            TYLLog(@"跳转微信支付处理支付方式结果");
            return [WXApi handleOpenURL:url delegate:self];
            
        }
        
        return YES;
    }
    

    出现的问题及解决办法:

    1)"Unknown type name ‘NSString‘ "或者"Unknown type name ‘NSData‘ "等不识别常见类的问题。
      


      这是因为缺少Foundation类库和UIKit类库,支付宝Demo中之所以没有出现此错误,是因为在.pch文件中导入过这些类库
      解决办法:只需要在出现错误的文件中导入这些类库即可
       技术分享
      2)‘openssl/asn1.h‘ file not found
      
      这是 openssl 文件夹头文件链接问题,只是把 openssl 文件夹拉进项目中,也可能出现这个问题。
      
      解决办法:Targets->Build Settings->Header Search Path中添加1中建立的aliPaySDK文件夹的路径(拖拽此文件夹至输入框即可)
      
      3)根据项目需求添加demo中ViewController中的代码 编译后可能会出下面错误:
      "OBJC_CLASS$_Product", referenced from: objc-class-ref in ViewController.o
      
      AlipaySDK的demo中将Product的定义写在了ViewControler.h中所致
      
      解决办法:新建Product类,将ViewController中的代码拷贝过去即可。
      

    结束
    有微信支付需求的可以 点这里

    如果这篇文章对您有些许帮助 请给我点个心吧。

    相关文章

      网友评论

          本文标题:iOS-支付宝支付的实现+可能遇到的问题及解决办法

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