支付的签名,私钥等什么的,都是放到后台的,这里为了测试,放到客户端。
一:支付宝最新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字段来做相应处理。
五:支付流程
这里主要是讲支付的逻辑了,其实支付宝文档里,也提到过,但是很多人,没有去看,或者说懒得去看。来让我给你们画个流程图把。
我希望大家能仔细看看这个流程图,因为我遇到很多,不知道支付流程的,后台也不知道如果去写。一切都在图里,我就不啰嗦了。
如有纰漏,敬请指出,不胜感激,谢谢。