关于支付宝支付, 首先了解一下, 支付流程:
1.用户点击支付
2.客户端请求服务器用户支付
3.服务器接收请求生成金额订单等要给第三方支付的一切信息,并生成回调参数传给客户端
4.客户端接收信息(一般会再让用户确认支付或者干脆购买后是生成订单,然后才是付款)并将服务器给的信息分别传入SDK需要的参数中,调用SDK的支付方法
5.由支付宝SDK向支付宝自己的服务器发出支付请求,支付宝的服务器接收支付请求处理成功后,给客户端本身与公司的后台都发送一条支付成功的消息,客户端与后台根据这条消息再做处理.
开发步骤
第一步: 仔细看开发文档, 并 下载 SDK
开发文档 很重要, 建议先把开发文档仔仔细细看一遍, 可以避免很多坑, 特别是交互流程:
第二步: 集成 SDK
1 . 将 SDK 拖进 工程
2 . 在Build Phases 选项卡的 Link Binary With Libraries 中,增加以下依赖:
3 . 设置为URL Schemes
4 . 添加支付逻辑代码,完成支付过程
在支付页面:
#import <AlipaySDK/AlipaySDK.h>
#import "Order.h"
#import "DataSigner.h"
//宏定义 PID, 收款账户 和 私钥
//这里的三个参数是公司和支付宝签约之后得到的,没有这三个参数无法完成支付
//合作者身份(PID)
#define Partner @"合作者身份(PID)"
//商家支付宝账号
#define Seller @"商家支付宝账号"
#define KPrivate_key @"私钥"
#pragma mark 支付宝支付
- (void)aLiPay {
Order *order = [[Order alloc] init];
//合作者身份(PID)
order.partner = Partner;
//商家支付宝账号
order.seller = Seller;
//订单ID
order.tradeNO = @"订单ID";
//产品名称
order.productName = @"产品名称";
//商品描述
order.productDescription = @"商品描述";
//商品价格
order.amount = self.orderValue;
//回调URL
order.notifyURL = @"回调URL";
order.service = @"mobile.securitypay.pay";
//支付类型:1(商品购买)
order.paymentType = @"1";
//编码格式
order.inputCharset = @"utf-8";
//订单超时时间
order.itBPay = @"30m";
NSString * appSchem = @"TaoYuanLe";
//将商品信息拼接成字符串 该方法支付宝已经封好
NSString *orderSpec = [order description];
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
//使用私钥进行签名
id<DataSigner>signer = CreateRSADataSigner(KPrivate_key);
//调用签名 签名我的订单描述
NSString *sinedString = [signer signString:orderSpec];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (sinedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderSpec,sinedString,@"RSA"];
// 发起支付
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appSchem callback:^(NSDictionary *resultDic) {
//NSLog(@"支付结果result= %@",resultDic);
if ([[resultDic objectForKey:@"resultStatus"] isEqualToString:@"9000"]) {
//9000为支付成功
//在这里可以对支付结果进行判断, 也可以在```AppDelegate.m```回调方法中处理支付结果
}
}];
}
}
同时在 AppDelegate.m 中,
#import <AlipaySDK/AlipaySDK.h>//支付宝支付
#pragma mark 跳转支付宝, 微信 进行支付,处理支付结果
- (BOOL)application:(UIApplication *)application
openURL:(NSURL *)url
sourceApplication:(NSString *)sourceApplication
annotation:(id)annotation {
NSString *urlStr = [NSString stringWithFormat:@"%@",url];
if ([url.host isEqualToString:@"safepay"]) { //判断支付宝回调
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
//TY_Log(@"result = %@",resultDic);
//处理支付结果
}];
}else if ([sourceApplication isEqualToString:@"com.tencent.xin"] && [urlStr containsString:@"pay"]){ //判断微信回调
TYLLog(@"跳转微信支付处理支付方式结果");
return [WXApi handleOpenURL:url delegate:self];
}
return YES;
}
出现的问题及解决办法:
1)"Unknown type name ‘NSString‘ "或者"Unknown type name ‘NSData‘ "等不识别常见类的问题。
这是因为缺少Foundation类库和UIKit类库,支付宝Demo中之所以没有出现此错误,是因为在.pch文件中导入过这些类库
解决办法:只需要在出现错误的文件中导入这些类库即可
2)‘openssl/asn1.h‘ file not found
这是 openssl 文件夹头文件链接问题,只是把 openssl 文件夹拉进项目中,也可能出现这个问题。
解决办法:Targets->Build Settings->Header Search Path中添加1中建立的aliPaySDK文件夹的路径(拖拽此文件夹至输入框即可)
3)根据项目需求添加demo中ViewController中的代码 编译后可能会出下面错误:
"OBJC_CLASS$_Product", referenced from: objc-class-ref in ViewController.o
AlipaySDK的demo中将Product的定义写在了ViewControler.h中所致
解决办法:新建Product类,将ViewController中的代码拷贝过去即可。
结束
有微信支付需求的可以 点这里
如果这篇文章对您有些许帮助 请给我点个心吧。