每次開發(fā)項目都會遇到接入支付寶支付的問題,而且每次都是去網(wǎng)上搜索一下資料然后結(jié)合著官方文檔去配置相關(guān)的內(nèi)容。但是每次配置著實(shí)令人頭疼,特別是對于第一次接觸這個的同學(xué),印象會更加深刻。
下面就簡單的記錄一下接入流程:
首先要去支付寶填申請,可以得到一個parnter和一個seller。然后自己要在自己的電腦上生成一組RSA,把公鑰交給支付寶,私鑰自己留著。具體生成方法支付寶的SDK里面有寫,兩分鐘的事。
然后要從網(wǎng)上下載SDK。從這里下載地址。
得到SDK后先運(yùn)行下他給的iOS端的demo。demo中APViewController.m里面找到下面這幾行代碼,填上你的parnter、seller和privateKey,然后運(yùn)行看下能不能支付成功,如果可以的話,說明你的三個參數(shù)沒有問題,可以準(zhǔn)備接入了
接著把SDK包中的幾個東西拖到你的項目中去:AlipaySDK.bundle,AlipaySDK.framework,libcrypto.a和libssl.a。
然后把demo中Util文件夾拖入你的項目中:
注意!要選擇Create groups!!!
注意!要選擇Create groups!!!
注意!要選擇Create groups!!!
Util拖進(jìn)去后應(yīng)該是黃色的而不是藍(lán)色的!!!
然后把demo中這幾個文件拖到你的項目中:Product.h,Product.m,APAuthV2Info.h,APAuthV2Info.m,Order.h,Order.m
現(xiàn)在你的項目里面應(yīng)該包含這些東西(特別注意下Util文件夾和openssl文件夾的顏色):
在你要用到支付的地方引入以下頭文件
然后參考demo的支付寫了下面這個支付函數(shù)
- (void)Alipay{
/*
*點(diǎn)擊獲取prodcut實(shí)例并初始化訂單信息
*/
//? ? 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;//商品標(biāo)題
order.productDescription = product.body;//商品描述
order.amount = [NSStringstringWithFormat:@"%.2f",product.price];//
order.notifyURL =@"http://www.xxx.com";//回調(diào)URL
order.service =@"mobile.securitypay.pay";
order.paymentType =@"1";
order.inputCharset =@"utf-8";
order.itBPay =@"30m";
order.showUrl =@"m.alipay.com";
//應(yīng)用注冊scheme,在AlixPayDemo-Info.plist定義URL types
NSString*appScheme =@"alisdkdemo";
//將商品信息拼接成字符串
NSString*orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
id signer = CreateRSADataSigner(privateKey);
NSString*signedString = [signer signString:orderSpec];
//將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式
NSString*orderString =nil;
if(signedString !=nil) {
orderString = [NSStringstringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString,@"RSA"];
//回調(diào)會調(diào)用這個函數(shù)
[[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;
}
按照官方的說法,上面的這個函數(shù)就差不多算是把支付寶接入了。但是你點(diǎn)擊command + R 會發(fā)現(xiàn)。。。
報了超多錯!這就是支付寶坑的地方,接下來我們來填坑。
1 、Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’
在base64.h中加入#import 官方古老的demo加到了PCH中,所以不會報錯~結(jié)果他說都不說一聲!!!坑啊有沒有!!!
2、Util/openssl_wrapper.m:11:9: ‘rsa.h’ file not found
在Build setting中搜索search,找到Header Search Paths,添加$(PROJECT_DIR)/openssl和$(PROJECT_DIR)如圖:
當(dāng)然上面的是自己寫的測試demo的路徑,具體的路徑要填寫你自己項目的路徑,格式如下: $(PROJECT_DIR)/文件夾名? ? ? ? (這里說一下,直接點(diǎn)擊openssl,然后showinfinder,然后command + i? 查看路徑,把得到路徑的工程名字以后的部分加在文件夾名這OK了
3、“_CNCopyCurrentNetworkInfo”, referenced from: ? ? ?這類錯很多,大概有這些:
差不多就這些,當(dāng)然也可能遠(yuǎn)不止這些。具體情況,只能在自行百度了。反正以上問題差不多都是缺少依賴庫的問題
這種問題通過在General->Link Framework and Libraiies中添加以下framework解決:
libz.tbd
libc++.tbd
Security.framework
CoreMotion.Framework
CFNetwork.framework
CoreTelephony.framework
SystemConfiguration.framework
到這里你可以再次編譯運(yùn)行一下試試,不倒霉的話,應(yīng)該是沒啥問題了。
最后。。。。。。。。。。。一句
好記性不如爛筆頭!!? ? ? ? ? 站在巨人的肩膀上看的更高更遠(yuǎn)!