每次開發(fā)項目都會遇到接入支付寶支付的問題,而且每次都是去網上搜索一下資料然后結合著官方文檔去配置相關的內容。但是每次配置著實令人頭疼蔓同,特別是對于第一次接觸這個的同學,印象會更加深刻蹲诀。
下面就簡單的記錄一下接入流程:
首先要去支付寶填申請斑粱,可以得到一個parnter和一個seller。然后自己要在自己的電腦上生成一組RSA脯爪,把公鑰交給支付寶则北,私鑰自己留著。具體生成方法支付寶的SDK里面有寫痕慢,兩分鐘的事尚揣。
然后要從網上下載SDK。從這里下載地址掖举。
得到SDK后先運行下他給的iOS端的demo快骗。demo中APViewController.m里面找到下面這幾行代碼,填上你的parnter塔次、seller和privateKey方篮,然后運行看下能不能支付成功,如果可以的話励负,說明你的三個參數沒有問題藕溅,可以準備接入了
接著把SDK包中的幾個東西拖到你的項目中去:AlipaySDK.bundle,AlipaySDK.framework,libcrypto.a和libssl.a。
然后把demo中Util文件夾拖入你的項目中:
注意继榆!要選擇Create groups=肀怼!裕照!
注意攒发!要選擇Create groups!=稀惠猿!
注意!要選擇Create groups8杭洹E佳!
Util拖進去后應該是黃色的而不是藍色的U!V悍谩!
然后把demo中這幾個文件拖到你的項目中:Product.h,Product.m,APAuthV2Info.h,APAuthV2Info.m,Order.h,Order.m
現在你的項目里面應該包含這些東西(特別注意下Util文件夾和openssl文件夾的顏色):
在你要用到支付的地方引入以下頭文件
然后參考demo的支付寫了下面這個支付函數
- (void)Alipay{
/*
*點擊獲取prodcut實例并初始化訂單信息
*/
//? ? Product *product = [self.productList objectAtIndex:indexPath.row];
Product *product = [[Product alloc] init];
product.subject =@"1";
product.body =@"人在塔在";
product.price =0.01f+pow(10,-2);
/*
*商戶的唯一的parnter和seller董虱。
*簽約后扼鞋,支付寶會為每個商戶分配一個唯一的 parnter 和 seller申鱼。
*/
/*============================================================================*/
/*=======================需要填寫商戶app申請的===================================*/
/*============================================================================*/
NSString*partner =@"";
NSString*seller =@"";
NSString*privateKey = @“私鑰”;
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/
//partner和seller獲取失敗,提示
if([partner length] ==0||
[seller length] ==0||
[privateKey length] ==0)
{
UIAlertView*alert = [[UIAlertViewalloc] initWithTitle:@"提示"
message:@"缺少partner或者seller或者私鑰。"
delegate:self
cancelButtonTitle:@"確定"
otherButtonTitles:nil];
[alert show];
}
/*
*生成訂單信息及簽名
*/
product.price =0.01f+pow(10,-2);//商品價格
//將商品信息賦予AlixPayOrder的成員變量
Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
order.tradeNO = [selfgenerateTradeNO];//訂單ID(由商家自行制定)
order.productName = product.subject;//商品標題
order.productDescription = product.body;//商品描述
order.amount = [NSStringstringWithFormat:@"%.2f",product.price];//
order.notifyURL =@"http://www.xxx.com";//回調URL
order.service =@"mobile.securitypay.pay";
order.paymentType =@"1";
order.inputCharset =@"utf-8";
order.itBPay =@"30m";
order.showUrl =@"m.alipay.com";
//應用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString*appScheme =@"alisdkdemo";
//將商品信息拼接成字符串
NSString*orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//獲取私鑰并將商戶信息簽名,外部商戶可以根據情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id signer = CreateRSADataSigner(privateKey);
NSString*signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴格按照該格式
NSString*orderString =nil;
if(signedString !=nil) {
orderString = [NSStringstringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString,@"RSA"];
//回調會調用這個函數
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary*resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
//? ? ? ? [tableView deselectRowAtIndexPath:indexPath animated:YES];
}
}
- (NSString*)generateTradeNO
{
staticintkNumber =15;
NSString*sourceStr =@"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
NSMutableString*resultStr = [[NSMutableStringalloc] init];
srand(time(0));
for(inti =0; i < kNumber; i++)
{
unsignedindex = rand() % [sourceStr length];
NSString*oneStr = [sourceStr substringWithRange:NSMakeRange(index,1)];
[resultStr appendString:oneStr];
}
returnresultStr;
}
按照官方的說法云头,上面的這個函數就差不多算是把支付寶接入了捐友。但是你點擊command + R 會發(fā)現。溃槐。匣砖。
報了超多錯!這就是支付寶坑的地方昏滴,接下來我們來填坑猴鲫。
1 、Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’
在base64.h中加入#import 官方古老的demo加到了PCH中谣殊,所以不會報錯~結果他說都不說一聲7鞴病!蟹倾!坑啊有沒有O辉怠!鲜棠!
2肌厨、Util/openssl_wrapper.m:11:9: ‘rsa.h’ file not found
在Build setting中搜索search,找到Header Search Paths豁陆,添加$(PROJECT_DIR)/openssl和$(PROJECT_DIR)如圖:
當然上面的是自己寫的測試demo的路徑柑爸,具體的路徑要填寫你自己項目的路徑,格式如下: $(PROJECT_DIR)/文件夾名? ? ? ? (這里說一下盒音,直接點擊openssl表鳍,然后showinfinder,然后command + i? 查看路徑,把得到路徑的工程名字以后的部分加在文件夾名這OK了
3祥诽、“_CNCopyCurrentNetworkInfo”, referenced from: ? ? ?這類錯很多譬圣,大概有這些:
差不多就這些,當然也可能遠不止這些雄坪。具體情況厘熟,只能在自行百度了。反正以上問題差不多都是缺少依賴庫的問題
這種問題通過在General->Link Framework and Libraiies中添加以下framework解決:
libz.tbd
libc++.tbd
Security.framework
CoreMotion.Framework
CFNetwork.framework
CoreTelephony.framework
SystemConfiguration.framework
到這里你可以再次編譯運行一下試試维哈,不倒霉的話绳姨,應該是沒啥問題了。
最后阔挠。飘庄。。购撼。跪削。谴仙。。碾盐。狞甚。。廓旬。一句
好記性不如爛筆頭!谐腰!? ? ? ? ? 站在巨人的肩膀上看的更高更遠孕豹!