您的位置:首页 > 移动开发

iOS APP接入支付宝SDK支付功能的实现(小白篇)

2015-07-13 16:45 921 查看
上篇说了微信支付,这篇说支付宝支付,支付宝的官方文档比较给力需要细细阅读以防多走弯路,一样的支付宝支付需要申请支付宝商户,然后生成对应的APP_ID,公钥,私钥之类的东西,支付宝的公私钥生成过程对新手来说比较麻烦,这个时候你可以查看网上的教程以及官方的文档,另外实在不行就问支付宝的技术客服,客服们都很细心很赞的。接下来说具体过程:

1.搞定商家(支付宝商家服务平台)的信息,申请的时候记得APP中导入的SDK是支付宝的快捷支付(现在可能是移动支付,反正不要网页支付)权限,然后设置公司账户的公私钥(实在不行就问客服,微信没有客服支付宝有一定要抓住机会,因为你是小白),之后把这些信息保存下来在工程里单独建一个plist文件或者.h文件来保存下,防止误删(因为支付宝的私钥很长)。然后,下载支付宝SDK。

2.支付宝的SDK导入过程坑比微信的要多,但是不要怕,解决方案网上的也多。下面按照报错过程说一下。

(1)导入支付宝所需要的类库,看自己的工程,如果有的就不要再导入了,依次是AlipaySDK.bundle, AlipaySDK.framework, libcrypto.a, libssl.a, SystemConfiguration.framework, QuartzCore.framework, libz.dylib, CoreText.framework, CoreTelephony.framework, Foundation.framework, CoreGraphics.framework,
UIKit.framework;这些类库单独建一个Frameworks文件夹放入不至于工程太乱。

(2)导入openssl,util文件夹和Order,APAuthV2Info类,这个时候就会出现一大堆红点,一个一个来;首先是base64类报错,cannot find interface decalation for “NSObject”

这个错的意思是识别不了NSObject,连最基本的类都识别不了,这说明没有导入UIKit和Fountion,同样的openssl_wrapper这个类中出现了很多的不能识别NSString,NSDate等都是这个原因,但是人家的demo里面为什么不会报错呢,因为人家的工程里地pch文件已经导入了这两个框架,解决办法就是要么你自己看哪个类需要就导入,要么就是也建一个pch文件导入这两个,建议后者不会的百度怎么创建pch文件。

(3)还剩最后一个红点rsa.h找不到openssl/asn1.h乍一看是不是又少导入了什么的文件,但是你会发现openssl文件夹和asn1.h都有,这个时候就是文件的路径有问题,需要在buildsettings的searchpaths里面修改路径,这个时候添加以下路径如图所示



这个路径的添加要看你的openssl的文件夹放在哪个目录文件夹下了,我的是放在了AliTest/AliPay_Vender/openssl,要根据自己的工程来写具体的路径。
(4)这个时候我新建的工程里已经没有红点了,但是自己的项目中还是有红点的,因为我工程里地base64和支付宝的base64冲突了,如果大家的工程里有了百度地图的sdk也会出现这种情况,我的解决办法是把自己的删了,然后牵扯到加密的地方给方法根据支付宝的base64做了一定的修改,百度地图的冲突网上有很多的教程大家可以自己搜下解决。总的来说不要怕这些红点,都会有解决的办法的,如果你实在不会可以问支付宝的客服。最怕自己说不会。
3.当SDK全部导入工程后,接下来就该配置基本的参数了,在你要支付的controller中导入对应的头文件如下
#import "Order.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>
#import "APAuthV2Info.h"
写要支付的方法
Product *product = [self.productList objectAtIndex:indexPath.row];

/*
*商户的唯一的parnter和seller。
*签约后,支付宝会为每个商户分配一个唯一的 parnter 和 seller。
*/

/*============================================================================*/
/*=======================需要填写商户app申请的===================================*/
/*============================================================================*/
NSString *partner = APP_PARTNER;//pid
NSString *seller = APP_SELLER;//公司账号
NSString *privateKey = APP_PRIVATEKEY;
/*============================================================================*/
/*============================================================================*/
/*============================================================================*/

//partner和seller获取失败,提示
if ([partner length] == 0 ||
[seller length] == 0 ||
[privateKey length] == 0)
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"缺少partner或者seller或者私钥。"
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
return;
}

/*
*生成订单信息及签名
*/
//将商品信息赋予AlixPayOrder的成员变量

Order *order = [[Order alloc] init];
order.partner = partner;
order.seller = seller;
NSDate *date = [NSDate date];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyyMMddhhmmss"];
NSString *datestr = [formatter stringFromDate:date];
order.tradeNO = datestr; //订单ID(由商家自行制定)
order.productName = @"拉拉了"; //商品标题
order.productDescription = product.body; //商品描述
order.amount = @"0.01"; //商品价格
order.notifyURL =  @"http://www.zhifubaoapp.com/orderSDKPayReturn.html"; //回调URL

order.service = @"mobile.securitypay.pay";
order.paymentType = @"1";
order.inputCharset = @"utf-8";
order.itBPay = @"30m";
order.showUrl = @"m.alipay.com";

//应用注册scheme,在AlixPayDemo-Info.plist定义URL types
NSString *appScheme = @"alisdkdemo";

//将商品信息拼接成字符串
NSString *orderSpec = [order description];
NSLog(@"orderSpec = %@",orderSpec);

//获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
id<DataSigner> signer = CreateRSADataSigner(privateKey);
NSString *signedString = [signer signString:orderSpec];

//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString *orderString = nil;
if (signedString != nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, @"RSA"];

[[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
NSLog(@"reslut = %@",resultDic);
}];
}
订单的支付参数需要根据自己的项目来设置,一定要看好。回调页面是需要后台写好给你的一个连接用来支付成功后支付宝去通知后台告诉结果了。
4.支付完成后我们需要获取支付结果,回调页面是需要后台写好给你的一个连接用来支付成功后支付宝去通知后台告诉结果了,但是前端呢,支付完成后的回调方法中result是支付的结果。当用户安装了支付宝的时候,支付完成的回调方法是APPDelegate中的
- (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) {
NSLog(@"result = %@",resultDic);
NSString *resultStr = resultDic[@"result"];
}];

}

return YES;
}


可以在支付完成的时候写一个通知去刷新数据,当用户没有安装支付宝的时候,支付宝会弹出一个极简的H5页面,然后支付成功后会在回调支付类中那个支付方法里支付的block(不是AppDelegate里那个);
至此基本的支付宝支付已经接入成功,更深的操作以及项目的支付流程需要自己慢慢琢磨,不要害怕未知的事物。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: