填坑
支付寶填坑是每個接入支付寶必經(jīng)之路,下面是我接入支付寶遇到的問題匯總,希望大家在接入的路上少一點彎路
問題1. Util/base64.h:63:21: Cannot find interface declaration for ‘NSObject’, superclass of ‘Base64’
解決辦法:
這是base64.h中沒有加入#import <Foundation/Foundation.h> 系統(tǒng)庫文件導致,這個錯誤報錯方法直接想噴它一臉。報錯方式太惡心。
問題2.截圖告知你什么問題

解決辦法:
這個問題可以同上的,心情好,截圖再次說明下,在 openssl_wrapper.h中#import <Foundation/Foundation.h> 庫即可
問題3.Util/openssl_wrapper.m:11:9: ‘rsa.h’ file not found
解決辦法:
(1),萬年老坑,只要你接入支付寶百分百要遇到的問題,所以習以為常吧
(2),在Build setting中搜索search,找到Header Search Paths,添加$(PROJECT_DIR)/openssl和$(PROJECT_DIR) 如下圖:
(3),重要 問題說三遍,這是網(wǎng)絡找到的到答案后繼續(xù)有同樣的坑,自己的解決方案,
Header Search Paths $(PROJECT_DIR)/ali中輸入這個
Framework Search Paths 和 Library Search Paths 繼續(xù)是$(inherited) 和 $(PROJECT_DIR)/ali
‘rsa.h’ file not found 的解決方案
(4),由于后期多項目的接入,讓我知道一個算是萬能方法吧,就是始終保持Header Search Paths 和 Library Search Paths 都能找到你導入的openssl的正確路徑即可,已嘗試多遍,是能解決以上問題(求黑)


