iOS 2017 集成支付宝v2.0详解

前言:集成支付宝可以分为客户端签名和服务器端签名两种,前者需要将PrivateKey放在本地,支付宝不推荐使用,推荐使用服务器端签名这种,这里我在这里分两种跟大家进行。

// NOTE: 重要说明:NSString* text = @"重要说明:\n本Demo为了方便向商户展示支付宝的支付流程,所以订单信息的加签过程放在客户端完成;\n在商户的真实App内,为了防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;\n商户privatekey等数据严禁放在客户端,订单信息的加签过程也务必放在服务端完成;\n若商户接入时不遵照此说明,因此造成了损失,需自行承担。";

1、集成前准备:


创建应用啥的就就该你们后台去做吧,这里就不耽误时间了,点击蚂蚁金服开放平台,点击sdk&demo下载相应的demo和sdk,打开iOS demo,自己新建一个AlipaySdk文件夹把demo里面的这几个相应的文件夹导入到AlipaySdk文件夹下,形成如下的结构,仔细点,别搞错了。搞完后,放在你工程里面你要管理的位置。

2、点击Build Phases -> Link Binary With Libraries,看AlipaySDK.bundle,AlipaySDK.framework,libcrypto.a,libssl.a是否已经添加进去了,没有的话,点击+添加

3、设置索引目录,要不然会报文件找不到的错误

上图是我们app设置的索引目录,这个根据自己的app文件结构作相应的调整

4、设置url schemes,设置如下:


我这设置的是alisdkdemo,跟他们demo里面的一样,懒得改了,也可以根据自己的app做相应的修改。

5、设置支付宝成功之后的回调的方法,在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 *)options

{

if ([url.host isEqualToString:@"safepay"]) {

//跳转支付宝钱包进行支付,处理支付结果

[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {

NSLog(@"result = %@",resultDic);

}];

}

return YES;

}

6、墨迹半天了,开始上干货,这里首先是客户端签名的代码:如下:

- (void)aliPay{

NSString *appID = AliAppID;

NSString *rsa2PrivateKey = @"";

NSString *rsaPrivateKey = self.privateKey.length > 0 ?self.privateKey : PRIVATEKEY;

//partner和seller获取失败,提示

if ([appID length] == 0 ||

([rsa2PrivateKey length] == 0 && [rsaPrivateKey length] == 0))

{

UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示"

message:@"缺少appId或者私钥,请检查参数设置"

preferredStyle:UIAlertControllerStyleAlert];

UIAlertAction *action = [UIAlertAction actionWithTitle:@"知道了"

style:UIAlertActionStyleDefault

handler:^(UIAlertAction *action){

}];

[alert addAction:action];

[VisibleViewController() presentViewController:alert animated:YES completion:^{ }];

return;

}

/*

*生成订单信息及签名

*/

//将商品信息赋予AlixPayOrder的成员变量

APOrderInfo* order = [APOrderInfo new];

// NOTE: app_id设置

order.app_id = appID;

// NOTE: 支付接口名称

order.method = @"alipay.trade.app.pay";

// NOTE: 参数编码格式

order.charset = @"utf-8";

// NOTE: 当前时间点

NSDateFormatter* formatter = [NSDateFormatter new];

[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];

order.timestamp = [formatter stringFromDate:[NSDate date]];

// NOTE: 支付版本

order.version = @"1.0";

// NOTE: sign_type 根据商户设置的私钥来决定

order.sign_type = (rsa2PrivateKey.length > 1) ? @"RSA2":@"RSA";

order.notify_url = self.notifyURL;

// NOTE: 商品数据

order.biz_content = [APBizContent new];

order.biz_content.body = self.productDescription;

order.biz_content.subject = self.productName;

order.biz_content.out_trade_no = self.tradeNO; //订单ID(由商家自行制定)

order.biz_content.timeout_express = @"30m"; //超时时间设置

order.biz_content.total_amount =  self.amount; //商品价格

order.biz_content.product_code = @"QUICK_MSECURITY_PAY";

//将商品信息拼接成字符串

NSString *orderInfo = [order orderInfoEncoded:NO];

