IOS開發(fā)支付寶集成

開發(fā)準(zhǔn)備


1.首先新建項(xiàng)目,然后去官網(wǎng)下載最新的開發(fā)包:
http://doc.open.alipay.com/doc2/detail?treeId=59&articleId=103563&docType=1,
當(dāng)然也可以用CocoaPods來(lái)下載不過(guò)用這個(gè)下載的話只會(huì)下載到單純的客戶端與網(wǎng)絡(luò)服務(wù)請(qǐng)求的SDK不包含加密的那些代碼,而有些公司是要把加密做到本地的所以選擇哪種方式看開發(fā)者的習(xí)慣于公司需求.
2.下載后打開點(diǎn)擊開發(fā)包可以打開更新日志來(lái)比對(duì)當(dāng)前版本不要去一些非官網(wǎng)的地方下載SDK有可能不是最新版本會(huì)出現(xiàn)BUG
3.打開客戶端開發(fā)包找到IOS對(duì)應(yīng)的包文件解壓得到開發(fā)包,包含1個(gè)framework文件一個(gè)bundle文件一個(gè)Demo文件夾

一般情況下支付功能的交互流程


比如我們?nèi)ツ硞€(gè)APP去支付一個(gè)產(chǎn)品,流程為:
1.用戶點(diǎn)擊支付->
2.客戶端請(qǐng)求服務(wù)器用戶支付->
3.服務(wù)器接收請(qǐng)求生成金額訂單等要給第三方支付的一切信息,并生成回調(diào)參數(shù)傳給客戶端->
4.客戶端接收信息(一般會(huì)再讓用戶確認(rèn)支付或者干脆購(gòu)買后是生成訂單,然后才是付款)并將服務(wù)器給的信息分別傳入SDK需要的參數(shù)中,調(diào)用SDK的支付方法->
5.由SDK向SDK自己的服務(wù)器發(fā)出支付請(qǐng)求,SDK自己的服務(wù)器接收支付請(qǐng)求處理成功后,給客戶端本身與公司的后臺(tái)都發(fā)送一條支付成功的消息,客戶端與后臺(tái)根據(jù)這條消息再做處理.

針對(duì)開發(fā)環(huán)境的一些設(shè)置


支付又分為2種情況本地簽名,和服務(wù)器簽名,我用到正好都是公司要求本地簽,服務(wù)器的我就稍微說(shuō)1點(diǎn).

服務(wù)器簽名:
/**
 *  支付接口
 *
 *  @param orderStr       訂單信息
 *  @param schemeStr      調(diào)用支付的app注冊(cè)在info.plist中的scheme
 *  @param compltionBlock 支付結(jié)果回調(diào)Block
 */
- (void)payOrder:(NSString *)orderStr
      fromScheme:(NSString *)schemeStr
        callback:(CompletionBlock)completionBlock;

服務(wù)器簽名注意的是在callback:回調(diào)中要進(jìn)行驗(yàn)簽,就是把服務(wù)器給的訂單簽名信息在用公鑰解密,比對(duì)訂單細(xì)節(jié),檢查是否被他人篡改,并且如果是wap支付,不會(huì)反回在appDelegateapplication:openURL方法.

本地簽名:

先拖入實(shí)現(xiàn)加密的文件與模型:

加密的文件.png

這時(shí)候會(huì)報(bào)錯(cuò)(補(bǔ)充一點(diǎn): 有些朋友找不到NSString或者一些數(shù)據(jù)類型報(bào)錯(cuò)都是因?yàn)槿鄙貴oundation頭文件,可能我寫的不太明白,有些朋友還是不太懂)大部分錯(cuò)誤都是因?yàn)橐恍┪募性谥Ц秾毜腄emo的Pch文件中統(tǒng)一添加的#import <Foundation/Foundation.h>,如果我們的項(xiàng)目中沒有這一步,那么要么也建立pch要么單獨(dú)添加上.

這時(shí)還會(huì)有一個(gè)錯(cuò)誤:

路徑找不到.png

注意這里的Header Search Paths 路徑為空:

路徑為空.png

打開電腦這個(gè)文件的所在地 雙擊Header Search Paths將電腦的文件拖入Header Search Paths會(huì)生成一個(gè)路徑:

生成的路徑.png

導(dǎo)入一來(lái)框架: 這個(gè)最好跟著Demo一個(gè)一個(gè)往里添加,也不要光看網(wǎng)上資料主要還是看Demo:

導(dǎo)入框架.png

