集成支付宝支付功能

作为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
scheme与代码中的一定要一致才可以。(第一个是支付宝的,第二个是微信的)
总结:大多数东西是不需要客户端进行设置和存储的。所以,同学们集成之后即可根据需要进行开发啦。

大多数都是demo和文档的东西。另外,遇到的错误信息,忘记截图保存了.....
只提供简单的集成方法,错误请指正。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容