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

2016-12-28  本文已影响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中的代码拷贝过去即可。
  

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

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

上一篇下一篇

猜你喜欢

热点阅读