添加SDK和靜態(tài)庫(kù):


SDK靜態(tài)庫(kù).png

報(bào)錯(cuò):這個(gè)錯(cuò)誤與另外一種說(shuō)SDK不支持64位比較常見,都是把靜態(tài)庫(kù)或者SDK都刪了重新導(dǎo)入就行了


錯(cuò)誤信息.png
到這里應(yīng)該已經(jīng)可以運(yùn)行程序了.
如果還是出現(xiàn)了編譯錯(cuò)誤等問題,導(dǎo)入框架不全與SDK靜態(tài)庫(kù)的路徑錯(cuò)誤比例比較大.
建議等能夠運(yùn)行程序后在進(jìn)行開發(fā).

正式開發(fā)

首先我們介紹一段代碼:

  NSString *orderSpec = [order description];

將商品的信息添加為字符串order是一個(gè)對(duì)象,而description]是將這個(gè)對(duì)象的屬性進(jìn)行拼接返回一個(gè)字符串.

在介紹3個(gè)屬性:

//合作商戶ID惭笑。用簽約支付寶賬號(hào)登錄ms.alipay.com后,在賬戶信息頁(yè)面獲取生真。
NSString *partner = @"";
//賬戶ID沉噩。用簽約支付寶賬號(hào)登錄ms.alipay.com后,在賬戶信息頁(yè)面獲取汇歹。
NSString *seller = @"";
//商戶私鑰屁擅,自助生成
NSString *privateKey = @"";

這3個(gè)屬性必須是個(gè)人或公司申請(qǐng)后才能得到的..我用的公司的就不寫上了請(qǐng)自行填寫.

//將商品信息賦予AlixPayOrder的成員變量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = @"G111111111111"; //訂單ID(由商家自行制定)
    order.productName = @"我的測(cè)試"; //商品標(biāo)題
    order.productDescription = @"我的商品描述"; //商品描述
    order.amount = @"0.01"; //商品價(jià)格
    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)用注冊(cè)scheme,在AlixPayDemo-Info.plist定義URL types
    NSString *appScheme = @"alisdkdemo";
    
    //將商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //獲取私鑰并將商戶信息簽名,外部商戶可以根據(jù)情況存放私鑰和簽名,只需要遵循RSA簽名規(guī)范,并將簽名字符串base64編碼和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    
    NSString *orderString = nil;

生成加密后的字符串 注意的是NSString *appScheme = @"alisdkdemo";這個(gè)值是從支付寶的商戶地址中填寫的,請(qǐng)保持一致.

最后處理結(jié)果:

if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            
            //結(jié)果處理,其實(shí)就是取字典里面的內(nèi)容,這個(gè)取字符串然后變個(gè)模型就好了 或者直接取不便模型,方法很多.
            NSLog(@"開始確認(rèn)支付狀態(tài) %@",resultDic[@"resultStatus"]);
            AlixPayResult* resultModel = [AlixPayResult itemWithDictory:resultDic];
            if (resultModel)
            {
                //狀態(tài)返回9000為成功
                if (resultModel.statusCode == 9000)
                {
                    /*
                     *用公鑰驗(yàn)證簽名 嚴(yán)格驗(yàn)證請(qǐng)使用result.resultString與result.signString驗(yàn)簽
                     */
                    NSLog(@"支付寶交易成功");
                    
                    /*
                     *用公鑰驗(yàn)證簽名 嚴(yán)格驗(yàn)證請(qǐng)使用result.resultString與result.signString驗(yàn)簽
                     */
                    
                    //交易成功
                    NSString* key = AlipayPubKey;//簽約帳戶后獲取到的支付寶公鑰
                    id<DataVerifier> verifier;
                    verifier = CreateRSADataVerifier(key);
                    
                    // 驗(yàn)證簽名
                    if ([verifier verifyString:resultModel.resultString withSign:resultModel.signString])
                    {
                        //驗(yàn)證簽名成功,交易結(jié)果無(wú)篡改
                        NSLog(@"驗(yàn)證成功");
                    }
                }
            }
            else if([resultDic[@"resultStatus"]isEqualToString:@"6001"])
            {
                               //用戶取消
                NSLog(@"用戶主動(dòng)取消支付");
            }else
            {
               
            }
        }];
}

