项目中用到了支付,之前也做过,不过时候到在做的时候又要查文档,感觉很麻烦,所以在这整理下具体的流程以及在集成过程中遇到的一些问题。
1.下载支付宝SDK,附上链接:
https://doc.open.alipay.com/doc2/detail.htm?treeId=54&articleId=104509&docType=1
2.将下载后的Demo中的这些文件导入到你的工程里面
在Build Phases选项卡的Link Binary With Libraries中,增加以下依赖:
注意:”AlipaySDK.framework”、”libcrypto.a”、”libssl.a”这三个依赖库最好也导入进去,中间需要配置
不过一般做项目的时候这个已经配置过,就不再累赘。
然后在Build Setting->Search Paths->Header Search Paths添加”$(SRCROOT)/aliPaySDK”
编译,没问题准备工作就OK了。出了问题仔细检查下是否哪里错误。
3.在你要进行支付的页面导入以下三个头文件
在你要进行支付的按钮事件中编写如下代码
#pragma mark - 支付宝支付
- (void)aliPay
{
//应用注册scheme,在Info.plist定义URL types
NSString *appScheme = @"aliPay12chu";
//订单字符串
NSString *orderString = [self getOrderInfoString];
//创建支付单例
[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
if ([resultDic[@"resultStatus"] intValue] == 9000) {
[Utility popWithString:@"充值成功" onView:appDelegate.window];
} else {
[Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
}
}];
}
/**
* 获取订单字符串
*/
- (NSString *)getOrderInfoString
{
//将商品信息赋予AlixPayOrder的成员变量,生成订单信息及签名
Order *order = [[Order alloc] init];
/*********************************支付四要素*********************************/
//商户在支付宝签约时,支付宝为商户分配的唯一标识号(以2088开头的16位纯数字)。
order.partner = self.alipayDictionary[@"partner"];
//卖家支付宝账号对应的支付宝唯一用户号(以2088开头的16位纯数字),订单支付金额将打入该账户,一个partner可以对应多个seller_id。
order.sellerID = self.alipayDictionary[@"seller_id"];
//商户网站商品对应的唯一订单号,订单ID(由商家自行制定)
order.outTradeNO = self.alipayDictionary[@"out_trade_no"];
//该笔订单的资金总额,单位为RMB(Yuan)。取值范围为[0.01,100000000.00],精确到小数点后两位。
order.totalFee = self.alipayDictionary[@"total_fee"];
/*********************************商品相关*********************************/
//商品的标题/交易标题/订单标题/订单关键字等。
order.subject = self.alipayDictionary[@"subject"];
//对一笔交易的具体描述信息。如果是多种商品,请将商品描述字符串累加传给body。
order.body = self.alipayDictionary[@"body"];
/*********************************其他必传参数*********************************/
//接口名称,固定为mobile.securitypay.pay。
order.service = self.alipayDictionary[@"service"];
//商户网站使用的编码格式,固定为utf-8。
order.inputCharset = self.alipayDictionary[@"_input_charset"];
//支付宝服务器主动通知商户网站里指定的页面http路径。
order.notifyURL = self.alipayDictionary[@"notify_url"];
/*********************************可选参数*********************************/
//商品购买
order.paymentType = self.alipayDictionary[@"payment_type"];
//设置未付款交易的超时时间,一旦超时,该笔交易就会自动被关闭
order.itBPay = @"30m";
//商品地址
order.showURL = @"m.alipay.com";
//将商品信息拼接成字符串
NSString *orderInfo = [order description];
//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
// id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [CreateRSADataSigner(privateKey) signString:orderInfo];
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
//订单字符串
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderInfo, signedString, self.alipayDictionary[@"sign_type"]];
return orderString;
} else { //签名为空
return nil;
}
}
支付宝支付的具体流程就是根据商户在支付宝注册的商户ID以及私钥等一系列参数按照一定规则生成订单字符串。再通过订单字符串与APPScheme通过支付对象完成整个支付的流程。以上的所有参数均由后台给出,APPScheme可自己定义,定义如下图
到这,网页支付就能完成。
以上情况是针对用户没安装支付宝直接在网页上进行付款的情况。
如果用户在支付宝钱包进行付款的话,还需要做以下操作:
在AppDelegate导入”AlipaySDK/AlipaySDK.h”头文件,并且添加下面两个方法
//9.0以上调用这个方法
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
//支付宝回调
if ([url.host isEqualToString:@"safepay"]) {
//这个是进程KILL掉之后也会调用,这个只是第一次授权回调,同时也会返回支付信息
[[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
if ([resultDic[@"resultStatus"] intValue] == 9000) {
//支付宝支付成功返回付款成功页面
[Utility popWithString:@"支付成功" onView:appDelegate.window];
//支付宝钱包无法返回APP,发送一个通知,到之前支付界面添加观察者,通知支付完成接下来该做的事情
[[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];
} else {
[Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
}
}];
//跳转支付宝钱包进行支付,处理支付结果
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
if ([resultDic[@"resultStatus"] intValue] == 9000) {
//支付宝支付成功返回付款成功页面
[Utility popWithString:@"支付成功" onView:appDelegate.window];
[[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];
} else {
[Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
}
}];
}
return YES;
}
//iOS9.0以下调用这个方法
-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
//支付宝回调
if ([url.host isEqualToString:@"safepay"]) {
[[AlipaySDK defaultService]processAuth_V2Result:url standbyCallback:^(NSDictionary *resultDic) {
if ([resultDic[@"resultStatus"] intValue] == 9000) {
//支付宝支付成功返回付款成功页面
[Utility popWithString:@"支付成功" onView:appDelegate.window];
[[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];
} else {
[Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
}
}];
[[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
if ([resultDic[@"resultStatus"] intValue] == 9000) {
//支付宝支付成功返回付款成功页面
[Utility popWithString:@"支付成功" onView:appDelegate.window];
[[NSNotificationCenter defaultCenter] postNotificationName:@"aliPaySuccess" object:nil];
} else {
[Utility popWithString:[resultDic objectForKey:@"memo"] onView:appDelegate.window];
}
}];
}
return YES ;
}
大功告成!!!!