iOS 支付宝集成

来源:互联网 发布:sqlite 创建数据库 编辑:程序博客网 时间:2024/06/07 01:56

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

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


0 0