ios集成支付宝支付2016.8

官方接入指南
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.6AJiJ8&treeId=58&articleId=103541&docType=1

1.签约与审核

签约:和支付宝签约,登记商家的信息,然后支付宝会给商家凭据,PID和key。
签约审核很快的,一般一天内就搞定了。

2.PID和密钥管理

PID:合作者身份id,就像你的身份证号码一样,唯一的。
key:密钥,支付宝提供商户接口产品时,会自主提供一个保障商户接入安全的一组信息及其对应的配置平台,这组信息就是密钥。由商户密钥与支付宝密钥交换后与支付宝商户标识(如partnerID、APPID等)绑定。

合作伙伴密钥

在服务市场签约获得的大部分接口,签约主体是商户,接口权限属于具体的商户,这部分接口需要使用PID和密钥来调用,此类接口网关一般为mapi(https://mapi.alipay.com/gateway.do),PID对应的密钥一共有三种签名方式,分别是MD5、RSA、DSA。由于产品的特殊性,每个产品支持哪些签名方式不尽相同,具体需参考各个产品的接口技术文档。
使用合作伙伴密钥的典型功能包括:
快捷登录、移动支付、即时到账收款、手机网站支付等。

补充:公钥和私钥是成对的,它们互相解密。
公钥加密,私钥解密。
私钥数字签名,公钥验证。

如何生成相应的公钥私钥文件(加密签名用)?
Mac下生成很方便,终端切换都某个目录,输入openssl,就可以打开openssl工具来生成。接着只要二句命令就可以搞定。

1、生成私钥pem, 执行命令 openssl genrsa -out rsa_private_key.pem 1024

23F95D24-F951-4FE1-9A5F-22BACAAD0649.png

2、生成公钥,执行命令 openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem

该目录下就会生成两个文件,可以用文本编辑器打开就可以查看字符串了。

F028F40D-DC0A-4CA1-BB73-4E036D9E3BAE.png

公钥字符串需要复制粘贴到支付宝后台

AC1AFD65-3619-4C5D-B3D1-3EC9E100F24F.png

各个RSA都添加一遍,暂时不知道各个业务的具体区别。暂时不提。

3.接口调用

首先下载支付宝的SDK,集成到你的工程中,编译成功后,就可以开始编写代码,进行
接口调用了。具体代码参考本文第5部分工程代码!

4.遇到问题

错误一: rsa_private read error : private key is NULL
两种解决方法
1解决方法:
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-----"];

我采用第一种方法!截图如下:


510806AB-216E-4768-8375-011F40AFB20E.png

2解决方法:
将RSA私钥转换成PKCS8格式,终端命令执行 openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt ( PHP服务端语言读取私钥不需要PKCS8转换)密码为空就行(直接回车)


错误二:LaunchServices: ERROR: There is no registered handler for URL scheme alipay
这句话其实是在告诉你 设备上没有安装 支付宝的客户端,此时会走网页端

错误三:NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9824)
原因是没有适配ios9

5.工程代码
//以下代码也是参考简述简书某个高手的,演示用的.

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

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    UIButton *button1 = [[UIButton alloc]initWithFrame:CGRectMake(20, 20, 200, 44)];
    [button1 setTitle:@"0.01" forState:UIControlStateNormal];
    button1.backgroundColor = [UIColor redColor];
    [button1 addTarget:self action:@selector(click1) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:button1];
    
    
    UIButton *button2 = [[UIButton alloc]initWithFrame:CGRectMake(20, 120, 200, 44)];
    [button2 addTarget:self action:@selector(click2) forControlEvents:UIControlEventTouchUpInside];
    [button2 setTitle:@"0.02" forState:UIControlStateNormal];
    button2.backgroundColor = [UIColor lightGrayColor];
    [self.view addSubview:button2];
    
}


- (void)click1
{
    [self pushAliPay:@"0.01"];
}
- (void)click2
{
    [self pushAliPay:@"0.02"];
}


- (void)pushAliPay:(NSString *)str_price
{
    
   //需要填写商户app申请
    NSString *partner = @"2088开头的";//签约成功,支付宝提供给你的PID
    NSString *seller = @"cj25??@163.com";//你的支付宝账号
    NSString *privateKey = @"MIICXQIBAAKBgQCmIu4gNNn2VmAL7V2i7Y57dsiRG2DiustWKqcRnHyF5vr6cWXDHrr\neSKx86ClTlFDPNBdZ6SKsBVC1fpbGQ3WIJPooQ2cl11l";
     //私钥和公钥都是你自己利用工具手动生成的,在这里私钥有很多,我删了大部分
    
    //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.sellerID = seller;
    order.outTradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
    order.subject = @"商品标题"; //商品标题
    order.body = @"我是商品描述"; //商品描述
    order.totalFee = [NSString stringWithFormat:@"%.2f",[str_price doubleValue]]; //商品价格
    
    order.notifyURL =  @"http://www.xxx.com/AliNotify.php"; //回调URL.问后台要,   注意不带参数,完整的,而且是可以网上访问的地址,我用的是PHP。
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    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 (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[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;
}

@end


AppDelegate.m文件

#import "AppDelegate.h"
#import <AlipaySDK/AlipaySDK.h>
@interface AppDelegate ()

@end

@implementation AppDelegate
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
    if ([url.host isEqualToString:@"safepay"]) {
        //跳转支付宝钱包进行支付,处理支付结果
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
//结果代码
/* 9000 订单支付成功 8000 正在处理中 4000 订单支付失败 6001 用户中途取消 6002 网络连接出错 */
        }];
    }
     NSLog(@"%s",__func__);
    return YES;
}

6.其他小细节
配置URL Schemes:点击项目名称,点击“Info”选项卡,在“URL Types”选项中,点击“+”, 在“URL Schemes”中输入“alisdkdemo”。
这里要和工程代码中的 NSString *appScheme = @"alisdkdemo";//这里设置支付宝回调,两者要保持一致。

注意:正式接入支付宝支付的阶段,注意以下几点:
1服务端:负责生成订单及签名,及接收支付异步通知。
2客户端:负责使用服务端传来的订单信息调用支付宝支付接口,及根据SDK同步返回3的支付结果展示结果页。
3服务端接入:私钥必须放在服务端,签名过程必须放在服务端。(上面测试例子是直接把私钥写在了客户端的代码中了,仅仅是测试)

4.notifyURL:算个人总结吧,我是搞前端的,也去了解了下这后端的知识,这是服务器端的回调,采用的是POST请求,所以
获取参数是用 $_POST['trade_status'];

遇到问题:客户端支付成功,钱也到账了,但以为notify.php没有执行,实际上它是有访问的,可以查看日志,有记录时间访问这个文件的。另外它没有得到它想要的,它会访问很多次,所以这个文件要及时给echo "success"。
另外获取参数它有三个状态值,
一个空,
一个TRADE_SUCCESS,高级版,只是说明支付成功,但交易没有结束的,可能有退款处理
一个TRADE_FINISHED,简单版,即时到账,交易就完成了。
具体区别就看网上的http://blog.163.com/lisoaring@126/blog/static/19205606201521222851548/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念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

推荐阅读更多精彩内容