實(shí)戰(zhàn)--接入最坑的支付寶

Paste_Image.png

因?yàn)轫?xiàng)目中需要用到支付,所以這一周就開始集成支付寂汇,因?yàn)槲⑿胖Ц睹菜菩枰U納200元才能使用微信第三方登陸,支付等功能捣染,所以公司先要求集成支付寶健无,百度了一下,集成支付寶的過程液斜,很多人都說集成支付寶太坑了累贤,但我覺的前端還好,坑的是后臺少漆,后臺天天吆喝著支付寶官方的文檔和demo太坑了臼膏,如果是后臺的話,不要太相信支付寶官方文檔和demo示损,話不多說渗磅,集成開始!<旆谩J加恪!脆贵!

<br />

支付大概流程圖


(下面的話是引用 )
(文/WK_IOSDevelpoer(簡書作者)
原文鏈接:http://www.reibang.com/p/b88f87a552a1
<br />1.用戶選好了商品后医清,點(diǎn)擊提交訂單(一般是這樣),選擇使用支付寶付款卖氨。
2.手機(jī)客戶端(你做的APP)把用戶選擇的商品的信息傳給你們后臺服務(wù)器会烙。
3.后臺的服務(wù)器將各種數(shù)據(jù)拼接簽名后生成一個簽名后的字符串,回傳到客戶端APP上筒捺。
4.用戶點(diǎn)擊確認(rèn)支付按鈕柏腻,調(diào)用手機(jī)支付寶客戶端(在你手機(jī)上裝的那個),利用后臺傳過來的那個參數(shù)調(diào)起支付寶系吭,讓支付寶客戶端傳給他們服務(wù)器交互五嫂,進(jìn)行付款。(這一步是支付寶自己完成的肯尺,安全性高)
5.支付寶的服務(wù)器將支付的結(jié)果(可能成功也可能不成功)返回給手機(jī)支付寶客戶端和你們公司的后臺服務(wù)器沃缘。
6.你們公司后臺服務(wù)器收到后一般是更新下數(shù)據(jù)信息(這個咱們不用管),手機(jī)支付寶客戶端會顯示一下支付成功蟆盹,咱們的客戶端也可以顯示一個訂單支付成功之類的東西(就像在手機(jī)12306訂票孩灯,用支付寶支付后支付寶客戶端會說一次支付成功闺金,12306也會說一次支付成功逾滥,咱們就像12306客戶端一樣,需要再說一次訂單支付成功)。

1.下載官方demo和sdk

https://github.com/chenyang-ios/alipay.git
里面有官方demo和sdk寨昙,下這個就行讥巡,在一起呢!L蚰摹欢顷!
<br />

2、配置支付寶sdk

01配置支付寶的SDK.png

<br />

3捉蚤、導(dǎo)入依賴庫

Paste_Image.png

<br />

4抬驴、添加 URL schme

05URL schme配置.png

<br />

5、添加白名單

在info.plist里面添加


Paste_Image.png

<br />

6缆巧、在pch文件里面導(dǎo)入

增加一個預(yù)編譯頭文件布持,導(dǎo)入
import <Foundation/Foundation.h>
import <UIKit/UIKit.h>

<br />

7、編譯陕悬,會報錯

Paste_Image.png

解決辦法:Targets->Build Settings->Header Search Path中添加AliPaySDK文件夾的路徑

L馀!W匠k事薄!添加路徑的時候直接將路徑拖進(jìn)去就行了拼岳,不要看到里面有個加號枝誊,先點(diǎn)擊加號,再拖進(jìn)去惜纸,那是沒用的~這個我弄了半天侧啼,煩人!?安尽H!

Paste_Image.png

<br />

8.如果編譯沒問題就成功一大半了椭更,我們開始集成代碼哪审,直接上代碼,用的話直接粘貼復(fù)制B瞧佟J摇!在點(diǎn)擊支付的按鈕的觸發(fā)事件里面寫

"

  //1. partnerID
            NSString *partnerID = @"2088421512225446";
            
            //2. sellerID
            
            NSString *sellerId = @"miracle@mcqiji.com";
            
            //3. 私鑰
            
            NSString *privatekey = @"MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALvqLWelnudXoSuEWXS+8RUMiTg0qrFWP2PrDFg9Keb9DyiCJbabZp7eoX1EJxETWuoXsNpmTS0IkYG5GSMdEcf1kFYR8XRr4dkFsXv+cOd0i+uXm26/IlYm48jX6VANtQBqESbv+7vYQoPeCD6fPh2bqD9BLaRtyGs10bGBm0GFAgMBAAECgYBT6K19qqbaBnchR2fqiZh9HavoPRw7M5f6teo9PJKJYlZycCsG7z1Tk3XoyZXoOgxOm2WNIEE16q2Oj2h6FXDqY7n17bw64lxERpFIMzuKEqVSGeDqHaVEFtN1EE1XRH04DY00UQEaIEpdX0FeRkxzpHWeRVQUpPreX0wT3ENBwQJBAPZSRBjrhPlO8xRhq4uGBp4bejNbYilgIhkkCC5/qYIBUxwoW4kSYvsJ/8tywYQ5I8I6Py1bRBBocyUFNe2yhvMCQQDDTGcBZv9Gs5etGWC3MFNYwQXDip3iL6R7Rv8xuD70N9YUneVPxP+Nikb2dihbuvyAMIfjyt70rwVp3c+gBiOnAkAHl5mJuxiqJojPhAMplcP2c5pcouBvrgrfA4FNDZpH64qIP6Yyn2J1omVD/BGC5c/4WJtB5qI+bzm9Vl/HJ82JAkEAgLzfdbQweKmwRUHiWD954ZqzsvewJcakFUNyu5KppREdhM+ktpW0o9fP+W1gIz+6bMIRAd7cY8zvs56s297QJwJAFSROxXaKUTQJ2DPrDL6YPE+7QjuS31KJMhJXWs7XPWWELigdHYrhCDPO5BQb7Vkz9p5prZRUDIINZbqJA7qSHQ==";
                /*
             *生成訂單信息及簽名
             */
            //將商品信息賦予AlixPayOrder的成員變量
            Order *order = [[Order alloc] init];
            order.partner = partnerID;
            order.sellerID = sellerId;
            order.outTradeNO = _num; //訂單ID(由商家自行制定)
            order.subject = _titl; //商品標(biāo)題
            order.body = _cont; //商品描述
            order.totalFee = [NSString stringWithFormat:@"%@",jiage]; //商品價格
            order.notifyURL = huiURL; //回調(diào)URL
            
            order.service = @"mobile.securitypay.pay";
            order.paymentType = @"1";
            order.inputCharset = @"utf-8";
            order.itBPay = min;
            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<DataSigner> signer = CreateRSADataSigner(privatekey);
//            
//            NSString *signedString = [signer signString:orderSpec];
            
            //將簽名成功字符串格式化為訂單字符串,請嚴(yán)格按照該格式
            NSString *orderString = nil;
            if (qianming != nil) {
                orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                               orderSpec,qianming, @"RSA"];
                
                NSLog(@"%@",orderString);
                
                [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
                    NSLog(@"reslut = %@",resultDic);
                    
     
                }];
            } ```

####為了安全訂單信息都是后臺給你的


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1399153-bb304c5de37d7b35.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####這個官方簽名訂單信息舌狗,官方demo把訂單號和簽名都放在前端了叽奥,但是實(shí)際開發(fā)是簽名訂單號都是后臺做的,讓后臺給你就行痛侍,到時候這兩句話屏蔽朝氓,將


![Paste_Image.png](http://upload-images.jianshu.io/upload_images/1399153-9deeefad441e13f0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

####將官方的畫框的直接替換成從后臺獲取的的簽名就行

<br />
####在appdelegate.m文件的代碼,有兩個方法,一個是9.0之后的赵哲,一個是9.0之前的待德,為了安全我都寫了

導(dǎo)入頭文件  
import <AlipaySDK/AlipaySDK.h>

<br />

//9.0之后的

  • (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
    {

    //如果極簡開發(fā)包不可用,會跳轉(zhuǎn)支付寶錢包進(jìn)行支付枫夺,需要將支付寶錢包的支付結(jié)果回傳給開發(fā)包
    if ([url.host isEqualToString:@"alisdkdemo"]) {
    [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    //【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中将宪,商戶app在后臺很可能被系統(tǒng)kill了,所以pay接口的callback就會失效橡庞,請商戶對standbyCallback返回的回調(diào)結(jié)果進(jìn)行處理,就是在這個方法里面處理跟callback一樣的邏輯】
    NSLog(@"result = %@",resultDic);

          NSInteger orderState=[resultDic[@"resultStatus"] integerValue];
          
          if (orderState==9000) {
              NSString *allString=resultDic[@"result"];
              NSString * FirstSeparateString=@"\"&";
              NSString *  SecondSeparateString=@"=\"";
              NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithDictionary:[UserInfo VEComponentsStringToDic:allString withSeparateString:FirstSeparateString AndSeparateString:SecondSeparateString]] ;
              
              NSLog(@"ali=%@",dic);
              
              if ([dic[@"success"]isEqualToString:@"true"]) {
                  [[NSNotificationCenter defaultCenter] postNotificationName:@"AliPaySucceed" object:nil userInfo:dic];
                  
                  NSLog(@"支付成功");
                  
                  [[NSNotificationCenter  defaultCenter] postNotificationName:@"result" object:nil userInfo:resultDic];
                  
                  
                  
              }
              
          }else{
              NSString *returnStr;
              switch (orderState) {
                  case 8000:
                      returnStr=@"訂單正在處理中";
                      break;
                  case 4000:
                      returnStr=@"訂單支付失敗";
                      break;
                  case 6001:
                      returnStr=@"訂單取消";
                      break;
                  case 6002:
                      returnStr=@"網(wǎng)絡(luò)連接出錯";
                      break;
                      
                  default:
                      break;
              }
              
          }
          
      
          
         
                    
      }];
    

    }
    if ([url.host isEqualToString:@"platformapi"]){//支付寶錢包快登授權(quán)返回authCode

      [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
          //【由于在跳轉(zhuǎn)支付寶客戶端支付的過程中较坛,商戶app在后臺很可能被系統(tǒng)kill了,所以pay接口的callback就會失效扒最,請商戶對standbyCallback返回的回調(diào)結(jié)果進(jìn)行處理,就是在這個方法里面處理跟callback一樣的邏輯】
          NSLog(@"result = %@",resultDic);
          
          
      }];
    

    }
    return YES;
    }
    //9.0之前的方法
    -(BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options{

[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    
    
    NSLog(@"result = %@",resultDic);
    
    NSInteger orderState=[resultDic[@"resultStatus"] integerValue];
    
    if (orderState==9000) {
        NSString *allString=resultDic[@"result"];
        NSString * FirstSeparateString=@"\"&";
        NSString *  SecondSeparateString=@"=\"";
        NSMutableDictionary *dic=[NSMutableDictionary dictionaryWithDictionary:[UserInfo VEComponentsStringToDic:allString withSeparateString:FirstSeparateString AndSeparateString:SecondSeparateString]] ;
        
        NSLog(@"ali=%@",dic);
        
        if ([dic[@"success"]isEqualToString:@"true"]) {
            [[NSNotificationCenter defaultCenter] postNotificationName:@"AliPaySucceed" object:nil userInfo:dic];
            
            NSLog(@"支付成功");
            
            [[NSNotificationCenter  defaultCenter] postNotificationName:@"result" object:nil userInfo:resultDic];
           
            
            
        }
        
    }else{
        NSString *returnStr;
        switch (orderState) {
            case 8000:
                returnStr=@"訂單正在處理中";
                break;
            case 4000:
                returnStr=@"訂單支付失敗";
                break;
            case 6001:
                returnStr=@"訂單取消";
                break;
            case 6002:
                returnStr=@"網(wǎng)絡(luò)連接出錯";
                break;
                
            default:
                break;
        }
       
    }
    
}];

return YES;

} ```

