支付宝开放平台里App支付iOS集成流程文档:https://doc.open.alipay.com/docs/doc.htm?spm=a219a.7629140.0.0.nWMATK&treeId=193&articleId=105295&docType=1 注意看文档,看文档,看文档! 重要的事情说三遍...
把SDK里需要的文件全放入新建的文件夹里,一起拖进来!
在下图中要添加 RSA 签名
我把支付宝的订单信息单独封装在一个类的方法里面
- (void)alipayWithDictionary:(NSMutableDictionary *)payDict
{
NSString *partner = @"";
NSString *seller = @"";
NSString * privateKey = @"";
//将商品信息赋予AlixPayOrder的成员变量
Order* order = [Order new];
// NOTE: app_id设置
order.app_id = partner;
// 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";
order.notify_url = [NSString stringWithFormat:@"%@apl.php",LinkName];
// NOTE: sign_type设置
order.sign_type = @"RSA";
// NOTE: 商品数据
order.biz_content = [BizContent new];
order.biz_content.body = [NSString stringWithFormat:@"%@",payDict[@"body"]];
order.biz_content.subject = [NSString stringWithFormat:@"%@",payDict[@"productName"]];
order.biz_content.out_trade_no = [NSString stringWithFormat:@"%@",payDict[@"tradeNO"]]; //订单ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超时时间设置
order.biz_content.total_amount = [NSString stringWithFormat:@"%@",payDict[@"rmb_fee"]]; //商品价格
// order.biz_content.total_amount = @"0.01";
order.biz_content.seller_id = seller;
//将商品信息拼接成字符串
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
// NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
// 需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加签成功,则继续执行支付
if (signedString != nil) {
// 应用注册scheme,在AliSDKDemo-Info.plist定义URL types
NSString *appScheme = @"";
// NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",orderInfoEncoded, signedString];
// 支付宝网页版调用的问题
NSArray * array = [UIApplication sharedApplication].windows;
UIWindow * window = [array firstObject];
[window setHidden:NO];
// NOTE: 调用支付结果开始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"页面返回的结果 = %@",resultDic);
//判断
NSString * resultStatus = resultDic[@"resultStatus"];
NSLog(@"状态码:%@",resultStatus);
// 支付宝网页版调用的问题
NSArray * array = [UIApplication sharedApplication].windows;
UIWindow * window = [array firstObject];
[window setHidden:YES];
[[NSNotificationCenter defaultCenter] postNotificationName:@"alipayStatue" object:nil userInfo:@{@"resultStatus":resultStatus}];
}];
}
}
在AppDelegate里处理回调
#pragma mark --9.0以下版本支付宝的回调方法
- (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) {
// 支付宝网页版调用时,window没有隐藏,要在这里隐藏才行
NSArray * array = [UIApplication sharedApplication].windows;
UIWindow * window = [array firstObject];
[window setHidden:YES];
[[NSNotificationCenter defaultCenter] postNotificationName:@"alipayStatue" object:nil userInfo:@{@"resultStatus":resultDic[@"resultStatus"]}];
}];
}
return YES;
}
#pragma mark --9.0以上版本支付宝的回调方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options{
NSLog(@"url:%@",url);
if ([url.host isEqualToString:@"safepay"]){
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
// 支付宝网页版调用时,window没有隐藏,要在这里隐藏才行
NSArray * array = [UIApplication sharedApplication].windows;
UIWindow * window = [array firstObject];
[window setHidden:YES];
[[NSNotificationCenter defaultCenter] postNotificationName:@"alipayStatue" object:nil userInfo:@{@"resultStatus":resultDic[@"resultStatus"]}];
}];
}
return YES;
}
还有一些小问题就懒的截图贴上去了,基本上感觉文档看懂了,支付宝集成就那么回事...