問題4.這類錯很多,大概有這些:這些可能是庫文件沒有導入,導致的
“_CNCopyCurrentNetworkInfo”, referenced from:
Undefined symbols for architecture x86_64:
"_CNCopyCurrentNetworkInfo", referenced from:
-[APayReachability wifiInterface] in AlipaySDK
+[internal_DeviceInfo getSSIDInfo] in AlipaySDK
+[internal_DeviceInfo getNetworkInfo] in AlipaySDK
"_CNCopySupportedInterfaces", referenced from:
-[APayReachability wifiInterface] in AlipaySDK
+[internal_DeviceInfo getSSIDInfo] in AlipaySDK
+[internal_DeviceInfo getNetworkInfo] in AlipaySDK
"_CTRadioAccessTechnologyCDMA1x", referenced from:
-[AliSecXReachability networkStatusForFlags:] in AlipaySDK
"_CTRadioAccessTechnologyEdge", referenced from:
-[AliSecXReachability networkStatusForFlags:] in AlipaySDK
"_CTRadioAccessTechnologyGPRS", referenced from:
-[AliSecXReachability networkStatusForFlags:] in AlipaySDK
"_CTRadioAccessTechnologyLTE", referenced from:
-[AliSecXReachability networkStatusForFlags:] in AlipaySDK
"OBJC_CLASS$_CMMotionManager", referenced from:
objc-class-ref in AlipaySDK
"OBJC_CLASS$_CTTelephonyNetworkInfo", referenced from:
objc-class-ref in AlipaySDK
"_SCNetworkReachabilityCreateWithAddress", referenced from:
+[APayReachability reachabilityWithAddress:] in AlipaySDK
+[AliSecXReachability reachabilityWithAddress:] in AlipaySDK
"_SCNetworkReachabilityCreateWithName", referenced from:
+[APayReachability reachabilityWithHostname:] in AlipaySDK
+[AliSecXReachability reachabilityWithHostName:] in AlipaySDK
"_SCNetworkReachabilityGetFlags", referenced from:
-[APayReachability isReachable] in AlipaySDK
-[APayReachability isReachableViaWWAN] in AlipaySDK
-[APayReachability isReachableViaWiFi] in AlipaySDK
-[APayReachability connectionRequired] in AlipaySDK
-[APayReachability isConnectionOnDemand] in AlipaySDK
-[APayReachability isInterventionRequired] in AlipaySDK
-[APayReachability reachabilityFlags] in AlipaySDK
...
"_SCNetworkReachabilityScheduleWithRunLoop", referenced from:
-[AliSecXReachability startNotifier] in AlipaySDK
"_SCNetworkReachabilitySetCallback", referenced from:
-[APayReachability startNotifier] in AlipaySDK
-[APayReachability stopNotifier] in AlipaySDK
-[AliSecXReachability startNotifier] in AlipaySDK
"_SCNetworkReachabilitySetDispatchQueue", referenced from:
-[APayReachability startNotifier] in AlipaySDK
-[APayReachability stopNotifier] in AlipaySDK
"_SCNetworkReachabilityUnscheduleFromRunLoop", referenced from:
-[AliSecXReachability stopNotifier] in AlipaySDK
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::__init(char const, unsigned long)", referenced from:
CAliSecXURL::encodeURIComponent(CAliSecXBuffer&) in AlipaySDK
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::reserve(unsigned long)", referenced from:
CAliSecXURL::encodeURIComponent(CAliSecXBuffer&) in AlipaySDK
"std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::~basic_string()", referenced from:
CAliSecXURL::encodeURIComponent(CAliSecXBuffer&) in AlipaySDK
"std::nothrow", referenced from:
CAliSecXBuffer::CAliSecXBuffer(unsigned long) in AlipaySDK
CAliSecXBuffer::_copy(unsigned char const, unsigned long) in AlipaySDK
CAliSecXBuffer::resize(unsigned long) in AlipaySDK
"std::terminate()", referenced from:
___clang_call_terminate in AlipaySDK
"operator delete", referenced from:
CAliSecXBuffer::~CAliSecXBuffer() in AlipaySDK
CAliSecXBuffer::release() in AlipaySDK
CAliSecXBuffer::~CAliSecXBuffer() in AlipaySDK
CAliSecXBuffer::operator=(CAliSecXBuffer const&) in AlipaySDK
CAliSecXBuffer::resize(unsigned long) in AlipaySDK
alisec_crypto_Hex2Bin(CAliSecXBuffer const&) in AlipaySDK
alisec_crypto_Bin2Hex(CAliSecXBuffer const&) in AlipaySDK
...
"operator new[](unsigned long, std::nothrow_t const&)", referenced from:
CAliSecXBuffer::CAliSecXBuffer(unsigned long) in AlipaySDK
CAliSecXBuffer::_copy(unsigned char const*, unsigned long) in AlipaySDK
CAliSecXBuffer::resize(unsigned long) in AlipaySDK
"___cxa_begin_catch", referenced from:
___clang_call_terminate in AlipaySDK
"___gxx_personality_v0", referenced from:
+[ASSStorageAccesser saveStorageModel:] in AlipaySDK
+[ASSStorageAccesser loadStorageModelFromKeychain] in AlipaySDK
+[ASSStorageAccesser loadPreviousApdid] in AlipaySDK
+[ASSStorageAccesser getRandomizedID] in AlipaySDK
+[ASSStorageAccesser getNewRadomizedID] in AlipaySDK
+[ASSStorageAccesser loadLastLoginTime] in AlipaySDK
+[ASSStorageAccesser saveCurrentLoginTime:] in AlipaySDK
...
"_deflate", referenced from:
+[ASSCommonUtils gzipData:] in AlipaySDK
+[DTGZipUtil compressGZip:] in AlipaySDK
"_deflateEnd", referenced from:
+[ASSCommonUtils gzipData:] in AlipaySDK
+[DTGZipUtil compressGZip:] in AlipaySDK
"deflateInit2", referenced from:
+[ASSCommonUtils gzipData:] in AlipaySDK
+[DTGZipUtil compressGZip:] in AlipaySDK
"_kCNNetworkInfoKeyBSSID", referenced from:
+[UIDevice(APEX) networkDic] in AlipaySDK
"_kCNNetworkInfoKeySSID", referenced from:
+[UIDevice(APEX) networkDic] in AlipaySDK
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
解決辦法:
這種問題通過在General->Link Framework and Libraiies中添加以下framework解決:
- libz.tbd
- libc++.tbd
- Security.framework
- CoreMotion.Framework
- CFNetwork.framework
- CoreTelephony.framework
- SystemConfiguration.framework
截圖如下,由于公司同時接入支付寶和微信支付,所以導入的庫就多了點咯:

問題5.Redefinition of 'RSA' as different kind of symbol 多為sdk集成時產(chǎn)生的坑,因為我們公司在集成支付寶之前,有用過RSA加密,導致重名問題
解決辦法:
(1),這個問題不是每個公司都可能遇到的,但遇到也心煩
(2),由于支付寶中的openssl中的rsa.h文件與RSA加密有重名沖突。改掉公司自己之前導入RSA的命名,如果你牛逼也可以去改rsa.h中的
問題6;系統(tǒng)庫導入問題
+++++++++++++
symbol(s) not found for architecture arm64