appdelegate里面的方法block是走app客戶端的時候才會調(diào)用燎潮,如果手機(jī)沒有客戶端,就回自動跳到網(wǎng)頁端扼倘,沒事确封,支付寶直接寫好了,我們不用管再菊,網(wǎng)頁端支付成功會走這個block

Paste_Image.png

客戶端的話會走這個block

Paste_Image.png

支付成功的頁面跳轉(zhuǎn)問題爪喘,我用的是通知,不能直接跳的>腊巍1!!這個要注意稠诲,比如用客戶端

在appdelegate里面

Paste_Image.png

在點(diǎn)擊支付的里面

Paste_Image.png

注意如果遇到這個問題侦鹏,一般是簽名錯了,問后臺臀叙,讓他改B运!劝萤!

Paste_Image.png

支付成功以后支付寶給你返回的9000(代表支付成功)渊涝,或者其他的,這個只是支付寶通知的床嫌,直返完成支付寶還會給后臺異步通知跨释,后臺要判斷簽名被人篡改沒有眨业,最終的支付狀態(tài)還是要聽后臺的絮姆,在那兩個block里面在進(jìn)行一次網(wǎng)絡(luò)請求炼邀,讓后臺給你支付狀態(tài)您单,成不成功聽后臺的!B任觥F瘛5芏稀!龄恋!我感覺我想到的我都寫了疙驾,還有什么問題可以給我留言~~~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凶伙,一起剝皮案震驚了整個濱河市郭毕,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌函荣,老刑警劉巖显押,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異傻挂,居然都是意外死亡乘碑,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進(jìn)店門金拒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來兽肤,“玉大人,你說我怎么就攤上這事绪抛∽收。” “怎么了?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵幢码,是天一觀的道長笤休。 經(jīng)常有香客問我,道長症副,這世上最難降的妖魔是什么店雅? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮贞铣,結(jié)果婚禮上闹啦,老公的妹妹穿的比我還像新娘。我一直安慰自己辕坝,他們只是感情好亥揖,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著圣勒,像睡著了一般费变。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上圣贸,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天挚歧,我揣著相機(jī)與錄音,去河邊找鬼吁峻。 笑死滑负,一個胖子當(dāng)著我的面吹牛在张,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播矮慕,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼帮匾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了痴鳄?” 一聲冷哼從身側(cè)響起瘟斜,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎痪寻,沒想到半個月后螺句,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡橡类,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年蛇尚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片顾画。...
    茶點(diǎn)故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡取劫,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出研侣,到底是詐尸還是另有隱情谱邪,我是刑警寧澤,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布义辕,位于F島的核電站虾标,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏灌砖。R本人自食惡果不足惜璧函,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望基显。 院中可真熱鬧蘸吓,春花似錦、人聲如沸撩幽。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窜醉。三九已至宪萄,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間榨惰,已是汗流浹背拜英。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留琅催,地道東北人居凶。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓虫给,卻偏偏與公主長得像,于是被迫代替她去往敵國和親侠碧。 傳聞我的和親對象是個殘疾皇子抹估,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,781評論 2 361

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