主要按照官方文檔設置便可:ios
1:關於openssl/asn.h file not found的問題express
可能會遇到這個問題:數組
#include <openssl/asn.h> 找不到 也就是路徑沒有引入xcode
解決方法以下:服務器
在xcode 的build setting --> header searchPaths裏 添加支付寶openssl/asn.h的文件路徑app
格式: $(PROJECT_DIR)/文件夾路徑(能夠直接選中openssl,show in finder),注意:路徑爲OpenSSL上層文件夾函數
支付寶配置文件:libcrypto.a libssl.a openssl util 四個文件,一個都不能少測試
第一步:須要服務器端配置,步驟以下:ui
/* 步驟: 1.設置商品信息 2.將商品信息按要求拼接成字符串 3.用私鑰將商品信息簽名 . 4.將加簽成功後的字符串格式化成訂單字符串,返回給客戶端 5.客戶端獲取後臺返回的訂單字符串,調用支付寶支付接口發起支付請求 6.處理支付寶返回的支付結果 前4步須要在服務端進行處理,客戶端只需獲取字符串調用支付接口發送支付請求
*/
//生成訂單信息及簽名 //將商品信息賦予AlixPayOrder的成員變量 Order* order = [Order new]; // NOTE: app_id設置 order.app_id = appID; // NOTE: 支付接口名稱 order.method = @"alipay.trade.app.pay"; // NOTE: 參數編碼格式 order.charset = @"utf-8"; // NOTE: 當前時間點 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設置 order.sign_type = @"RSA"; // NOTE: 商品數據 /*商品信息======================= total_amount:商品價格(支付金額) out_trade_no:訂單ID(商戶訂單號)--這個地方用了隨機的。正常狀況下,服務器端會給! seller_id:收款商戶號 timeout_express:超時時間設置 subject:主題(顯示的數據,本身寫,不影響支付) body:內容對一筆交易的具體描述信息(本身寫就能夠) ===================================*/ order.biz_content = [BizContent new]; order.biz_content.body = @"abc"; order.biz_content.subject = @"1"; order.biz_content.out_trade_no = [self generateTradeNO]; //訂單ID(由商家自行制定) order.biz_content.timeout_express = @"30m"; //超時時間設置 order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品價格 order.biz_content.seller_id =@"收款商戶號";// 收款商戶號 /*將訂單信息拼接成字符串========================================= 訂單信息串中的各個value是否encode 非encode訂單信息串,用於生成簽名 encode訂單信息串 + 簽名,用於最終的支付請求訂單信息串===================================*/ NSString *orderInfo = [order orderInfoEncoded:NO]; NSString *orderInfoEncoded = [order orderInfoEncoded:YES]; /*
使用類CreateRSADataSigner(獲取私鑰),
調用signString簽名函數作簽名(並將商戶信息簽名)須要遵循RSA簽名規範,
並將簽名字符串base64編碼和UrlEncode================================*/ id<DataSigner> signer = CreateRSADataSigner(privateKey); NSString *signedString = [signer signString:orderInfo]; // NOTE: 若是加簽成功,則繼續執行支付 if (signedString != nil) { NSString *appScheme = @"alisdkdemo";//url types設置 /*把簽名結果賦值給參數sign,並把sign加入以前的待簽名數組中,此時獲得的即是要請求給支付寶的所有數據(訂單字符串)。*/ NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderInfoEncoded, signedString]; NSLog(@"orderString%@",orderString);
注意點:須要對訂單字符串進行base64和urlEncode處理編碼
坑點:若是服務端沒有對訂單字符串進行處理,須要移動端進行處理,若是不處理,支付寶會報錯,系統繁忙
一、須要在URL Scheme進行設置:
TARGETS --> Info --> URL Types -->URL Schemes
二、須要設置頭文件路徑:點擊「Build Settings」選項卡,在搜索框中,以關鍵字「search」搜索,對「Header Search Paths」增長頭文件路徑:$(SRCROOT)/項目名稱。若是頭文件信息已增長,可沒必要再增長。
三、官方的demo中會報一個錯誤,私鑰爲空
檢查私鑰的正確性後,若是還不能解決,嘗試使用如下方法修改:
對私鑰樣式的拼接中進行修改
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----
修改爲
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----
四、支付寶打開失敗,ALI40247錯誤
這個錯誤的緣由通常是支付寶的應用配置有問題,解決方法:
4.一、檢查使用的APPID 私鑰是否正確
4.二、檢查支付寶中應用是否添加APP支付功能
4.三、檢查APP支付功能是否已經簽約
若是以上都沒問題,能夠在支付寶刪除應用,再從新建立一個新應用進行測試
客戶端調用支付寶支付
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { // 支付寶支付時會走appdelegate裏面的方法 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standByCallback:^(NSDictionary *resultDic){ NSLog(@"%@", resultDic); }] return YES; }
若是客戶端沒有安裝支付寶,那麼支付時會走調用支付方法的那個地方
- (void)payButtonClick:(UIButton *)button { NSString *appScheme = @"alipaydemo.com"; // orderString 就是訂單字符串,須要從後臺獲取,前提是後臺已經處理完成(base64和urlEncode) [[AlipaySDK defaultService] payOrder:OrderString fromeScheme:appScheme callback:^(NSDictionary *resultDic){ // 若是客戶端沒有安裝支付寶,支付時會用網頁端的支付寶進行支付,完成後會調用這裏的callback NSLog(@"%@", resultDic); } }
其他的問題都尚未遇到