您的位置:首页 > 移动开发 > IOS开发

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  


保持这里
和传给支付宝的一致就可以 要不然 支付完 返回不了 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: