支付在不少主流的APP中都會用到,最多見的支付是支付寶、微信、銀聯等。express
恰好公司項目都須要用到,目前只調試好了支付寶,以前想抽時間寫,老是拖拖拉拉的,索性在後臺寫微信支付的時候狠下心來把支付寶SDK集成以及支付實現記錄下來,後續會陸續放上微信,銀聯等支付文章,不足之處但願各位看官諒解,小子會加以改正。微信
注意:支付寶開發文檔多看幾遍!!!app
一塊兒看一下支付寶支付流程圖,這樣方便你們理解每一步後臺作了什麼,移動端須要怎麼進行配合:ide
1.首先在支付寶平臺建立應用,獲取appid,appid是16位數字,在項目中須要用到(以後開通支付功能)。open.alipay.compost
2.獲取appid以後,下載官方調試Demo,https://docs.open.alipay.com/54/104509微信支付
以後會看到分別有iOS和Android代碼,打開以下:編碼
a.分別將下圖中的1,2放到本身的工程當中url
b.添加一下須要的依賴庫,支付寶文檔中可查到https://docs.open.alipay.com/204/105295/spa
c.工程中在Info下找到Url Types,添加支付寶的Url Schemes,支付的時候須要使用調試
而後運行demo,基本不會報錯,報錯的話,查一下文檔,會有解決辦法
支付寶SDK集成完成了,那麼下面就是支付流程,也就是demo了:
這裏的圖片是以上下載的支付寶支付調試Demo,支付方法裏面的demo能夠根據本身須要進行更改,
這裏貼上我在項目中使用的demo:
這裏須要後臺給一個接口,獲取訂單的總額,外部訂單號,通知url,body,subject以便支付的時候進行更換
本身項目中還須要更換的就是以前獲取的APPID,私鑰AliPrivate,AliScheme,
1 NSURL * myURL_APP_A = [NSURL URLWithString:@"alipay:"]; 2 if (![[UIApplication sharedApplication] canOpenURL:myURL_APP_A]) { 3 //若是沒有安裝支付寶客戶端那麼須要安裝 4 [MBProgressHUD showMBPAlertView:@"您尚未安裝支付寶" withSecond:2.0]; 5 return; 6 } 7 NSDictionary *dic = @{ 8 @"orderNo":orderModel.orderNo 9 }; 10 [[SG_HttpsTool sharedSG_HttpsTool] postWithURL:SHAlipayRequestUrl params:dic success:^(id JSON, int code, NSString *msg) { 11 12 if (code == 0) { 13 14 SH_PayAlipayModel *aliModel = [SH_PayAlipayModel mj_objectWithKeyValues:JSON[@"alipaymentOrder"]]; 15 //私鑰是後臺分發的 16 NSString *rsa2PrivateKey = AliPrivateKey; 17 NSString *rsaPrivateKey = @""; 18 //AppIDhe PrivateKey沒有配置的提示 19 if ([AlipayAppId length] == 0 || [AliPrivateKey length] == 0) { 20 UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示" message:@"缺乏appid或者私鑰" delegate:self cancelButtonTitle:@"肯定" otherButtonTitles:nil]; 21 [alert show]; 22 return; 23 } 24 25 26 /** 27 * 生成訂單信息 28 * 將商品信息賦予AliPayOrder的成員變量 29 */ 30 Order *order = [[Order alloc] init]; 31 //appid---》以前得到的APPID 32 order.app_id = AlipayAppId; 33 //支付接口名稱 34 order.method = @"alipay.trade.app.pay"; 35 //參數編碼格式 36 order.charset = @"utf-8"; 37 //當前時間點 38 NSDateFormatter *formatter = [NSDateFormatter new]; 39 [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; 40 order.timestamp = [formatter stringFromDate:[NSDate date]]; 41 42 //支付版本 43 order.version = @"1.0"; 44 order.sign_type = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA"; 45 order.notify_url = aliModel.notifyUrl; 46 47 order.biz_content = [BizContent new]; 48 order.biz_content.body = aliModel.Description; 49 //支付寶支付頁面的訂單信息 50 order.biz_content.subject = aliModel.title; 51 //訂單id----》後臺返回的 52 order.biz_content.out_trade_no = aliModel.outTradeNo; 53 //超時時間 54 order.biz_content.timeout_express = @"30s"; 55 //價格---》後臺返回 56 order.biz_content.total_amount = aliModel.totalAmount; 57 58 order.biz_content.product_code = @"QUICK_MSECURITY_PAY"; 59 60 /** 61 * 將商品信息拼接成字符串 62 */ 63 NSString *orderInfo = [order orderInfoEncoded:NO]; 64 NSString *orderInfoEncoded = [order orderInfoEncoded:YES]; 65 //SHLog(@"orderSpec = %@", orderInfo) 66 67 //獲取私鑰並將商戶信息簽名,外部商戶的加簽過程務必放在服務端,防止公鑰數據泄露 68 //須要遵循RSA簽名規範,並將簽名字符串base64編碼和UrlEncode 69 NSString *signedString = nil; 70 APRSASigner* signer = [[APRSASigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)]; 71 if ((rsa2PrivateKey.length > 1)) { 72 signedString = [signer signString:orderInfo withRSA2:YES]; 73 } else { 74 signedString = [signer signString:orderInfo withRSA2:NO]; 75 } 76 SHLog(@"%@", signedString) 77 //若是加簽成功,則繼續執行支付 78 if (signedString != nil) { 79 //應用註冊scheme,在info.plist定義URL types 80 //將簽名成功字符串格式化爲訂單字符串,請嚴格按照該格式 81 NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderInfoEncoded, signedString]; 82 //調用支付結果開始支付, AliAppScheme-->以前設置的Url Schemes 83 84 [[AlipaySDK defaultService] payOrder:orderString fromScheme:AliAppScheme callback:^(NSDictionary *resultDic) { 85 int resultStatus = [resultDic[@"resultStatus"] intValue]; 86 SHLog(@"%d", resultStatus) 87 if (resultStatus == 9000) { 88 89 } 90 }]; 91 92 } 93 94 } 95 } failure:^(NSError *error) { 96 97 }];
以上步驟完成以後,那麼就能夠調起支付寶進行支付了
下面開始支付寶支付結果以後的操做:
根據支付結果,進行通知處理,而後進行本身業務上的實現