iOS 支付宝集成中的那些坑

本文Demo地址

1.下载支付宝SDK以及Demohttps://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1

2.解压下载的.zip包,选择iOS客户端,看到的目录结构如下

Paste_Image.png

3.导入AliSDKDemo中的AliAlipaySDK.bundle AlipaySDK.framework libcrypto.a libssl.a四个文件到工程中

Paste_Image.png

4.导入demo中相关文件到项目中


Paste_Image.png

5.导入后项目结构应该是这样的 其中AliPaySDK是笔者新建的文件夹用于存放支付宝项目文件的,你们可以自己创建文件夹

Paste_Image.png

6.导入系统依赖库

Paste_Image.png

7.此时如果编译的话,会报错

Paste_Image.png

解决方法 在Header Search Paths中添加AliPaySDK路径

注意 AliPaySDK为笔者自己创建的文件目录 ,你们可以自行创建,然后换成自己的路径就可以了
Paste_Image.png

8.客户端调用支付宝SDK



#import "ViewController.h"
#import "Order.h"
#import "APAuthV2Info.h"
#import "DataSigner.h"
#import <AliPaySDK/AlipaySDK.h>

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    
    UIButton *payButton = [UIButton buttonWithType:UIButtonTypeCustom];
    payButton.frame = CGRectMake(10, 100, self.view.frame.size.width-20, 40);
    [payButton setTitle:@"pay 0.01元" forState:UIControlStateNormal];
    [payButton setTitle:@"pay 0.01元" forState:UIControlStateSelected];
    [payButton setBackgroundColor:[UIColor orangeColor]];
    [payButton addTarget:self action:@selector(payAction) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:payButton];
}

/**
 *  支付按钮
 */
- (void)payAction
{
    /*============================================================================*/
    /*=======================需要填写商户app申请的===================================*/
    /*============================================================================*/
    NSString *partner = @"2088*********"; /** 合作商户ID  PID */
    NSString *seller = @"填写支付宝账号"; /** 支付宝账号ID  */
    NSString *privateKey = @"很长的一串字符  文章下面有说明如何获取"; /** 商户私钥 自助生成 */
    /*============================================================================*/
    /*============================================================================*/
    /*============================================================================*/
    
    //partner和seller获取失败,提示
    if ([partner length] == 0 ||
        [seller length] == 0 ||
        [privateKey length] == 0)
    {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
                                                        message:@"缺少partner或者seller或者私钥。"
                                                       delegate:self
                                              cancelButtonTitle:@"确定"
                                              otherButtonTitles:nil];
        [alert show];
        return;
    }
    
    
    /*
     *生成订单信息及签名
     */
    //将商品信息赋予AlixPayOrder的成员变量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
    order.productName = @"runbey测试商品"; //商品标题
    order.productDescription = @"runbey商品描述"; //商品描述
    order.amount = @"0.01"; //商品价格
    order.notifyURL =  @"http://*****"; //回调URL 异步通知服务器支付结果,便于服务器更新订单状态
    
//实际项目开发中 订单信息应该由服务器返回


    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    //应用注册scheme 便于支付结束后重新打开客户端
    NSString *appScheme = @"ybpaydemo";
    
    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    NSLog(@"orderSpec = %@",orderSpec);
    
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        NSLog(@"签名字符串:%@",orderString);
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            NSLog(@"支付结果reslut = %@",resultDic);
        }];
    }
}

#pragma mark -
#pragma mark   ==============产生随机订单号==============

- (NSString *)generateTradeNO
{
    static int kNumber = 15;
    
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++)
    {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

@end

9.针对以上代码做几点说明

1.Mac终端中输入 openssl 进入Openssl程序

  1. 生成私钥 命令 genrsa -out rsa_private_key.pem 1024
    3.iOS客户端需要将生成的私钥转换成PKCS8格式 命令 pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
获取到pkcs8格式的字符串就是项目中需要的privatekey,取-----BEGIN PRIVATE KEY----------END PRIVATE KEY-----

中间的部分 切记!!!!
4.生成公钥 命令 rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem


  • 支付宝集成出现“系统繁忙,请稍后重试(ALI64)”错误的解决办法

1.用记事本打开上面第四步生成的公钥 rsa_public_key.pem,并将里面的密钥拷贝出来,粘贴到合作伙伴密钥管理中得RSA加密里,特别需要注意的是,需要将密钥中的空格、回车等删除,使该密钥为一行字符串。
2.用记事本打开上面第四步生成的公钥 rsa_public_key.pem,并将里面的密钥拷贝出来,粘贴到开放平台密钥管理中得RSA加密里,特别需要注意的是,需要将密钥中的空格、回车等删除,使该密钥为一行字符串。


至此,完成了支付宝iOS客户端的集成。

记录点滴,与君共勉。

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

推荐阅读更多精彩内容

  • 填坑支付宝填坑是每个接入支付宝必经之路,下面是我接入支付宝遇到的问题汇总,希望大家在接入的路上少一点弯路 问题1....
    lumic000阅读 26,229评论 44 486
  • 因为近期项目中需要接入支付宝支付功能,自己也爬了很多的坑,所以做了一下这边文章供大家学习参考,远离爬坑,文章主要讲...
    啓蘊阅读 2,236评论 0 4
  • 嘟哝嘟哝:最近接到一个任务:在客户端动态生成RSA密钥对,然后向服务器发送这个密钥对中的公钥字符串,由服务器进行公...
    TimmyR阅读 7,859评论 19 21
  • 对号入座是种什么体验,就是当你愉悦地happy了周末,第一天上班就遇到那个死人脸,然后死人脸一本正经傻逼地痛批了你...
    雁点阅读 231评论 1 0
  • 草戒指 2015年7月8日 究竟今天小草绕过指环,我没有去编那个草戒指,而是拿起狗尾巴草编了个不像兔子的兔子。 大...
    刘会专阅读 567评论 2 7