一、使用支付宝进行一个完整的支付功能,大致有以下步骤:
1)向支付宝申请, 与支付宝签约,获得商户ID(partner)和账号ID(seller)
2)下载相应的公钥私钥文件(加密签名用)
3)下载支付宝SDK
4)生成订单信息,签名加密
5)调用支付宝客户端,由支付宝客户端跟支付宝安全服务器打交道
6)支付完毕后,支付宝客户端会自动跳回到原来的应用程序
7)在原来的应用程序中显示支付结果给用户看
流程图如下
下载SDK网站:http://club.alipay.com/ 进去之后选择-->支付宝接口集成-->支付宝接口资料下载-->快捷支付(无限)点击下载
在下载包里提供了非常详细的文档,如何签约,如何获得公匙和私匙,如何调用支付接口等。。
调用安全支付数据流程:用户购买-->生成订单-->订单签名-->调用安全支付服务-->回调支付结果-->商户验签支付结果
如果是服务器端开发就选服务器Demo,,我们选择客户端Demo
当第一次打开Demo时,直接变异可能会出现以下问题:
解决办法:Build Settings-->Build Active Architecture Only --> YES改为NO
也可能是下面的问题:
错误原因是项目的部署版本设置太低了,从3.0改为4.3即可
此处有图。。。。
要想集成支付功能,首先将Demo中的 openssl、Util文件夹,Order.h、Order.m 以及Frameworks下的libcrypto.a、libssl.a 、AlipaySDK.bundle、AlipaySDK.framework 加入到项目中就可以实现支付了,至于其他的一些可以选加,然后依次添加依赖的库。创建PCH文件包含头文件
#import <UIKit/UIKit.h> #import <Foundation/Foundation.h>
然后编译会有一个错误:#include<openssl/asn1.h>找不到,Xcode5可以直接导入,Xcode6以后需要自己配置指定路径,这个头文件时放在.a中的。
解决办法:在Header Search Path中配置sdk中点a文件所在的目录: 当前路径/项目名字/AlipaySDK.bundle所在文件夹,,没有救不写,具体看自己的项目结构
注意第6步有个细节.在工程配置中设置URL Schemes,如果不设置,那么支付跳转到支付宝后,无法再回到自己的app
调用支付接口可以参考AlixPayDemoViewController的下面方法,如何创建订单、如何签名、如何调用支付接口,都在这个方法里面了
-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
接口调用步骤:
1.封装订单模型 AlixPayOrder *order = [[AlixPayOrder alloc] init]; // 生成订单描述 NSString *orderSpec = [order description]; 2.签名 id<DataSigner> signer = CreateRSADataSigner(@“私钥key”); // 传入订单描述 进行 签名 NSString *signedString = [signer signString:orderSpec]; 3.生成订单字符串 NSString *orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec, signedString, @"RSA"]; 4.调用支付接口 AlixPay * alixpay = [AlixPay shared]; // appScheme:商户自己的协议头 int ret = [alixpay pay:orderString applicationScheme:appScheme];
二、上代码,,Demo里的 导入相关头文件
.h
#import <UIKit/UIKit.h> // //测试商品信息封装在Product中,外部商户可以根据自己商品实际情况定义 // @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; @end @interface APViewController : UIViewController<UITableViewDelegate, UITableViewDataSource> @property (weak, nonatomic) IBOutlet UITableView *productTableView; @property(nonatomic, strong)NSMutableArray *productList; - (IBAction)auth:(id)sender; @end
.m
#import "APViewController.h" #import "Order.h" #import "DataSigner.h" #import <AlipaySDK/AlipaySDK.h> #import "APAuthV2Info.h" @implementation Product @end @interface APViewController () @end @implementation APViewController - (void)viewDidLoad { [super viewDidLoad]; [self generateData]; } #pragma mark - #pragma mark ==============产生随机订单号============== - (NSString *)generateTradeNO { static int kNumber = 15; NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ"; NSMutableString *resultStr = [[NSMutableString alloc] init]; 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; } #pragma mark - #pragma mark ==============产生订单信息============== - (void)generateData{ NSArray *subjects = @[@"1", @"2",@"3",@"4", @"5",@"6",@"7", @"8",@"9",@"10"]; NSArray *body = @[@"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据", @"我是测试数据"]; if (nil == self.productList) { self.productList = [[NSMutableArray alloc] init]; } else { [self.productList removeAllObjects]; } for (int i = 0; i < [subjects count]; ++i) { Product *product = [[Product alloc] init]; product.subject = [subjects objectAtIndex:i]; product.body = [body objectAtIndex:i]; product.price = 0.01f+pow(10,i-2); [self.productList addObject:product]; } } #pragma mark - #pragma mark UITableViewDelegate - (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { return 55.0f; } #pragma mark - #pragma mark UITableViewDataSource - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { return [self.productList count]; } // //用TableView呈现测试数据,外部商户不需要考虑 // - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"Cell"]; Product *product = [self.productList objectAtIndex:indexPath.row]; cell.textLabel.text = product.body; cell.detailTextLabel.text = [NSString stringWithFormat:@"一口价:%.2f",product.price]; return cell; } #pragma mark - #pragma mark ==============点击订单模拟支付行为============== // //选中商品调用支付宝极简支付 // - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { /* *点击获取prodcut实例并初始化订单信息 */ Product *product = [self.productList objectAtIndex:indexPath.row]; /* *商户的唯一的parnter和seller。 *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。 */ /*=======================需要填写商户app申请的===================================*/ NSString *partner = @"";//商户ID NSString *seller = @"";//支付宝帐号 NSString *privateKey = @"";//用于数据安全,数据加密 //这三个数据,支付宝会提供 //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;//设置商户ID order.seller = seller;//设置支付宝帐号 //订单ID必须在系统中是惟一 //时间2015022811111 + 随机数 order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定) 订单编号 order.productName = product.subject; //商品标题 order.productDescription = product.body; //商品描述 order.amount = [NSString stringWithFormat:@"%.2f",product.price]; //商品价格 order.notifyURL = @"http://www.xxx.com"; //回调URL order.service = @"mobile.securitypay.pay"; order.paymentType = @"1";// 支付类型 1.支付 2.全额退款 3.取消支付 4.部分退款 order.inputCharset = @"utf-8"; order.itBPay = @"30m"; order.showUrl = @"m.alipay.com"; //应用注册scheme,在AlixPayDemo-Info.plist定义URL types NSString *appScheme = @"alisdkdemo"; //将定单信息拼接成字符串 NSString *orderSpec = [order description]; NSLog(@"orderSpec = %@",orderSpec); //请求参数 /* partner=""&seller_id=""&out_trade_no="4CGUBYMA8OGAFCN"&subject="1"&body="我是测试数据"&total_fee="0.02"¬ify_url="http://www.xxx.com"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&show_url="m.alipay.com" */ //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode //RSA 加密技术 - 加密数据 类似于MD5 // 签名对象 id<DataSigner> signer = CreateRSADataSigner(privateKey); //签名数据 /* * 签名 类似于每个人的指纹 * abc 签名 -> 得到一指纹(字符串) * abd 签名 -> 得到一指纹(字符串) *支付 签名方式 只有自己和支付宝才知道 * total_fee=0.02&seller_id=xxx@qq.com&sign=ABC -> 签名 ->指纹(ABC) * total_fee=0.03&seller_id=aaa@qq.com&sign=ABC -> 签名 ->指纹(ABD) */ NSString *signedString = [signer signString:orderSpec]; //将签名成功字符串格式化为订单字符串,请严格按照该格式 NSString *orderString = nil; if (signedString != nil) { orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec, signedString, @"RSA"]; //一个完成的数据提交到支付宝的服务器,一定要有一个签名(sign) /* partner=""&seller_id=""&out_trade_no="4CGUBYMA8OGAFCN"&subject="1"&body="我是测试数据"&total_fee="0.02"¬ify_url="http://www.xxx.com"&service="mobile.securitypay.pay"&payment_type="1"&_input_charset="utf-8"&it_b_pay="30m"&show_url="m.alipay.com&sign="ABC"&sign_type="RSA"" */ [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { NSLog(@"reslut = %@",resultDic); }]; [tableView deselectRowAtIndexPath:indexPath animated:YES]; } } @end
demo下载地址:http://pan.baidu.com/s/1hrfFWhu
银联支付官方SDK下载地址:https://open.unionpay.com/ajweb/help/query 手机支付属于手机控件支付产品
1.SDK 说明
SDK 分为以下两个版本:
1.支持纯无卡交易静态库,以下简称 UPPayPlugin,包含文件:
UPPayPlugin.h UPPayPluginDelegate.h libUPPayPlugin.a
2、支持纯无卡交易和 VIPOS 音频口支付静态库,以下简称 UPPayPluginPro,公司自主研发的 VIPOS(即“voice interface POS ”音频接口 POS 机)支付平台,与银联联合运营,并协助银 联制定了手机 POS 等安全规范、业务与技术标准。
包含文件:
UPPayPluginPro.h
UPPayPluginDelegate.h libUPPayPluginPro.a
3、添加 SDK 包
a.根据商户选择的SDK版本,将sdk/inc目录和sdk/libs目录下对应版本的三个文件添加到 UPPayDemo 工程中;
b.如 果 你 选 择 的 是 UPPayPlugin 版 本 , 添 加 QuartzCore.framework 、
Security.framework 到工程中;
c.如 果 你 选 择 的 是 UPPayPluginPro 版 本 , 添 加 QuartzCore.framework 、AudioToolbox.framework, CoreAudio.framework 、 MediaPlayer.framework,AVFoundation.framework 和 Security.framework 到工程中
工程配置:
1.在需要调用支付控件的源文件内引用头文件 UPPayPlugin.h 或 UPPayPluginPro.h(注意:如果工程的 compile source as 选项的值不是 Objective–C++,则引用此头文件的文件类型都要改为.mm)
2.在工程的 Build Settings 中找到 Other Linker Flags 中添加-ObjC 宏
3.将 xcode 工程中 Build Setting -> Apple LLVM compiler Language 标签下的 C++ Language Dialect 和 C++ Standard Library 属性值修改为 Compiler Default
具体看例子吧:http://pan.baidu.com/s/1dEyINKl
微信支付
微信支付官方SDK下载地址:https://pay.weixin.qq.com/wiki/doc/api/app.php?chapter=11_1
在官方的开发者平台上---->开发者文档------>APP支付----->APP端开发步骤
1:去微信开放平台注册应用
https://open.weixin.qq.com/cgi-bin/index?t=home/index&lang=zh_CN&token=2c0fee9c43e1eb8f9febcc7cb73abf598e2d4011
创建移动应用并成功之后会收到腾讯发来的邮件
通过邮件你能获得重要的参数:
(1):AppID
(2):微信支付商户号
(4):前往商户平台完成入驻
(4):API秘钥(自己设置即可,注意一定要32位字母加数字的组合)记得保存好秘钥,以后要使用
设置密钥
有了这些参数后,我们就可以开发自己的项目了.
首先我们需要把我们下载好的sdk导入到我们工程当中.SDKExport文件下的3个文件是必须要导入到工程中去的.除了这个以外,我们还需要把依赖库给添加到工程中去
具体看demo:http://pan.baidu.com/s/1sk5gazr
学习别人的SDK
1.看pch
2.看依赖
3.项目里导入文件
4.找不到某某文件 -- 查看源项目的Header Searth