iOS 支付宝支付开发集成流程,这里记载的是签名保存在前台的集成,
2016-05-13 11:22
1101 查看
1 alipay
要做支付宝支付,对于新手,首先要了解的这个支付的业务逻辑,总体逻辑,下面就是基于支付宝SDK集成的交互流程,1,公司boss用公司账号,申请支付宝账号,向支付宝签约获得商户ID(partner)和账号ID(seller),这些主要是公司负责,我们只是拿来用的两个参数,
2,公司boss用申请来的公钥与支付宝获得私钥,(私钥是我们要用的) ;
3,下载支付宝官方sdk,导入工程,引第三方库,(登录网站:(登录网站:http://club.alipay.com/)
4,生成订单信息(期间包括了签名,操作后面会谈到)
5,调用官方sdk方法,发起支付请求,吊起支付宝,
6,支付完毕后,异步返回到服务器后台地址(这个地址是你跳转支付宝的时候调用支付宝官方sdk传参数存在后台服务器地址),同步返回支付信息到app(就是点击返回的时候通过block 传回来的信息);
2 下载sdk
去官方下载sdk 以及Demo 根据官方文档的步骤把 sdk导入工程需要的文件包括下图
将需要的文件,静态库等拖入工程中,这里有:alipaySDK.framework,alipaySDK.bundle,libcrypto.a,libssl.a,openssl,order.h,order.m文件
在接下来在在target的building phases 里面 加入需要的库
3.此时,或许会报错,那是因为在这些文件在demo里有一个.pch 文件 里面把 foundation 和uikit 库引进来了,所以在报错的时候你需要手动引进这俩个头文件
#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
4此时运行程序还会报错 意思大概是
ios调支付宝找不到头文件<openssl/rsa.h>
,这个是官方sdk没有把路径带进来,所以你需要手动添加 步骤是1找到TARGETS 的building setting 下 搜索 header search path 找到这项添加路径 (主要 需要添加相对路径)双击这一项 点击加号按钮 添加openssl文件路径 2如何获取路径 右键工程openssl文件夹 show in finder 找到双击显示简介找到位置 复制出来路径 要工程名字后面的路径,在前面拼接上
$(PROJECT_DIR)/工程名字后面的路径;
此时运行工程 就可以正常了,
好了言归正传 开发集成代码
我的开发 是 写一个nsobject 类封装了 支付宝支付的集成,方便别处用名字叫 Alipay 先看.h文件 主要是 留一个传参的接口 和blcok回调支付结果的方法
在看.m文件 我用复制的方式写 不用图片了
首先 是实现类方法
此方法 是实现 给外部接口的 调用的 类方法 orderDic 是传入商品参数 两个block 是成功 和失败 会吊起返回的block
次方法里 调用了 初始化 方法 和 自定义 一个 方法 [alipay payWithOrderDic:orderDic success:success ispaying:ispaying Error:error]
这个方法 是调用支付宝的配置参数的方法 不理解 看下面的具体方法
+(void)payWithOrderDic:(NSDictionary *)orderDic success:(alipayBlock)success ispaying:(alipayBlock)ispaying Error:(alipayBlock)error{
Alipay *alipay = [[Alipay
alloc]init];
[alipay payWithOrderDic:orderDic
success:success ispaying:ispaying
Error:error];
}
//此方法 是初始化方法 初始化 一些吊起支付宝 sdk 的方法 的参数的信息配置 里面的_partner _seller _pritvatekey 是全部变量 私有变量 这些变量 都是老板或者后台 给的 是死的 不会改变的 写个宏存下就好
-(instancetype)init {
self = [super
init];
if (self) {
//从plist文件获取当前账号信息
//商户id (直接从老板要)
_partner =
ALIPAY_PARTNER;
//商户账号
_seller =
ALIPAY_SELLER;
//商户的私钥
_privatekey =
ALIPAY_PRIBVATEKEY;
}
return
self;
}
//此方法 就是 在配置 吊起支付宝 sdk 的payorder方法需要的参数的配置 签名等一些列操作
-(void)payWithOrderDic:(NSDictionary *)orderDic success:(alipayBlock)success ispaying:(alipayBlock)ispaying Error:(alipayBlock)error{
//首先判断
商户ID 私钥
和账号是否获取成功
if (_partner.length==0||_seller.length
==0||_privatekey.length ==
0) {
DPLog(@"缺少ID,账户,私钥,");
error();
return;
}
//生成订单信息
并签名
Order *order = [[Order
alloc]init];
order.partner =
_partner;//商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)。
order.sellerID =
_seller;//卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
order.outTradeNO = orderDic[@"outtradeno"];//订单id
改商品的唯一表示(app端自行制定)就是一串随机数 32位以下的
order.subject = orderDic[@"subject"];//商品标题//商品的标题/交易标题/订单标题/订单关键字等。
order.body = orderDic[@"body"];//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
order.totalFee = [NSString
stringWithFormat:@"%@",orderDic[@"totalFee"]];//商品的金额
//注意 是保留两位小数的 多了不行 支付宝 不认同 必须是两位小数的字符串
order.service =@"mobile.securitypay.pay";//支付宝的服务器
固定的 都是这个
order.paymentType =@"1";//付款类型,1:商品购买。(不传情况下的默认值)
order.inputCharset =@"utf-8";//商户网站使用的编码格式,固定为utf-8。
order.itBPay =
@"30m";//设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭。当用户输入支付密码、点击确认付款后(即创建支付宝交易后)开始计时。取值范围:1m~15d,或者使用绝对时间(示例格式:2014-06-13
16:00:00)。m-分钟,h-小时,d-天,1c-当天(1c-当天的情况下,无论交易何时创建,都在0点关闭)。该参数数值不接受小数点,如1.5h,可转换为90m。(一般设置为30m)
order.showURL =@"m.alipay.com";//支付宝的scheme
标示 固定的 谁开发 都是这个
NSString *appscheme =
@"com.changsheng.wyzxclient"; //这个是程序间调转的你得app的表示 下面有介绍
order.notifyURL = [NSString
stringWithFormat:@"%@/service/alipay/orderComplete",IMAGEHEADER]
;//回调URL
这个URL是在支付之后,支付宝通知后台服务器,使数据同步更新,必须填,不然支付无法成功(去问后台 要这个网址)
//将商品信息拼接成字符串
NSString *orderSpec = [order
description];
DPLog(@"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"];//次方法 就是把 签名后的 和 订单信息的两个字符串 拼接为一个支付宝规则字符串 留着传给支付宝的方法
//支付后的状态处理 此方法 是吊起支付宝sdk的方法 传的参数 就是上一步构造的字符串
[[AlipaySDK
defaultService]payOrder:orderString
fromScheme:appscheme callback:^(NSDictionary *resultDic) {
DPLog(@"%@",resultDic);
if ([[resultDic
objectForKey:@"resultStatus"]intValue] ==9000) {
//支付成功
success();
}else
if ([[resultDic objectForKey:@"resultStatus"]intValue] ==8000){
//正在处理
ispaying();
}else{
//支付错误
error();
}
}];
}
}
针对方才说的对于程序间调用的 那个参数如何设置 这个就是简单的程序间调用 需要设置 就是所谓的白名单 在tagate 的 info 里 有一个URL Types 点开 点击加号 在url schems 里添加 个字符串 一般是 budle
id
保持这里
和传给支付宝的一致就可以 要不然 支付完 返回不了
相关文章推荐
- ios 改变tableviewcell 的选中颜色
- iOS自定义转场详解03——实现通过圆圈放大缩小的转场动画
- iOS 自定义下拉线条动画
- iOS TextFiled 文本密码切换 光标偏移解决
- 谈谈iOS中粘性动画以及果冻效果的实现
- GCD 深入理解(二)
- ios socket 实现简单的聊天系统
- GCD 深入理解(一)
- iOS7 通过jsContext调用js交互问题
- 常用白名单 iOS
- 编译参数-ObjC的说明
- iOS-键盘通知
- iOS 设置tabBar上的提醒数字
- 关于block使用的5点注意事项
- iOS 单例写法
- iOS中ARC内部原理
- iOS开发——绘图电池按百分比显示
- iOS自定义NavigationBar
- 一个丝滑的全屏滑动返回手势
- 自学 iOS 开发的一些经验