解決辦法
就是導入系統(tǒng)庫了

問題7:終于到微信了,接入微信,你就開心了
因為問題太少了,只能感謝下這兩個帖子的樓主了
解決辦法:
使用微信支付SDK1.5版本的支付demo
微信支付如果遇到跳轉只有一個確定請看這里
為了一些懶人懶的去看帖子,簡單說,就是微信支付注冊放在友盟分享之后就ok了!
代碼示例:
// 友盟分享
[self configUmengShare];
//向微信注冊
[WXApi registerApp:@"wxb4ba3c02aa476ea1" withDescription:@"demo 2.0"];
問題8:
拉起微信支付后,在微信支付注冊在友盟之后仍然跳轉到微信還是一個確定按鈕,點擊確定按鈕回到自己的應用
解決辦法:
這個是后端返回的參數(shù)有問題,一般是sign簽名有問題,
************注意:
1.簽名 后端簽名是要用到下面6個參數(shù)進行簽名,appId,partnerId,noncestr,timestamp,package prepaid,簽名過程中,6個參數(shù)都是小寫,簽名后字符轉為大寫,sign字符全是大寫
2.隨機串 請求預交易訂單返回的
3.時間戳 訂單結束時間
舉例:如下是請求后端返回的數(shù)據(jù)
["appid"]=>
string(18) "wx5e71abd366954a75"
["noncestr"]=>
string(16) "Ws5NaX2MqdGejNvW"
["package"]=>
string(10) "Sign=WXPay"
["partnerid"]=>
string(10) "1341184101"
["prepayid"]=>
string(36) "wx20160530173622a5292225780182728337"
["sign"]=>
string(32) "322B952AC0678F21DD1F7C5B1F444886"
["timestamp"]=>
int(1464601340)
}
把后端返回的sign和自己簽名的sign做個比較,native已經(jīng)認證過,沒有錯誤
-(NSString *)createMD5SingForPayWithAppID:(NSString *)appid_key partnerid:(NSString *)partnerid_key prepayid:(NSString *)prepayid_key package:(NSString *)package_key noncestr:(NSString *)noncestr_key timestamp:(UInt32)timestamp_key{
NSMutableDictionary *signParams = [NSMutableDictionary dictionary];
//簽名的6個鍵值對中的key都必須小寫
[signParams setObject:appid_key forKey:@"appid"];//微信appid 例如wxfb132134e5342
[signParams setObject:noncestr_key forKey:@"noncestr"];//隨機字符串
[signParams setObject:package_key forKey:@"package"];//擴展字段 參數(shù)為 Sign=WXPay
[signParams setObject:partnerid_key forKey:@"partnerid"];//商戶賬號
[signParams setObject:prepayid_key forKey:@"prepayid"];//此處為統(tǒng)一下單接口返回的預支付訂單號
[signParams setObject:[NSString stringWithFormat:@"%u",timestamp_key] forKey:@"timestamp"];//時間戳
NSMutableString *contentString =[NSMutableString string];
NSArray *keys = [signParams allKeys];
//按字母順序排序
NSArray *sortedArray = [keys sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
return [obj1 compare:obj2 options:NSNumericSearch];
}];
//拼接字符串
for (NSString *categoryId in sortedArray) {
if ( ![[signParams objectForKey:categoryId] isEqualToString:@""]
&& ![[signParams objectForKey:categoryId] isEqualToString:@"sign"]
&& ![[signParams objectForKey:categoryId] isEqualToString:@"key"]
)
{
[contentString appendFormat:@"%@=%@&", categoryId, [signParams objectForKey:categoryId]];
}
}
//添加商戶密鑰key字段 API 密鑰 這里的key需要換成自己公司商戶密鑰
[contentString appendFormat:@"key=%@", @"9db35c68b8de2d15d1d493d16fb67875"];
NSString *result = [self md5StringWithString:contentString];//md5加密
return result;
}
/**
* MD5 加密
*
* @return 加密后字符串
*/
- (NSString *)md5StringWithString:(NSString *)str
{
if(str == nil || [str length] == 0) return nil;
unsigned char digest[CC_MD5_DIGEST_LENGTH], i;
CC_MD5([str UTF8String], (int)[str lengthOfBytesUsingEncoding:NSUTF8StringEncoding], digest);
NSMutableString *ms = [NSMutableString string];
for(i=0;i<CC_MD5_DIGEST_LENGTH;i++)
{
[ms appendFormat: @"%02x", (int)(digest[i])];
}
[ms uppercaseString];
//轉為大寫
NSString *big = [ms uppercaseString];
NSLog(@"sign %@",big);
return [big copy];
}
這里NSLog后的值為
2016-05-30 17:41:01.166 FPHClient[15313:6309040] sign 322B952AC0678F21DD1F7C5B1F444886
和后端返回的一樣
4.partnerId
問題9:
拉起支付寶報錯:
交易訂單處理失敗,請稍后再試(ALI64)
解決辦法:
重新生成私鑰和公鑰,執(zhí)行步驟如下個問題
問題8:
支付寶要重新生成私鑰和公鑰,并上傳修改公鑰 -- 為你補充
解決辦法:
RSA密鑰生成命令步驟如下:
(1)先在終端鍵入 openssl
生成RSA私鑰
(2)openssl>genrsa -out rsa_private_key.pem 1024
生成RSA公鑰
(3)openssl>rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
將RSA私鑰轉換成PKCS8格式
(4)openssl>pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
注意:“>”符號后面的才是需要輸入的命令。
使用
WuTiandeiMac:FPHClientNew wutianshi$ openssl
OpenSSL>
OpenSSL>
OpenSSL>
OpenSSL>
OpenSSL> genrsa -out rsa_private_key.pem 1024
Generating RSA private key, 1024 bit long modulus
....................++++++
.........++++++
e is 65537 (0x10001)
OpenSSL> rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem
writing RSA key
OpenSSL>
OpenSSL>
OpenSSL> pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBANOjnFDIjeQjyah1
1smthHNsiHyXE8EOWMyMZkLrIlbu6TCDVHk/hhJTpbDxVOz6f4cFdynP/wD9Tbnf
ZfJCKFDFJ9jPz3Euyb5/jLFbyAVblyLLPiv5bxRLaA9/w4Jtt+G7E/ti8HN6224x
4TT3owFuKqZTcAXeqXp7QMzZyEkZAgMBAAECgYBWYKRf5DrlLiYT92Rek89HPLjI
APEzDiP3+CWUkltFl+Tcw/0qL18NA87QVO8QeXyrIvPrwNSXFssuXZtCMPY6oqgh
21ixQ+w4Kk4Z8nkEbFNRjryrpOeGMQmZlkSqRiehnYPY6UT8ovKXj0D1HBoscfA7
z1Ioxpo3QEN3jsxkcQJBAPbgYhJYS7+/HB92eXaHckTpU0/ycosSj6ha02xs5+Sv
xJbkkDfrt/LVVgApBYlgJQG0WRcD/8+4cIyyAxGFp7MCQQDbdduyrvUTffsXeuad
XcHIAmX928y19YGvCU3+TJtGIfUMPoRsnidMnZh2s29G6bGy0fkrmMadogEkKqQX
AmYDAkBEmbdGx7hM0Oscpww7bonHMlrPNVy03nSC4LItR9nsRxdGor6ce2jDFpru
MnfyY4AFCDtVVOwpqWPFBNYrcUtXAkEAltAme2OKHawMmnUl9+zPV1B2oH6k7kJZ
rVy6kVA5wHdje9eWj0IcBaWjeacTiGreZ+Gt1sz1aKxFFoKLIxjN2wJADlpg/9iN
Bf+JylK9QEgOTw6PngSOiXeaVXdErOPbu4WkzvxhB0bm8HPEPiJpLg/3sNaaX3ou
TIEHO8o1EcEnrw==
-----END PRIVATE KEY-----
OpenSSL>
生成的文件:
這里寫圖片描述

把公鑰上傳到支付寶,然后把pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt 這條命令產(chǎn)生的私鑰用在下面設置中就好
然后設置
/*
*商戶的唯一的parnter和seller。
*簽約后,支付寶會為每個商戶分配一個唯一的 parnter 和 seller。
*/
/*============================================================================*/
/*=======================需要填寫商戶app申請的===================================*/
/*============================================================================*/
NSString *partner = PartnerID;//合作伙伴身份(PID):
NSString *seller = SellerID;//商戶支付寶賬戶
//獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
NSString *privateKey = PartnerPrivKey;// 剛第三端命令生成的去頭去尾
如有問題,繼續(xù)分享咯,總結才能讓問題越來越少!
PS:來簡書混,關注是必須的,點贊?? 是要給的!