前言
前段时间公司App要集成支付宝支付与微信支付,在网上看各种关于支付集成的分享,最后总算是完成了任务,不得不吐槽一下,真心看的很累,刚好我也回顾一下整个集成的流程,也分享给各位需要集成支付的小伙伴,第一篇先分享支付宝的集成吧,等有时间再分享微信集成,希望能对各位有所帮助。
1、基本配置
- 首先要到支付宝官网下载SDK拖到项目中,网址如下
https://doc.open.alipay.com/doc2/detail.htm?spm=a219a.7629140.0.0.gj1opJ&treeId=59&articleId=103563&docType=1 - 解压iOS支付压缩包,得到如下:
- 将如下四个文件文件拖到工程中
- 白名单操作
-
然后根据支付宝提供的Demo,将如下AlipaySDK依赖库
-
将如下代码添加到pch文件中
Commond+B编译工程,可能会报如下错误
- 在SearchPath目录下添加$(SRCROOT)/支付Demo(该名称为项目的文件名) 如图
通过以上即可完成项目的基本配置。
2、集成代码
- 需申请参数
//商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)。
NSString *partner = @"";
//卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
NSString *seller = @"";
// 商户私钥
NSString *privateKey = @"";
- 自定义MLPayOrder,在demo中order文件的基础上,添加如下初始化方法,假设后台返回数据为json例,转成字典,
- (instancetype)initWithDic:(NSDictionary *)dic
{
if (self = [self init])
{
self.partner = MLPayAliParterValue;
self.sellerID = MLPayAliSellerValue;
self.service = MLPayAliServiceValue;
self.paymentType = MLPayAliPaymentTypeValue;
self.inputCharset = MLPayAliInputCharsetValue;
self.showURL = MLPayAliShowUrlValue;
self.itBPay = [dic objectForKey:MLPayAliItbPayKey];
self.outTradeNO = [dic objectForKey:MLPayAliOutTradeNoKey];
self.body = [dic objectForKey:MLPayAliBodyKey];
self.subject = [dic objectForKey:MLPaySubjectKey];
self.totalFee = [dic objectForKey:MLPayAliTotalFeeKey];
self.notifyURL = [dic objectForKey:MLPayAliNotifyUrlKey];
}
return self;
}
- 在发起支付方法中如下
+ (void)aliPayWithDic:(NSDictionary *)dic
{
MLPayOrder *order = [[MLPayOrder alloc] initWithDic:dic];
NSString *aliPayOreder = [order description];
NSString *appScheme = @"alisdkdemo";
id<DataSigner> signer = CreateRSADataSigner(MLPayAliPrivateKeyValue);
NSString *signedString = [signer signString:aliPayOreder];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
aliPayOreder, signedString, @"RSA"];
// 调起支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",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;
}
// NOTE: 9.0以后使用新API接口
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString*, id> *)options
{
if ([url.host isEqualToString:@"safepay"]) {
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
NSLog(@"result = %@",resultDic);
}];
}
return YES;
}
- 注:只需要在Appdelegate里面添加以上代码,无需做操作
关于其中的常量定义如下:
// 支付宝相关
static NSString *const MLPayAliParterValue = @"";
static NSString *const MLPayAliSellerValue = @"";
static NSString *const MLPayAliPrivateKeyValue = @"";
static NSString *const MLPayAliShowUrlValue = @"m.alipay.com";
static NSString *const MLPayAliOutTradeNoKey = @"out_trade_no";
static NSString *const MLPayAliBodyKey = @"body";
static NSString *const MLPaySubjectKey = @"subject";
static NSString *const MLPayAliTotalFeeKey = @"total_fee";
static NSString *const MLPayAliNotifyUrlKey = @"notify_url";
static NSString *const MLPayAliItbPayKey = @"it_b_pay";
static NSString *const MLPayAliInputCharsetValue = @"utf-8";
static NSString *const MLPayAliPaymentTypeValue = @"1";
static NSString *const MLPayAliServiceValue = @"mobile.securitypay.pay";
发起支付后,支付完成,支付宝会返回支付结果,相关支付结果可参考支付宝集成文档,此处不再详说。