作为iOS开发者,虽然泡沫的式的发展并不是我们想看到的,但是,就目前来看看,我们的能力和经验依旧很重要!!(突然发现这是完全不搭边的两句话....)在很多时候我们所被问到的就是:做过支付吗?做过地图吗?做过视频吗?做过流媒体吗?做过通讯吗?使用过融云吗?使用过环信吗?使用过网易云信吗?会做游戏吗?懂得socket吗?懂得HTTP、TCP/IP、UDP吗?知道多线程吗?会使用NSOperation、GCD、NSThread吗?知道各种dispath_XXX吗?......木有!!!不会!!OK,你可以回去了......即使是在任何情况下,我们都应该积极的去学习,去面对问题,哪怕是我们的付出没有回报,那你就赶紧跳槽!!或者,继续提高自己,你的优秀会潜意识的散发出来,别人也会看在眼里,嫉在心里。
言归正传,下面是支付宝的集成:
一、首先介绍产品流程:(开发者可以看文档,十分详细,比微信强太多了)
《支付宝开放品台文档中心》
总的来说分为两种情况:
(1)用户已安装支付宝支付流程。已经安装app后,可以直接调起app进行支付。输入密码,完成支付。
(2)用户未安装支付宝支付流程。未安装app,则需要调起h5界面进行支付。需要:输入校验码->选择支付方式->输入支付密码->完成支付。
二、第一步:务必在开放平台创建一个应用
《App支付接入指引》
(1)创建应用。
(2)配置应用。
(3)设计。
(4)开发。
(5)调试应用。
(6)上线应用。
三、App支付快速接入。
此处问题是有两个版本:9.0之前、9.0之后。
老版本的样式:
第一步:创建应用并获取APPID
第二步:配置密钥
第三步:搭建和配置开发环境
需要集成客户端SDK。
第四步:调用接口
注意事项:
其他的具体看开发文档,一步一步的进行设置即可。
在下载的SDK(demo)中有两个文件夹、AlipaySDK.bundle、AlipaySDK.framework,这些东西需要导入到工程中。至于Order,则是模拟后台支付“生成订单信息及签名”而使用的。
上代码:
//app_id设置(is:partner)
NSString *appID = @"2017010304820705";
//这是第二种生成私钥的方法
NSString *rsa2PrivateKey = @"";
//这是第一种生成方法
NSString *rsaPrivateKey = @"";
官方文档建议使 rsa2,因为比较安全。私钥生成有两个:1024、2048。同学们可以使用文档提供的生成器进行操作。如果 rsa2 没有或者输出为 null 时候,就说明生成错误,这时候可以使用 rsaPrivateKey 进行签名。
/**
* 生成订单信息及签名
*/
Order *order = [Order new];
//
order.app_id = appID;
//支付接口名称
order.method = @"alipay.trade.app.pay";
//参数编码格
order.charset = @"utf-8";
//设置时间
NSDateFormatter *formatter= [NSDateFormatter new];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
//请求发送的时间
order.timestamp = [formatter stringFromDate:[NSDate date]];
//请求调用的接口版本,固定为:1.0
order.version = @"1.0";
//签名类型
order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
//商品数据
order.biz_content = [BizContent new];
//(非必填项)商品描述
order.biz_content.body = @"此物只应天上有,人间哪得几回闻";
//商品的标题/交易标题/订单标题/订单关键字等。
order.biz_content.subject = @"一只草泥马";
#warning 订单号方法如下:generateTradeNO
//商户网站唯一订单号
order.biz_content.out_trade_no = [self generateTradeNO];
/**
* 该笔订单允许的最晚付款时间,逾期将关闭交易。
*
* 取值范围:1m~15d m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)
* 该参数数值不接受小数点, 如1.5h,可转换为90m。
*/
order.biz_content.timeout_express = @"30m";
//订单总金额,单位为元,精确到小数点后两位,取值范围[0.01,100000000]
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01];
/**
* 获取订单信息串(将商品信息拼接成字符串)
*
* bEncoded 订单信息串中的各个value是否encode
* 非encode订单信息串,用于生成签名
* encode订单信息串 + 签名,用于最终的支付请求订单信息串
*/
NSString *orderInfo = [order orderInfoEncoded:NO];
//
NSString *orderinfoEncoded = [order orderInfoEncoded:YES];
//
NSLog(@"商品信息:%@", orderInfo);
// NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
// 需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString *singedString = nil;
签名代码如下:
#warning 这是新版本的签名
RSADataSigner *singer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1) ? rsa2PrivateKey : rsaPrivateKey)];
//
if (rsa2PrivateKey.length > 1) {
singedString = [singer signString:orderInfo withRSA2:YES];
}else {
singedString = [singer signString:orderInfo withRSA2:NO];
}
// NOTE: 如果加签成功,则继续执行支付
if (singedString != nil) {
//应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString *appScheme = @"Payone";
//将签名成功字符串格式化为订单字符串,务必严格按照格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderinfoEncoded, singedString];
// NOTE: 调用支付结果开始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"开始支付:%@", resultDic);
}];
}
#warning 这是老版本的签名
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循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);
}];
}
订单号生成方法:
- (NSString *)generateTradeN {
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)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;
}
支付:AppDelegate
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
四、为了可以跳回app,需要设置appScheme
应用注册scheme,在AliSDKDemo-Info.plist定义URL types
appScheme = @"Payone";
scheme与代码中的一定要一致才可以。(第一个是支付宝的,第二个是微信的)
总结:大多数东西是不需要客户端进行设置和存储的。所以,同学们集成之后即可根据需要进行开发啦。
大多数都是demo和文档的东西。另外,遇到的错误信息,忘记截图保存了.....
只提供简单的集成方法,错误请指正。