這里注意:if([resultDic[@"resultStatus"]isEqualToString:@"6001"])支付寶有BUG 這個(gè)6001 不要信,可以和公司商量下,是加個(gè)確認(rèn)接口還是一定時(shí)間內(nèi)檢查后臺(tái),總之很有可能用戶付錢成功,SDK通知你用戶手動(dòng)取消,這個(gè)BUG是在弱網(wǎng)狀態(tài)下比較多.

然后記得在 AppDelegate里面加上如下代碼:

//只要是調(diào)用手機(jī)上的支付寶客戶端产弹,在支付寶客戶端操作完成返回自己的app時(shí)派歌,都會(huì)調(diào)用這個(gè)方法,
- (BOOL)application:(UIApplication *)application
            openURL:(NSURL *)url
  sourceApplication:(NSString *)sourceApplication
         annotation:(id)annotation {
    //跳轉(zhuǎn)支付寶錢包進(jìn)行支付,需要將支付寶錢包的支付結(jié)果回傳給SDK(這個(gè)是將支付寶客戶端的支付結(jié)果傳回給SDK)
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService]
         processOrderWithPaymentResult:url
         standbyCallback:^(NSDictionary *resultDic)
         {
             NSLog(@" ------result = %@",resultDic);//返回的支付結(jié)果
         }];
    }
    return YES;
}

最后記得把這里寫了:

URL.Types.png

NSString *appScheme = @"alisdkdemo"代碼 網(wǎng)頁(yè)上申請(qǐng)的 圖片上那里填寫的保持一致.


補(bǔ)充: 如果要用swift來(lái)調(diào)用支付寶SDK 最好把支付的與回調(diào)的邏輯單獨(dú)建立工具類傳遞數(shù)據(jù)便好,從流程上本身無(wú)太大區(qū)別稍微注意的是在swiftAlipaySDK.h有可能因?yàn)檎Z(yǔ)言環(huán)境問題出現(xiàn)缺少引入類的情況,少什么補(bǔ)什么就好,其他也一樣.

如有問題歡迎留言...

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末痰哨,一起剝皮案震驚了整個(gè)濱河市胶果,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斤斧,老刑警劉巖早抠,帶你破解...
    沈念sama閱讀 211,290評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異撬讽,居然都是意外死亡蕊连,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,107評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門游昼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)甘苍,“玉大人,你說(shuō)我怎么就攤上這事烘豌≡赝ィ” “怎么了?”我有些...
    開封第一講書人閱讀 156,872評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵廊佩,是天一觀的道長(zhǎng)囚聚。 經(jīng)常有香客問我,道長(zhǎng)标锄,這世上最難降的妖魔是什么顽铸? 我笑而不...
    開封第一講書人閱讀 56,415評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮料皇,結(jié)果婚禮上跋破,老公的妹妹穿的比我還像新娘簸淀。我一直安慰自己,他們只是感情好毒返,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,453評(píng)論 6 385
  • 文/花漫 我一把揭開白布租幕。 她就那樣靜靜地躺著,像睡著了一般拧簸。 火紅的嫁衣襯著肌膚如雪劲绪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,784評(píng)論 1 290
  • 那天盆赤,我揣著相機(jī)與錄音贾富,去河邊找鬼。 笑死牺六,一個(gè)胖子當(dāng)著我的面吹牛颤枪,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播淑际,決...
    沈念sama閱讀 38,927評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼畏纲,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了春缕?” 一聲冷哼從身側(cè)響起盗胀,我...
    開封第一講書人閱讀 37,691評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锄贼,沒想到半個(gè)月后票灰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,137評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡宅荤,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,472評(píng)論 2 326
  • 正文 我和宋清朗相戀三年屑迂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片冯键。...
    茶點(diǎn)故事閱讀 38,622評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡惹盼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出琼了,到底是詐尸還是另有隱情,我是刑警寧澤夫晌,帶...
    沈念sama閱讀 34,289評(píng)論 4 329
  • 正文 年R本政府宣布雕薪,位于F島的核電站,受9級(jí)特大地震影響晓淀,放射性物質(zhì)發(fā)生泄漏所袁。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,887評(píng)論 3 312
  • 文/蒙蒙 一凶掰、第九天 我趴在偏房一處隱蔽的房頂上張望燥爷。 院中可真熱鬧蜈亩,春花似錦、人聲如沸前翎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)港华。三九已至道川,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間立宜,已是汗流浹背冒萄。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留橙数,地道東北人尊流。 一個(gè)月前我還...
    沈念sama閱讀 46,316評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像灯帮,于是被迫代替她去往敵國(guó)和親崖技。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,490評(píng)論 2 348

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