Swift编程

Swift支付宝支付

2017-01-20  本文已影响407人  贝尔特伦

支付的签名,私钥等什么的,都是放到后台的,这里为了测试,放到客户端。

一:支付宝最新SDK经过本人测试,最新的SDK没有什么问题,但是它的提供的签名方式,不能够支付,会一直报错,所以这里要使用老版本的签名方式。

其实很简单,改写新版本sdk的order的类,把老版本的代码复制进去。源代码不用动。在支付的时候,还是使用老的签名方式。

二:目前的SDK没有纯Swift版本的,所以还是OC的SDK,这里需要在桥接头文件中引入相关头文件。

//支付宝头文件
#import <AlipaySDK/AlipaySDK.h>
#import "Order.h"
#import "DataSigner.h"

三:客户端签名支付过程

    //商户ID
    let appID = "";
  //收款账号 
    let seller_id = "";
    //私钥
    let privateKey = "";
    if appID.endIndex == appID.startIndex || seller_id.endIndex == seller_id.startIndex || privateKey.endIndex == privateKey.startIndex{
        self.showAlerController(title: "支付宝信息缺少", message: "请填写完整");
        return;
    }
    
    //生成订单信息及签名
    let order = Order.init();
    order.partner = appID;
    order.seller = seller_id;
    //订单ID
    order.tradeNO = "110120130140";
    //订单名
    order.productName = "花花大美女";
    //描述
    order.productDescription = "这是一个测试数据,这是一个测试数据";
    //价格
    order.amount = String.init(format: "%.2f", 0.01);
    //回调地址
    order.notifyURL = "http://www.baidu.com";
    //下面的固定
    order.service = "mobile.securitypay.pay";
    order.paymentType = "1";
    order.inputCharset = "utf-8";
    order.itBPay = "30m";
    order.showUrl = "m.alipay.com";
    //这个也要唯一,是支付宝支付成功后吊起自己App的关键,在info里要配置相应的URL Schemes和其一致
    let appScheme = "YBWisdom";
    
    //商品信息拼接字符串
    let orderSpec = order.description;
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    let singer = CreateRSADataSigner(privateKey);
    let signedString = singer?.sign(orderSpec);
    //将签名成功字符串格式化为订单字符串,严格按照格式
    var orderString = "";
    if signedString?.endIndex != signedString?.startIndex {
        
        orderString = String.init(format: "%@&sign=\"%@\"&sign_type=\"%@\"", orderSpec,signedString!,"RSA");
        AlipaySDK.defaultService().payOrder(orderString, fromScheme: appScheme, callback: { (resultDic) in
           
            
            
        });
        
    }

以上签名过程只适合测试。

后台签名支付实例

订单的信息,和签名都是由后台返回回来,订单ID要唯一。这里以OC为例,因为Swift版本的,没有写。

- (void)zfbPayWithdic:(NSDictionary *)dic{
NSString *signedString = [dic objectForKey:@"sign"];
NSString *orderString=[dic objectForKey:@"orderInfo"];
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
               orderString, signedString, @"RSA"];
NSString *appScheme=@"YBWisdom";
[[AlipaySDK defaultService]payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
    
    if([[resultDic objectForKey:@"resultStatus"] integerValue] == 9000){
        
        [self showAlertControllerWithTitle:@"充值成功" message:nil];
        [self.navigationController popViewControllerAnimated:YES];
    }else{
        UIAlertController *alert = [ToolBox showAlertControllerWithInfo:@"支付失败,请稍后重试"];
        [self presentViewController:alert animated:YES completion:nil];
    }
}];

}

四:支付方式的细分(与老版本比较)

在支付宝新版本的SDK中,把web支付页面和手机客户端支付,两种方式区分开来。
老版本中:

       AlipaySDK.defaultService().payOrder(orderString, fromScheme: appScheme, callback: { (resultDic) in
           
            
            
        });

无论是web端还是客户端都是这一个方法,但是在新版本中,这个方法只是web的支付方式。而客户端的支付则换换成了下面这个方法。

- (void)processOrderWithPaymentResult:(NSURL *)resultUrl
                  standbyCallback:(CompletionBlock)completionBlock

所以要在appdelegate里面配置客户端的支付

配置客户端支付

在APPDelegate里面

func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
    if url.host == "safepay"{
     
        AlipaySDK.defaultService().processAuthResult(url, standbyCallback: { (resultDic) in
            
            
        });
        
        return true;
    }
    return false;
}

如果resultDic中的result字段为9000则是支付成功,开发者根据result字段来做相应处理。

五:支付流程

这里主要是讲支付的逻辑了,其实支付宝文档里,也提到过,但是很多人,没有去看,或者说懒得去看。来让我给你们画个流程图把。

支付流程.png

我希望大家能仔细看看这个流程图,因为我遇到很多,不知道支付流程的,后台也不知道如果去写。一切都在图里,我就不啰嗦了。
如有纰漏,敬请指出,不胜感激,谢谢。

上一篇 下一篇

猜你喜欢

热点阅读