Copyright ? 2017年ZaneWangWang. All rights reserved.
? ? ? ?總結(jié)一下最近項(xiàng)目中出現(xiàn)的三種支付方式,供大家借鑒,不足之處還望大家提出,方便后期的完善共同進(jìn)步,如果你看到的不是原文請(qǐng)到原文查看支付寶支付過(guò)程卫病。
--支付寶集成過(guò)程
1.cocoapods 集成不在贅述 直接podFile 加入pod'AliPay','~> 最新版本號(hào)'
2.支付寶sdk拖入工程集成方式
(1).支付寶sdk下載地址
(2).把iOS包中的壓縮文件中AlipaySDK.bundle洒宝、 AlipaySDK.framework拷貝到項(xiàng)目文件夾下胧后,并導(dǎo)入到項(xiàng)目工程中萎羔。
(3).在Build Phases選項(xiàng)卡的Link Binary With Libraries中,增加以下依賴:
(4).如果你的app基于9.0編譯溯饵,那么為了適配iOS9.0中的App Transport Security(ATS)對(duì)http的限制,需要在infoplist中加入相應(yīng)的配置:
加入字典NSAppTransportSecurity在字典中加入鍵NSAllowsArbitraryLoads值YES
------------------------------到這里集成過(guò)程完成-----------------------------
--支付過(guò)程
1.支付界面導(dǎo)入#import <AlipaySDK/AlipaySDK.h>
2.自定義一個(gè)下單方法在該方法中,調(diào)用自己服務(wù)器提供的支付接口,一定要按照服務(wù)器要求組織訂單參數(shù)
- (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];
//這里我是使用購(gòu)物車model實(shí)例方法組織的訂單參數(shù)格式如下圖
NSData*jsonData=[NSJSONSerialization dataWithJSONObject:params options:NSJSONWritingPrettyPrinted error:nil];
NSString*jsonStr=[[NSStringalloc]initWithData:jsonDataencoding:NSUTF8StringEncoding];
//1.加粗這一段是我們公司要求的組織訂單,運(yùn)費(fèi)等信息的方式,大家一定要按自己的公司的要求來(lái)做旗们。
//2.下邊調(diào)用公司的下單接口下單,成功與否這要取決于你組織參數(shù)的正確與否了.
[SettlementViewModel sendOrderWithDic:@{@"data":jsonStr} withBackData:^(NSDictionary *info,NSString *error) {
if(error) {
ZANEALERT(@"下單失敗",self);
}else{
if([[info objectForKey:@"httpCode"] integerValue] ==200) {
//3.下單成功后調(diào)用公司的支付接口,在這里后臺(tái)會(huì)對(duì)相應(yīng)的信息進(jìn)行加密,返回給我們加密后的信息(加密這一塊在面試的時(shí)候回問(wèn)到,但是真正在項(xiàng)目中加密都是放在后臺(tái)的)
[self payWithOrderno:[[[info objectForKey:@"data"] firstObject] objectForKey:@"orderNu"]];
}else{
NSString*message = [NSStringstringWithFormat:@"下單失敗:%@", [modelobjectForKey:@"msg"]];
ZANEALERT(message,self);
}}}];}}
//公司的支付接口
- (void)payWithOrderno:(NSString*)numberno{
[SettlementViewModel payWithDic:orderInfo/*按要求組織這里需要用到后臺(tái)返回的下單成功后的訂單號(hào)*/ withBackData:^(NSDictionary*info,NSString*error) {
if(error) {
//這里是錯(cuò)誤信息
}else{
if([[info objectForKey:@"httpCode"] integerValue] ==200) {?
//自己服務(wù)器的支付接口成功后調(diào)用支付寶sdk方法調(diào)起支付
[[AlipaySDK defaultService] payOrder:[info objectForKey:@"data"] fromScheme:urlScheme/*你自己項(xiàng)目的scheme,用于回調(diào)*/ callback:^(NSDictionary*resultDic) {
//這里是沒(méi)有安裝支付寶客戶端反回的支付結(jié)果信息
}];}}}}];}
-----------到這里支付的調(diào)起已經(jīng)完成-----------
--回調(diào)處理
1.在appdelegate里面,導(dǎo)入#import<AlipaySDK/AlipaySDK.h>
2.在相應(yīng)的方法中完成回調(diào)
#pragma mark - Alipay
- (BOOL)application:(UIApplication*)application openURL:(NSURL*)url sourceApplication:(NSString*)sourceApplication annotation:(id)annotation
{
//如果極簡(jiǎn)開(kāi)發(fā)包不可用亲配,會(huì)跳轉(zhuǎn)支付寶錢包進(jìn)行支付,需要將支付寶錢包的支付結(jié)果回傳給開(kāi)發(fā)包
if([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary*resultDic) {
//【由于在跳轉(zhuǎn)支付寶客戶端支付的過(guò)程中谁帕,商戶app在后臺(tái)很可能被系統(tǒng)kill了峡继,所以pay接口的callback就會(huì)失效,請(qǐng)商戶對(duì)standbyCallback返回的回調(diào)結(jié)果進(jìn)行處理,就是在這個(gè)方法里面處理跟callback一樣的邏輯】
NSLog(@"result = %@",resultDic);
}];
}
if([url.hostisEqualToString:@"platformapi"]){//支付寶錢包快登授權(quán)返回authCode
[[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary*resultDic) {
//【由于在跳轉(zhuǎn)支付寶客戶端支付的過(guò)程中匈挖,商戶app在后臺(tái)很可能被系統(tǒng)kill了鬓椭,所以pay接口的callback就會(huì)失效,請(qǐng)商戶對(duì)standbyCallback返回的回調(diào)結(jié)果進(jìn)行處理,就是在這個(gè)方法里面處理跟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"]) {
//跳轉(zhuǎn)支付寶錢包進(jìn)行支付关划,處理支付結(jié)果
[[AlipaySDK defaultService] processOrderWithPaymentResult:urlstandbyCallback:^(NSDictionary*resultDic) {
//支付結(jié)果的處理
if([[resultDic objectForKey:@"resultStatus"]integerValue] ==6001) {
//取消支付
}elseif([[resultDicobjectForKey:@"resultStatus"]integerValue] ==9000){
//支付成功
}}];}
return YES;}
-----------------------------到這里整個(gè)支付過(guò)程就完成了---------------------------