iOS - 支付宝接入记录 (待更新)

对于最新版的支付宝SDK和官方API,有一句MMP不知当讲不当讲!

前段时间有同城的几个小伙伴问到支付宝接入这块,当时凭着14年那会的模糊的印象说了下,最近闲着没事又重新集成了下新版的支付,MMP,涵盖官方API、百度谷歌各种文档,各种资料五花八门,前后不一!时间长了什么东西都记忆模糊了,还是文笔比较久!

**零、登录蚂蚁金服开放平台,登录支付宝账号,创建应用 **

    1. 概览 -- 功能选项 ,根据公司需求选择功能名称,常用功能名称:手机网站支付、APP支付、当面付;

    2.应用信息 - 基础环境、接口加签方式、内容填写 ,推荐使用 RSA2 方式!(注:自己准备相关材料!)

    3.APPID 在应用后面,RSA2密钥(应用私钥)、公钥(应用公钥)和支付公钥在应用信息 -- 接口加签方式里获取!或者是点击右上角 账户管理 -- PID和公约管理 ,查看 开放平台密钥、mapi网关产品密钥 里查看!

一、登录蚂蚁金服开放平台,下载SDK (估计就这个就能绕晕人,不知道在哪儿的话就一言不合点左上角的图标)

    首页 -- 文档中心 -- 开发者文档 -- APP支付(根据情况选择,此处为移动端)-- SDK及DEMO下载

二、新建文件夹,将解压的 iOSDemo 相关文件放入其中,拖入工程 (如图)

图片.png

三、点击工程 -- TARGETS -- Build Phases -- Link BInary With Libraries 拖入相关框架和依赖库 (如图)

图片.png

四、点击工程 -- TARGETS -- Info -- URL Types 创建 URL Type (注:URL Schemes 自定义,但注意与 订单中填写的 appScheme 保持同步)

图片.png

五、导入代码 (记得以前是需要PID(partner)、支付宝账户(seller)、私钥(privateKey)三个才行,但现在只需要 APPID、应用私钥就行)

    #pragma mark   ==============点击订单模拟支付行为==============
        - (void)doAlipayPay
        {
            NSString *appID = @""; (此处为APPID)
            NSString *rsa2PrivateKey = @"";(此处为应用私钥 RSA2)
            NSString *rsaPrivateKey = @""; (此处为应用私钥 RSA 可不填)
            /*============================================================================*/
            
            //partner和seller获取失败,提示
            if ([appID length] == 0 ||
                ([rsa2PrivateKey length] == 0 && [rsaPrivateKey length] == 0))
            {
                UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                                message:@"缺少appId或者私钥。"
                                                               delegate:self
                                                      cancelButtonTitle:@"确定"
                                                      otherButtonTitles:nil];
                [alert show];
                return;
            }
            
            /*
             *生成订单信息及签名
             */
            //将商品信息赋予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 = (rsa2PrivateKey.length > 1)?@"RSA2":@"RSA";
            
            // NOTE: 商品数据
            order.biz_content = [BizContent new];
            order.biz_content.body = @"我是测试数据";
            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]; //商品价格
            
            //将商品信息拼接成字符串
            NSString *orderInfo = [order orderInfoEncoded:NO];
            NSString *orderInfoEncoded = [order orderInfoEncoded:YES];
            NSLog(@"orderSpec = %@",orderInfo);
            
            // NOTE: 获取私钥并将商户信息签名,外部商户的加签过程请务必放在服务端,防止公私钥数据泄露;
            //       需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
            NSString *signedString = nil;
            RSADataSigner* signer = [[RSADataSigner alloc] initWithPrivateKey:((rsa2PrivateKey.length > 1)?rsa2PrivateKey:rsaPrivateKey)];
            if ((rsa2PrivateKey.length > 1)) {
                signedString = [signer signString:orderInfo withRSA2:YES];
            } else {
                signedString = [signer signString:orderInfo withRSA2:NO];
            }
            
            // NOTE: 如果加签成功,则继续执行支付
            if (signedString != nil) {
                //应用注册scheme,在AliSDKDemo-Info.plist定义URL types
                NSString *appScheme = @"scheme"; (此处需要与 URL Types中的 URL Schemes 保持一致)
                
                // NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式
                NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@",
                                         orderInfoEncoded, signedString];
                
                // NOTE: 调用支付结果开始支付
                [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
                    NSLog(@"reslut = %@",resultDic);
                }];
            }
        }

** 六、解决BUG**

    1.Cannot find interface declaration for ‘NSObject’

        解决方案:在报错的类文件中添加头文件 #import <Foundation/Foundation.h>
图片.png
    2.Unknown type name "NSString"/"NSData"等等

        解决方案:在报错的类文件中添加头文件   #import <Foundation/Foundation.h>  和 #import <UIKit/UIKit.h>  
图片.png
    3.openssl/asn1.h not found.  (注:此处最坑,一般情况下很难发现此处BUG)

        解决方案:点击工程 -- TARGETS -- Build Setting -- Search Paths -- Header Search Paths , 选取工程 AliPay -- openssl 目录下的 asn1.h 文件 ,拖入到 Header Search Paths 中;**切记**,由于不同操作和存放位置,可能产生的客观原因很多,所以,从最后一个文件地址开始删除,边删除边编译!
        举例说明:最开始我导入的文件地址为 :
            "$(SRCROOT)/项目名字/Classes/Framework/AliPay/openssl/asn1.h" 
        后删减为:
            "$(SRCROOT)/秀贝/Classes/Framework/AliPay"
        方能编译!
        此处思考:是否需要填写到openssl的父目录才可行?网上资料显示,有的小伙伴需要删减到项目目录才行!所以根据不同操作和存放位置等客观原因,采取不同方案!

    4.rsa_private read error : private key is NUL (运行后点击支付出现此失败问题)

        解决方案:解决方法:
            1)在RSADataSigner.m文件中 搜索代码 [result appendString:@"-----BEGIN PRIVATE KEY-----\n"]; 将其改成 [result appendString:@"-----BEGIN RSA PRIVATE KEY-----\n"];
            2)在RSADataSigner.m文件中 搜索代码 [result appendString:@"\n-----END PRIVATE KEY-----"]; 将其改成 [result appendString:@"\n-----END RSA PRIVATE KEY-----"];

      5.系统繁忙,请稍后再试。(ALI40247)

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

推荐阅读更多精彩内容