Copyright © 2017年ZaneWangWang. All rights reserved.
总结一下最近项目中出现的三种支付方式,供大家借鉴,不足之处还望大家提出,方便后期的完善共同进步,如果你看到的不是原文请到原文查看支付宝支付过程。
--支付宝集成过程
1.cocoapods 集成不在赘述 直接podFile 加入pod'AliPay','~> 最新版本号'
2.支付宝sdk拖入工程集成方式
(1).支付宝sdk下载地址
(2).把iOS包中的压缩文件中AlipaySDK.bundle、 AlipaySDK.framework拷贝到项目文件夹下,并导入到项目工程中。
(3).在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
(4).如果你的app基于9.0编译,那么为了适配iOS9.0中的App Transport Security(ATS)对http的限制,需要在infoplist中加入相应的配置:
加入字典NSAppTransportSecurity在字典中加入键NSAllowsArbitraryLoads值YES
------------------------------到这里集成过程完成-----------------------------
--支付过程
1.支付界面导入#import <AlipaySDK/AlipaySDK.h>
2.自定义一个下单方法在该方法中,调用自己服务器提供的支付接口,一定要按照服务器要求组织订单参数
- (IBAction)respondsToOrderBnt:(UIButton*)sender {
NSDictionary*params =[[ShoppingCart shareShoppingCart] getOrderInfoWithType:_isDetailCome withRemarks:[cell.userMessage.text isEqualToString:@""]?@"支付":cell.userMessage.textwithAddress:_userAddress?_userAddress:_address.addresss[0] withInvoiceState:@"1"withFreight:_freight];
//这里我是使用购物车model实例方法组织的订单参数格式如下图
NSData*jsonData=[NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
NSString*jsonStr=[[NSStringalloc]initWithData:jsonDataencoding:NSUTF8StringEncoding];
//1.加粗这一段是我们公司要求的组织订单,运费等信息的方式,大家一定要按自己的公司的要求来做。
//2.下边调用公司的下单接口下单,成功与否这要取决于你组织参数的正确与否了.
[SettlementViewModel sendOrderWithDic:@{@"data":jsonStr} withBackData:^(NSDictionary *info,NSString *error) {
if(error) {
ZANEALERT(@"下单失败",self);
}else{
if([[info objectForKey:@"httpCode"] integerValue] ==200) {
//3.下单成功后调用公司的支付接口,在这里后台会对相应的信息进行加密,返回给我们加密后的信息(加密这一块在面试的时候回问到,但是真正在项目中加密都是放在后台的)
[self payWithOrderno:[[[info objectForKey:@"data"] firstObject] objectForKey:@"orderNu"]];
}else{
NSString*message = [NSStringstringWithFormat:@"下单失败:%@", [modelobjectForKey:@"msg"]];
ZANEALERT(message,self);
}}}];}}
//公司的支付接口
- (void)payWithOrderno:(NSString*)numberno{
[SettlementViewModel payWithDic:orderInfo/*按要求组织这里需要用到后台返回的下单成功后的订单号*/ withBackData:^(NSDictionary*info,NSString*error) {
if(error) {
//这里是错误信息
}else{
if([[info objectForKey:@"httpCode"] integerValue] ==200) {
//自己服务器的支付接口成功后调用支付宝sdk方法调起支付
[[AlipaySDK defaultService] payOrder:[info objectForKey:@"data"] fromScheme:urlScheme/*你自己项目的scheme,用于回调*/ callback:^(NSDictionary*resultDic) {
//这里是没有安装支付宝客户端反回的支付结果信息
}];}}}}];}
-----------到这里支付的调起已经完成-----------
--回调处理
1.在appdelegate里面,导入#import<AlipaySDK/AlipaySDK.h>
2.在相应的方法中完成回调
#pragma mark - Alipay
- (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) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
NSLog(@"result = %@",resultDic);
}];
}
if([url.hostisEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary*resultDic) {
//【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
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:urlstandbyCallback:^(NSDictionary*resultDic) {
//支付结果的处理
if([[resultDic objectForKey:@"resultStatus"]integerValue] ==6001) {
//取消支付
}elseif([[resultDicobjectForKey:@"resultStatus"]integerValue] ==9000){
//支付成功
}}];}
return YES;}
-----------------------------到这里整个支付过程就完成了---------------------------