iOS开发:集成支付宝

1.在支付宝开放平台下载支付宝SDK,把以下文件直接拷入工程.

2.添加相应的依赖库.选择"target"->"Link Binary With Libraries"

3.编译,坑随之而来,开始填坑.

解决:在相应文件中,导入

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

3.1如果出现

就把官方demo中的下面两个文件拷进工程即可,是因为缺少.a文件

3.2一般也会出现

,接着导入这个库

 

4.

解决:出现类似找不到文件的情况,Targets->Build Settings->Header Search Path添加路径.

直接将项目中的相应文件拖入即可.也可以$(SRCROOT)/文件路径.

至此,基本的工作完成.下面开始集成代码.

 

首先,在appDelegate.m中

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
- ( BOOL )application:(UIApplication *)application
             openURL:( NSURL  *)url
   sourceApplication:( NSString  *)sourceApplication
          annotation:( id )annotation {
     //跳转支付宝支付,处理支付结果
//    [[AlipaySDK defaultService]processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
//        NSLog(@"result = %@",resultDic);
//    }];
     
     if  ([url.host isEqualToString:@ "safepay" ]) {
         [[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 ;
}

 这两个文件直接用官方的即可.

接着,在Controller中,添加另外一个类,这样方便.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//
//  OrderViewController.h
//  app
//
//  Created by shaoting on 16/1/20.
//  Copyright © 2016年 9elephas. All rights reserved.
//
 
#import <UIKit/UIKit.h>
@interface  Product :  NSObject {
@private
     float      _price;
     NSString  *_subject;
     NSString  *_body;
     NSString  *_orderId;
}
 
@property  ( nonatomic , assign)  float  price;
@property  ( nonatomic copy NSString  *subject;
@property  ( nonatomic copy NSString  *body;
@property  ( nonatomic copy NSString  *orderId;
+( id )sharedUserDefault;
 
@end
 
@interface  OrderViewController : UIViewController
 
@property ( nonatomic , strong) NSMutableArray  *productList;
 
@end

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
//
//  OrderViewController.m
//  app
//
//  Created by shaoting on 16/1/20.
//  Copyright © 2016年 9elephas. All rights reserved.
//
 
#import "OrderViewController.h"
#import "Order.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>
 
 
@implementation  Product
static   Product * product =  nil ;
 
+( id )sharedUserDefault
{
    
         @synchronized ( self )
         {
             if (product== nil )
             {
                 product=[[Product alloc] init];
             }
         }
     return  product;
}
#pragma mark 通过HTML5界面获取product.subject body price
-( void )getProductInfo{
     
}
 
@end
 
 
 
 
@interface  OrderViewController ()
 
@end
 
@implementation  OrderViewController
 
- ( void )viewDidLoad {
     [ super  viewDidLoad];
     
     [[Product sharedUserDefault] getProductInfo];  //通过该方法调用其他类的单例方法,接着调用对象方法,该对象方法会获取到HTML5界面上的信息
     // Do any additional setup after loading the view from its nib.
}
 
 
#pragma mark   随机产生订单号
-( NSString  *)generateTradeNO{
     static  int  kNumber = 15;
     NSString  * sourceStr = @ "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" ;
     NSMutableString  * resultStr = [[ NSMutableString  alloc]init];
     srand(time(0));  //time(0)得到当前的时间值.srand(time(0))可以保证每次到可以得到不一样的种子值.计算机中没有真正的随机值
     //如果不用srand(time(0))的话,第二次的订单号就和第一次一样了
     for  ( int  i = 0; i<kNumber; i++) {
         unsigned index = rand()%[sourceStr length];
         NSString  * oneStr = [sourceStr substringWithRange: NSMakeRange (index, 1)];
         [resultStr appendString:oneStr];
     }
     return  resultStr;
}
-( void )goPay{
   NSString  * partner = @ "从后台获取,保证安全" ;
   NSString  * seller = @ "从后台获取,保证安全" ;
   NSString  * privateKey = @ "从后台获取,保证安全" ;
   
     if  ([partner length] == 0 || [seller length] == 0 || [privateKey length] == 0) {
         UIAlertController * alertC = [UIAlertController alertControllerWithTitle:@ "提示"  message:@ "发生错误"  preferredStyle:UIAlertControllerStyleAlert];
         
         UIAlertAction * alert = [UIAlertAction actionWithTitle:@ "缺少partner或者seller或者私钥"  style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
             //之后做相应处理
         }];
         [alertC addAction:alert];
         [ self  presentViewController:alertC animated: YES  completion: nil ];
     }
     //生成订单信息以及签名
     Order * order = [[Order alloc]init];
     order.partner = partner;
     order.seller = seller;
     order.tradeNO = [ self  generateTradeNO];   //订单ID(随机产生15位)
     order.productName = product.subject; //商品名
     order.productDescription = product.body; //商品描述
     order.amount = [ NSString  stringWithFormat:@ "%.2f" ,product.price]; //价格
     order.notifyURL = @ "" ///回调URL
     
     order.service = @ "mobile.securitypay.pay" ;
     order.paymentType = @ "1" ;
     order.inputCharset = @ "utf-8" ;
     order.itBPay = @ "30m" ;
     order.showUrl = @ "m.alipay.com" ;
     
     //应用注册scheme,在Info.plist定义URL types
     NSString  *appScheme = @ "alisdkdemo" ;
     
     //将商品信息拼接成字符串
     NSString  * orderSpec = [order description];
     //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循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);
         }];
     }
     //取消选中
}
- ( void )didReceiveMemoryWarning {
     [ super  didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
}
 
/*
#pragma mark - Navigation
 
// In a storyboard-based application, you will often want to do a little preparation before navigation
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
     // Get the new view controller using [segue destinationViewController].
     // Pass the selected object to the new view controller.
}
*/
 
@end

 因为我的是点击h5界面上的购买按钮跳转至iOS源生实现购买流程的,所以一些代码可能不同,但是大同小异.

另:因为iOS9的原因,需要配置下项目,如:

https:

白名单:

更多白名单http://www.cnblogs.com/shaoting/p/5148323.html

URL types:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值