NSString *orderInfoEncoded = [order orderInfoEncoded:YES];

DLog(@"lallalall orderSpec = %@",orderInfo);

// NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;

//      需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode

NSString *signedString = nil;

APRSASigner* signer = [[APRSASigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)];

if ((rsa2PrivateKey.length > 1)) {

signedString = [signer signString:orderInfo withRSA2:YES];

} else {

signedString = [signer signString:orderInfo withRSA2:NO];

}

DLog(@"获取到的数据是:%@",signedString);

// NOTE: 如果加签成功,则继续执行支付

if (signedString != nil) {

//应用注册scheme,在AliSDKDemo-Info.plist定义URL types

NSString *appScheme = @"alisdkdemo";

// NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式

NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",

orderInfoEncoded, signedString];

// NOTE: 调用支付结果开始支付

[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {

DLog(@"支付宝回调的结果是:reslut = %@",resultDic);

callBack(resultDic[@"resultStatus"]);

}];

}

}

//将上面的方法拖到项目中,报错的参数就是你要根据需要修改的参数,不知道的也可以看这个链接支付宝参数链接看那些是必须传的还有填写的内容和格式。

完成以上6项步骤不出啥问题,你已经能成功在ios 客户端集成支付宝v2.0了,但是。。。。。

看到我最上面的警告不,支付宝是不推荐客户端加签的,如果没你们服务器端不想加签的话就你们自己搞。

二、服务器端加签后ios 客户端的的做法如下:

AFHTTPSessionManager *mgr = [AFHTTPSessionManager manager];

mgr.responseSerializer.acceptableContentTypes= [NSSet setWithObjects:@"text/html",@"application/json",nil];

NSString*appScheme = @"alisdkdemo";

[mgr POST:@"xxxx"parameters:nil progress:nilsuccess:^(NSURLSessionDataTask * _Nonnull task,id_Nullable responseObject) {

// 从后台获取加签后的字符串NSString*orderNo = responseObject[@"orderNo"];

// 调起支付宝客户端进行支付操作

[[AlipaySDK defaultService] payOrder:orderNo fromScheme:appScheme callback:^(NSDictionary*resultDic) {NSLog(@"%@",resultDic);

}];

} failure:^(NSURLSessionDataTask * _Nullable task,NSError* _Nonnull error) {

}];

对,你没错,就是这么简单。。。

根据需要跟服务器端商量跟他们传什么参数,服务器端返回加签后的订单支付串,你拿到该订单支付串和设置的URL scheme调用支付宝的支付接口发起支付请求就完了,惊不惊喜,意不意外!

[[AlipaySDK defaultService] payOrder:orderNo fromScheme:appScheme callback:^(NSDictionary*resultDic) {NSLog(@"%@",resultDic);

}];


总结:

支付宝推荐使用服务器端加签的方法,相信大多数iOS开发的小伙伴也都坚决响应这一号召吧!但是,咱们客户端集成的咱们也要会,不要碰见个傲娇的后台就不干,咋办!咱技多不压身。撒油那啦!

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

推荐阅读更多精彩内容

  • 文章主要讲到以下五部分: 一、支付宝开放平台创建应用 二、签约移动支付功能 三、接入支付前的准备工作附准备工作中遇...
    sillen阅读 17,692评论 1 10
  • 因为近期项目中需要接入支付宝支付功能,自己也爬了很多的坑,所以做了一下这边文章供大家学习参考,远离爬坑,文章主要讲...
    啓蘊阅读 2,238评论 0 4
  • 关于第IOS三方支付(支付宝)问题 一:平台注册(快速集成): 1创建应用并获取APPID: 要在您的应用中使用支...
    sillen阅读 1,263评论 1 3
  • 在我们应用开发中我们经常在自己的项目中使用到支付,下面我们来谈谈iOS这块的支付;iOS支付主要分为两类,第三方支...
    Hither阅读 8,106评论 9 42
  • 整个支付逻辑分为两个部分 对订单模型order的总结 订单模型中分为两个部分商品模型 订单模型 快速完成支付功能步...
    winlee阅读 13,074评论 4 7