支付宝封装ios学习资料

新版支付宝支付

2016-10-17  本文已影响2741人  hx永恒之恋

首先申请并登陆开发者账号,地址:https://open.alipay.com/platform/home.htm
与支付宝进行签约签约管理
在管理中心

创建应用并获取APPID

创建应用.png

应用环境配置

环境配置.png
1 应用网关:这个应用网关是什么?
就是你的支付宝签约支付宝时,指定可用于支付验证的网址。比如你公司后台支付服务器的网址,类似 应用网关 http://www.thisIsAtext.cn/web.php/home/pay/notifyurl在这里要处理一些支付宝的响应
2授权回调地址:
第三方授权或用户信息授权后回调地址。授权链接中配置的redirect_uri的值必须与此值保持一致。如:
授权回调地址 http://www.thisIsAtext.cn/web.php/home/pay/returnurl

题外话:支付宝集成时,有同步返回地址return_url和异步通知地址notify_url,这两个地址中的参数与签名验证有非常大的关系,在支付宝的说明中,强调return_url不可以有自定义参数,否则会导致sign和mysign不相等,但有时我们需要一些自定义参数来做判断

签名验证机制

支付宝签名有两次,第一次是发送的时候,第二次是返回的时候,返回又分为同步返回和异步通知,这两个的签名方式是相同的。
关于支付支付宝异步通知(notify_url)与return_url可查看支付宝接口使用文档说明了解一番

.

生成与配置密钥

第一步 生成RSA密钥
生成方式一(推荐):使用支付宝提供的一键生成工具(内附使用说明)
Windows:下载
MAC OSX:下载

解压打开文件夹,直接运行“支付宝RAS密钥生成器SHAwithRSA1024_V1.0.bat”(WINDOWS)或“SHAwithRSA1024_V1.0.command”(MACOSX),点击“生成RSA密钥”,会自动生成公私钥,然后点击“打开文件位置”,即可找到工具自动生成的密钥。
注意:工具不支持含中文或空格的路径,请下载到英文目录下使用。

第二步 密钥配置
开发者登录开放平台后,找到并进入应用。
点击“RSA(SHA1)密钥”处的“设置开发者公钥”(如已设置则显示“查看开发者公钥”,可修改),将公钥文件去除头尾、换行和空格,仅需填入字符串。
例如转换前公钥pem文件格式:
-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB

-----END PUBLIC KEY-----

转换后得到的字符串为:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDQWiDVZ7XYxa4CQsZoB3n7bfxLDkeGKjyQPt2FUtm4TWX9OYrd523iw6UUqnQ+Evfw88JgRnhyXadp+vnPKP7unormYQAfsM/CxzrfMoVdtwSiGtIJB4pfyRXjA+KL8nIa2hdQy5nLfgPVGZN4WidfUY/QpkddCVXnZ4bAUaQjXQIDAQAB

第三步 获取支付宝公钥
应用上线后点击“查看支付宝公钥”,即可获取支付宝公钥,用于支付宝返回数据的验签。
对于支付宝公钥,看到的是一个字符串,如下:

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB

如果需要使用文件方式(如使用服务端SDK的PHP/.NET版本)读取支付宝公钥,需要在头尾加入标示后保存至文件,文件内容如下:

-----BEGIN PUBLIC KEY-----

MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDDI6d306Q8fIfCOaTXyiUeJHkrIvYISRcc73s3vF1ZT7XN8RNPwJxo8pWaJMmvyTn9N4HQ632qJBVHf8sxHi/fEsraprwCtzvzQETrNRwVxLO5jVmRGi60j8Ue1efIlzPXV9je9mkjzOmdssymZkh2QhUrCmZYI/FCEa3/cNMW0QIDAQAB

-----END PUBLIC KEY-----

集成并配置SDK

接入移动支付需要集成两个SDK,客户端SDK需要集成在商户自己的APP中,用于唤起支付宝APP并发送交易数据,并在支付宝APP返回商户APP时获得支付结果。服务端SDK需要商户集成在自己的服务端系统中,用于协助解析并验证客户端同步返回的支付结果和异步通知。

集成客户端SDK

官方文档iOS集成流程详解
支付宝SDK的使用
先下载一个支付宝的SDK

选择iOS客户端



在项目里面导入下面的组合文件夹


在pch文件里面导入

#ifdef __OBJC__
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
#endif

在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:


其中,需要注意的是:
如果是Xcode 7.0之后的版本,需要添加libc++.tbd、libz.tbd;
如果是Xcode 7.0之前的版本,需要添加libc++.dylib、libz.dylib
(如下图)。


3.7.上面的步骤做完运行一下,会报错

解决办法:配置路径:配置完再运行就没事了

Android集成流程详解

集成服务端SDK
在需要使用支付的地方导入下面的头文件(也可写在pch
文件里面)
//订单框架#import "Order.h"//使用RSA加密框架#import "DataSigner.h"//支付报框架#import <AlipaySDK/AlipaySDK.h>

5.在点击支付的方法里面调用下面的方法

这两项用户需要自己填写应用的appID
NSString *appID = @"";

私钥(上面的步骤有生成)
NSString *privateKey = @"";

- (void)doAlipayPay{
 //重要说明 
 //这里只是为了方便直接向商户展示支付宝的整个支付流程;所以Demo中加签过程直接放在客户端完成;
 //真实App里,privateKey等数据严禁放在客户端,加签过程务必要放在服务端完成;
 //防止商户私密数据泄露,造成不必要的资金损失,及面临各种安全风险;
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
NSString *appID = @"";
NSString *privateKey = @"";
/*============================================================================*/
//partner和seller获取失败,提示
if ([appID length] == 0 || [privateKey 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 = @"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
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderInfo];
// NOTE: 如果加签成功,则继续执行支付
if (signedString != nil) { 
    //应用注册scheme,在AliSDKDemo-Info.plist定义URL types 
    NSString *appScheme = @"alisdkdemo"; 

    // NOTE: 将签名成功字符串格式化为订单字符串,请严格按照该格式 
    NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderInfoEncoded, signedString]; 

    // NOTE: 调用支付结果开始支付
     [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) { 
    NSLog(@"123reslut = %@",resultDic);
     }]; 
  }
}
    
- (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;
 }

回调的添加

代码中的回调标识符

工程中配置

提示:
集成支付宝 报错: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-----"];

2解决方法:
A、将私钥转成PKCS8替换一下原私钥即可
1、生成私钥pem, 执行命令openssl genrsa -out rsa_private_key.pem 1024
2、生成公钥,执行命令openssl rsa -in rsa_private_key.pem -pubout -out rsa_public_key.pem3
将RSA私钥转换成PKCS8格式,命令执行
openssl pkcs8 -topk8 -inform PEM -in rsa_private_key.pem -outform PEM -nocrypt
( PHP服务端语言读取私钥不需要PKCS8转换)

iOS公钥私钥生成器 密码: pqyk
需要导入的文件 密码: aqyg
ios支付宝demo 密码:cbfx
老版本的支付宝,JoanKing做的demo 密码: dkwf
老版本的支付宝集成文档

上一篇下一篇

猜你喜欢

热点阅读