這里我講的是關(guān)于最新的支付寶支付的流程
-
1.有個(gè)
支付寶賬號(hào)
并申請(qǐng)自己的app
應(yīng)用 -
1.1.創(chuàng)建應(yīng)用
-
1.2.設(shè)置
bundle Id
(要和自己項(xiàng)目的保持一致)
-
2.公鑰和私鑰的生成
2.1尋找生成器
-
2.2.下載公鑰和私鑰生成器
-
2.3打開下載好的生成器,雙擊
2.4.公鑰和私鑰的生成
- 2.5.公鑰的使用
- 3.支付寶
SDK
的使用 - 3.1先下載一個(gè)支付寶的
SDK
(官方文檔->APP
支付->iOS
集成流程詳解)
- 3.2下載
SDK
- 3.3選擇
iOS
客戶端
- 3.4在項(xiàng)目里面導(dǎo)入下面的組合文件夾
-
3.5.在
pch
文件里面導(dǎo)入#ifdef __OBJC__ #import <UIKit/UIKit.h> #import <Foundation/Foundation.h> #endif
3.6.在
Build Phases
選項(xiàng)卡的Link Binary With Libraries
中喜爷,增加以下依賴:
其中,需要注意的是:
如果是
Xcode 7.0
之后的版本忍法,需要添加libc++.tbd魁蒜、libz.tbd
叼丑;如果是
Xcode 7.0
之前的版本,需要添加libc++.dylib、libz.dylib
(如下圖)秋麸。
- 3.7.上面的步驟做完運(yùn)行一下,會(huì)報(bào)錯(cuò)
解決辦法:配置路徑:配置完再運(yùn)行就沒(méi)事了
-
4.在需要使用支付的地方導(dǎo)入下面的頭文件(也可寫在
pch
文件里面)//訂單框架 #import "Order.h" //使用RSA加密框架 #import "DataSigner.h" //支付報(bào)框架 #import <AlipaySDK/AlipaySDK.h>
5.在點(diǎn)擊支付的方法里面調(diào)用下面的方法
這兩項(xiàng)用戶需要自己填寫
應(yīng)用的appID
NSString *appID = @"";
私鑰(上面的步驟有生成)
NSString *privateKey = @"";
- (void)doAlipayPay
{
//重要說(shuō)明
//這里只是為了方便直接向商戶展示支付寶的整個(gè)支付流程嗜诀;所以Demo中加簽過(guò)程直接放在客戶端完成猾警;
//真實(shí)App里,privateKey等數(shù)據(jù)嚴(yán)禁放在客戶端隆敢,加簽過(guò)程務(wù)必要放在服務(wù)端完成发皿;
//防止商戶私密數(shù)據(jù)泄露,造成不必要的資金損失拂蝎,及面臨各種安全風(fēng)險(xiǎn)穴墅;
/*=======================需要填寫商戶app申請(qǐng)的===================================*/
/*============================================================================*/
NSString *appID = @"";
NSString *privateKey = @"";
/*============================================================================*/
//partner和seller獲取失敗,提示
if ([appID length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"message:@"缺少appId或者私鑰。"
delegate:self cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
return;
}
/*
*生成訂單信息及簽名
*/
//將商品信息賦予AlixPayOrder的成員變量
Order* order = [Order new];
// NOTE: app_id設(shè)置
order.app_id = appID;
// NOTE: 支付接口名稱
order.method = @"alipay.trade.app.pay";
// NOTE: 參數(shù)編碼格式
order.charset = @"utf-8";
// NOTE: 當(dāng)前時(shí)間點(diǎn)
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設(shè)置
order.sign_type = @"RSA";
// NOTE: 商品數(shù)據(jù)
order.biz_content = [BizContent new];
order.biz_content.body = @"我是測(cè)試數(shù)據(jù)";
order.biz_content.subject = @"1";
order.biz_content.out_trade_no = [self generateTradeNO]; //訂單ID(由商家自行制定)
order.biz_content.timeout_express = @"30m"; //超時(shí)時(shí)間設(shè)置
order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品價(jià)格
//將商品信息拼接成字符串
NSString *orderInfo = [order orderInfoEncoded:NO];
NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
NSLog(@"orderSpec = %@",orderInfo);
// NOTE: 獲取私鑰并將商戶信息簽名,外部商戶的加簽過(guò)程請(qǐng)務(wù)必放在服務(wù)端玄货,防止公私鑰數(shù)據(jù)泄露皇钞;
// 需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加簽成功誉结,則繼續(xù)執(zhí)行支付
if (signedString != nil) {
//應(yīng)用注冊(cè)scheme,在AliSDKDemo-Info.plist定義URL types
NSString *appScheme = @"alisdkdemo";
// NOTE: 將簽名成功字符串格式化為訂單字符串,請(qǐng)嚴(yán)格按照該格式
NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
orderInfoEncoded, signedString];
// NOTE: 調(diào)用支付結(jié)果開始支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"123reslut = %@",resultDic);
}];
}
}
- (NSString *)generateTradeNO
{
static int kNumber = 15;
NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString *resultStr = [[NSMutableString alloc] init];
srand((unsigned)time(0));
for (int i = 0; i < kNumber; i++)
{
unsigned index = rand() % [sourceStr length];
NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
[resultStr appendString:oneStr];
}
return resultStr;
}
6.回調(diào)的添加
6.1.代碼中的回調(diào)標(biāo)識(shí)符
-
6.2.工程中配置
提示:如果報(bào)下面的錯(cuò)
撥錯(cuò):集成支付寶 報(bào)錯(cuò):rsa_private read error : private key is NULL
解決辦法:
兩中解決方法
-
1解決方法:
1)在RSADataSigner.m文件中 搜索代碼 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"]; 將其改成 [result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"]; 2)在RSADataSigner.m文件中 搜索代碼 [result appendString:@"\n-----END PRIVATE KEY-----"]; 將其改成 [result appendString:@"\n-----END RSA PRIVATE KEY-----"];
-
2解決方法:
A鹅士、將私鑰轉(zhuǎn)成PKCS8替換一下原私鑰即可 1、生成私鑰pem, 執(zhí)行命令 openssl genrsa -out rsa_private_key.pem 1024 2惩坑、生成公鑰,執(zhí)行命令 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem 3掉盅、 將RSA私鑰轉(zhuǎn)換成PKCS8格式,命令執(zhí)行 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt ( PHP服務(wù)端語(yǔ)言讀取私鑰不需要PKCS8轉(zhuǎn)換)
iOS公鑰私鑰生成器 密碼: pqyk
我已經(jīng)拖好的需要導(dǎo)入的文件 密碼: aqyg
ios支付寶demo 密碼: cbfx
老版本的支付寶,自己做的demo 密碼: dkwf
老版本的支付寶集成文檔
支付寶常見的其他bug解決
-
Redefinition of 'RSA' as different kind of symbol
- 上那個(gè)面的問(wèn)題多為sdk集成時(shí)產(chǎn)生的坑,因?yàn)槲覀児驹诩芍Ц秾氈耙允妫杏眠^(guò)RSA加密趾痘,導(dǎo)致重名問(wèn)題
解決辦法:
(1)這個(gè)問(wèn)題不是每個(gè)公司都可能遇到的,但遇到也心煩
(2)由于支付寶中的openssl中的rsa.h文件與RSA加密有重名沖突蔓钟。改掉公司自己之前導(dǎo)入RSA的命名永票,如果你牛逼也可以去改rsa.h中的
-
2.集成支付寶 報(bào)錯(cuò):
rsa_private read error : private key is NULL
兩中解決方法1.解決方法:
- 1>在RSADataSigner.m文件中 搜索代碼 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"]; 將其改成 [result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];
- 2>在RSADataSigner.m文件中 搜索代碼 [result appendString:@"\n-----END PRIVATE KEY-----"]; 將其改成 [result appendString:@"\n-----END RSA PRIVATE KEY-----"];
2.解決方法:
A、將私鑰轉(zhuǎn)成PKCS8替換一下原私鑰即可
- 1滥沫、生成私鑰pem, 執(zhí)行命令 openssl genrsa -out rsa_private_key.pem 1024
- 2侣集、生成公鑰,執(zhí)行命令 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
- 3、 將RSA私鑰轉(zhuǎn)換成PKCS8格式,命令執(zhí)行 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
( PHP服務(wù)端語(yǔ)言讀取私鑰不需要PKCS8轉(zhuǎn)換)
3.其他
APP支付報(bào)錯(cuò)ALI64處理方案
APP支付報(bào)錯(cuò)ALI40247處理方案
螞蟻金服開發(fā)者社區(qū) 鑒于很多對(duì)接app支付的童鞋經(jīng)常出現(xiàn)app支付系統(tǒng)繁忙兰绣,ali40247世分,訂單信息異常在等等的錯(cuò)誤,其實(shí)那些錯(cuò)誤都是大同小異的缀辩,無(wú)非就是沒(méi)權(quán)限臭埋,密鑰不對(duì),參數(shù)傳值錯(cuò)誤臀玄,請(qǐng)求信息拼接有問(wèn)題等等
最后推薦其他人的博客
結(jié)論:如果有不懂得地方大家可以私聊我,歡迎批評(píng)指正!!!謝謝