实战--接入最坑的支付宝

Paste_Image.png

因为项目中需要用到支付,所以这一周就开始集成支付,因为微信支付貌似需要缴纳200元才能使用微信第三方登陆,支付等功能,所以公司先要求集成支付宝,百度了一下,集成支付宝的过程,很多人都说集成支付宝太坑了,但我觉的前端还好,坑的是后台,后台天天吆喝着支付宝官方的文档和demo太坑了,如果是后台的话,不要太相信支付宝官方文档和demo,话不多说,集成开始!!!!!

<br />

支付大概流程图


(下面的话是引用 )
(文/WK_IOSDevelpoer(简书作者)
原文链接:http://www.jianshu.com/p/b88f87a552a1
<br />1.用户选好了商品后,点击提交订单(一般是这样),选择使用支付宝付款。
2.手机客户端(你做的APP)把用户选择的商品的信息传给你们后台服务器。
3.后台的服务器将各种数据拼接签名后生成一个签名后的字符串,回传到客户端APP上。
4.用户点击确认支付按钮,调用手机支付宝客户端(在你手机上装的那个),利用后台传过来的那个参数调起支付宝,让支付宝客户端传给他们服务器交互,进行付款。(这一步是支付宝自己完成的,安全性高)
5.支付宝的服务器将支付的结果(可能成功也可能不成功)返回给手机支付宝客户端和你们公司的后台服务器。
6.你们公司后台服务器收到后一般是更新下数据信息(这个咱们不用管),手机支付宝客户端会显示一下支付成功,咱们的客户端也可以显示一个订单支付成功之类的东西(就像在手机12306订票,用支付宝支付后支付宝客户端会说一次支付成功,12306也会说一次支付成功,咱们就像12306客户端一样,需要再说一次订单支付成功)。

1.下载官方demo和sdk

https://github.com/chenyang-ios/alipay.git
里面有官方demo和sdk,下这个就行,在一起呢!!!
<br />

2、配置支付宝sdk

01配置支付宝的SDK.png

<br />

3、导入依赖库

Paste_Image.png

<br />

4、添加 URL schme

05URL schme配置.png

<br />

5、添加白名单

在info.plist里面添加


Paste_Image.png

<br />

6、在pch文件里面导入

增加一个预编译头文件,导入
import <Foundation/Foundation.h>
import <UIKit/UIKit.h>

<br />

7、编译,会报错

Paste_Image.png

解决办法:Targets->Build Settings->Header Search Path中添加AliPaySDK文件夹的路径

!!!!!添加路径的时候直接将路径拖进去就行了,不要看到里面有个加号,先点击加号,再拖进去,那是没用的~这个我弄了半天,烦人!!!!

Paste_Image.png

<br />

8.如果编译没问题就成功一大半了,我们开始集成代码,直接上代码,用的话直接粘贴复制!!!在点击支付的按钮的触发事件里面写

"

  //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; //商品标题
            order.body = _cont; //商品描述
            order.totalFee = [NSString stringWithFormat:@"%@",jiage]; //商品价格
            order.notifyURL = huiURL; //回调URL
            
            order.service = @"mobile.securitypay.pay";
            order.paymentType = @"1";
            order.inputCharset = @"utf-8";
            order.itBPay = min;
            order.showURL = @"m.alipay.com";
            
            //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
            NSString *appScheme = @"alisdkdemo";
       
            //将商品信息拼接成字符串
            NSString *orderSpec = [order description];
            NSLog(@"orderSpec = %@",orderSpec);
          
//            //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
//            id<DataSigner> signer = CreateRSADataSigner(privatekey);
//            
//            NSString *signedString = [signer signString:orderSpec];
            
            //将签名成功字符串格式化为订单字符串,请严格按照该格式
            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把订单号和签名都放在前端了,但是实际开发是签名订单号都是后台做的,让后台给你就行,到时候这两句话屏蔽,将


![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之前的,为了安全我都写了

导入头文件  
import <AlipaySDK/AlipaySDK.h>

<br />

//9.0之后的

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

    //如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包
    if ([url.host isEqualToString:@"alisdkdemo"]) {
    [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
    //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟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=@"网络连接出错";
                      break;
                      
                  default:
                      break;
              }
              
          }
          
      
          
         
                    
      }];
    

    }
    if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode

      [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
          //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟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=@"网络连接出错";
                break;
                
            default:
                break;
        }
       
    }
    
}];

return YES;

} ```

appdelegate里面的方法block是走app客户端的时候才会调用,如果手机没有客户端,就回自动跳到网页端,没事,支付宝直接写好了,我们不用管,网页端支付成功会走这个block

Paste_Image.png

客户端的话会走这个block

Paste_Image.png

支付成功的页面跳转问题,我用的是通知,不能直接跳的!!!这个要注意,比如用客户端

在appdelegate里面

Paste_Image.png

在点击支付的里面

Paste_Image.png

注意如果遇到这个问题,一般是签名错了,问后台,让他改!!!

Paste_Image.png

支付成功以后支付宝给你返回的9000(代表支付成功),或者其他的,这个只是支付宝通知的,直返完成支付宝还会给后台异步通知,后台要判断签名被人篡改没有,最终的支付状态还是要听后台的,在那两个block里面在进行一次网络请求,让后台给你支付状态,成不成功听后台的!!!!!!我感觉我想到的我都写了,还有什么问题可以给我留言~~~

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容