支付寶配置-那些年我們踩過的坑

每次開發(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)!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • 前言 其實(shí)支付很簡單,下載官方的SDK,根據(jù)里面的開發(fā)者文檔和Demo,配置支付,不會可以問客服。(畢竟掏錢了嘛)...
    煎餅果子鄭能量閱讀 1,779評論 0 6
  • iOS支付 iOS支付分為兩類,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)。 第三方支付包括:支付寶支付、微信支付、銀聯(lián)支付、...
    帥不過oneS閱讀 2,926評論 2 8
  • iOS支付 iOS支付分為兩類,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)。 第三方支付包括:支付寶支付、微信支付、銀聯(lián)支付、...
    sillen閱讀 1,413評論 0 1
  • iOS支付 iOS支付分為兩類,第三方支付和應(yīng)用內(nèi)支付(內(nèi)購)。 第三方支付包括:支付寶支付、微信支付、銀聯(lián)支付、...
    羊駝先生丶閱讀 931評論 0 0
  • 你想成為一個什么樣的人?在現(xiàn)實(shí)生活當(dāng)中找到這樣一個人,把她作為自己的榜樣。讓你的目標(biāo)具象化,目標(biāo)感更強(qiáng)烈。 在自己...
    houpanpan926閱讀 231評論 0 4