iOS 支付宝集成

使用支付宝进行一个完整的支付功能大概需要以下几个步骤:

1.向支付宝申请,与支付宝签约,获得商户ID (partner) 和账号ID (seller)

2.下载相应的公钥私钥文件(加密签名使用)

3.下载支付宝的SDK

4.生成订单信息,签名加密

5.调用支付宝客户端,由支付宝客户端跟支付宝完全服务器打交道

6.支付完毕后,支付宝客户端会跳回到原来的应用程序

7.在原来的应用程序中显示支付结果给用户看


首先是下载SDK (https://b.alipay.com/order/productDetail.htm?productId=2013080604609654&tabId=4#ps-tabinfo-hash)

图中的商户客户端就是我们iOS 客户端需要做的事情:

*调用支付宝支付接口

*处理支付宝返回的支付结果

在调用支付宝支付接口前,我们还需要先生成一个订单,文档中描述时,是将这步放在客户端做了,但也可以在服务器端生成这个订单(图中支付宝会在支付成功后通知服务器端,所以在服务器端生成订单的话,可以掌握所有的订单,而且也会更加的安全):

*生成订单(可以在iOS 客户端内生成,也可以在服务器端生成)

*调用支付宝支付接口,发送订单

*处理支付宝返回的支付结果

业务大致就是这样的,但是还有一个安全性的问题,你肯定不希望接收到的支付结果被截取修改,所以需要生成订单和处理支付结果的时候做一个安全性的校验:

生成订单时对数据签名,收到支付结果时对数据进行签名验证,以校验数据是否被篡改过。支付宝目前只支持采用RSA 加密方式做签名验证。

注:RSA 加密算法除了可加解密外,还可以用来作为签名校验,简单的说就是RSA 会生成一个私钥和一个公钥,私钥应该改由我们独立保管,公钥分发出去,做签名验证时,可以用私钥对需要传输的数据做签名加密,生成一个签名值,之后分发数据,接收方通过公钥对签名值做校验,如果一致则认为数据没有篡改。具体到支付宝使用RSA 做签名验证,就是在生成订单的时候,需要使用私钥生成签名值,在处理返回的支付结果时,需要使用公钥验证返回的结果是否被篡改。具体对哪些值,怎样生成签名,对哪些值做签名验证文档中都有。

//0:导入框架及资源包
//1:生成订单信息  -> Order
//2:配置URLScheme
//3:签名 --> 两个文件夹 / 两个.a文件 / 增加Foundation头文件 / 配置搜索头文件的路径$(PROJECT_DIR)/Alipay / 增加框架
//4:使用支付宝支付
//5:处理回调信息 >1.在当前的页面中处理一次  2. 在AppDeleagte中配置一次
- (void)btnClick:(UIButton *)button {
    //1.生成订单信息
    Order *order = [[Order alloc] init];
    /*
     *商户的唯一的parnter和seller。
     *签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
     */
    //合伙人
    order.partner = PartnerID;
    //卖家
    order.seller = SellerID;
    //商品号
    order.tradeNO = @"123456";
    //商品名
    order.productName = @"商品名称";
    //商品描述
    order.productDescription = @"上平描述";
    //商品价格
    order.amount = @"0.01";
    order.notifyURL = @"http://www.baidu.com";     //回调URL
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";//未付款交 易的超时 时间
    
    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @"zhifuTest";
    //将商品信息拼接成字符串
    NSString *ordeSpec = [order description];
    
     //2. 签名
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循 RSA 签名规范, 并将签名字符串 base64 编码和 UrlEncode
    //使用私钥签名
    id<DataSigner> signer = CreateRSADataSigner(PartnerPrivKey);
    //签名订单描述
    NSString *signedString = [signer signString:ordeSpec];
    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",ordeSpec,signedString,@"RSA"];
        
    }
     //3. 支付成功的回调 --> 在当前程序中完成付款的回调 
     [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
        
        NSLog(@"支付宝测试");
        
        NSLog(@"restlut = %@",resultDic);
    }];

}
//appDelegate中的回调

// 跳转支付宝客户端的时候 --> 有客户端的
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation {
//跳转支付宝钱包进行支付,处理支付结果
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}
resultStatus,状态码,SDK里没对应信息,第一个文档里有提到:
9000 订单支付成功
8000 正在处理中
4000 订单支付失败
6001 用户中途取消

6002 网络连接出错

上面说了,订单签名应该用私钥,但是把私钥放到app里其实本身就不安全,因为你的app是分发到用户手里的,私钥应该放在自己的手里,分发出去的应该是公钥。
所以私钥最好是放在自己的服务器上,订单加密这个工作放在服务器端来做,服务器将包含签名的订单信息返回给app,app再通过SDK发送给支付宝,这样会更安全些;而且服务器也能掌握所有的订单状况。
如果你非要将私钥集成到app里,那可以参考SDK的DEMO,因为这个DEMO就是在app本地通过私钥做的订单签名。

参考文章:http://www.jianshu.com/p/fe56e122663e


发布了84 篇原创文章 · 获赞 23 · 访问量 10万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章