第一次写博客有点小紧张啊,由于自己工作时间也不长,每天工作完都会记录一下这一天工作中遇到的各种问题和解决的方法,今天有朋友问我有关集成支付宝SDK的一些问题,就想到写一篇文章以避免和我一样的新人去填同一个坑。好了,废话就不多说了,进入正题吧。
第一步:看开发文档,下载App支付DEMO&SDK(蚂蚁金服开放平台 - 文档中心)
这就没有什么可多说的了,开发文档里每一步都介绍的很详细,我就来说一下这里我踩过的一些坑吧。
1.把这些文件拖到自己的工程里,并配置好工程,当你command+b编译时,你会发现瞬间红了一片。
解决办法:在pch文件里导入这两个头文件就可以了。
#import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
2.'openssl/asn1.h'file not found错误
解决办法:在你的Xcode里的header search paths 里添加支付宝SDK(openssl的路径) 即 “Header Search Paths”只需要设置$(SRCROOT)/项目名称。
第二步:导入代码
这一步在开发文档和Demo里都有详细的代码和注释,但是在这里就出现了一个问题,私钥是放在本地还是服务器(推荐服务器),但也不可避免的有些时候只能在本地做签名。
1.私钥放在服务器,那就简单了,你们后台会把Order里要做签名的属性和签名后的sign都返回给你,你只要看着开发文档和Demo的代码去做就行了,看下代码吧。
Order*order = [[Order alloc]init];
order.inputCharset= [result valueForKey:@"_input_charset" defaultValue:@""];
order.body= [result valueForKey:@"body" defaultValue:@""];//商品描述
order.notifyURL=[result valueForKey:@"notify_url" defaultValue:@""];//回调URL
order.outTradeNO= [result valueForKey:@"out_trade_no" defaultValue:@""];
order.partner= [result valueForKey:@"partner" defaultValue:@""];
order.paymentType= [result valueForKey:@"payment_type" defaultValue:@""];
order.sellerID= [result valueForKey:@"seller_id" defaultValue:@""];
order.service= [result valueForKey:@"service" defaultValue:@""];
order.subject= [result valueForKey:@"subject" defaultValue:@""];//商品标题
order.totalFee= [NSString stringWithFormat:@"%.2f", [[resultvalueForKey:@"total_fee"defaultValue:@""]floatValue]];//商品价格
NSString*appScheme =@"Pay";
NSString*orderSpec = [order description];
NSString*signedString = [result valueForKey:@"sign" defaultValue:@""];//后台返回签名后的字符串
//将签名成功字符串格式化为订单字符串,请严格按照该格式
NSString*orderString =nil;
if(signedString !=nil) {
orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
orderSpec, signedString, [result valueForKey:@"sign_type"defaultValue:@""]];
[[AlipaySDK defaultService]payOrder:orderString fromScheme:appScheme callback:^
(NSDictionary*resultDic) {
}];
}
2.私钥放在本地,这就需要我们自己来做签名了这时后台就会把私钥发给你,如果是字符串直接拿来用就OK了,要是.pem文件你就需要用文本打开,然后把私钥复制到工程中。
//需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
NSString*privateKey =@"";
id signer =CreateRSADataSigner(privateKey);
NSString*signedString = [signersignString:orderInfo];
记得当时这里是需要改的。
说到这里我就说说今天朋友问的那个问题吧,他调起支付宝后一直提示的是“系统繁忙,请稍后再试”,并不像之前一样会提示错误的信息如:ALi64,然后我就让他打印了一下自己的order。
仔细看一下的话,你会发现有些属性的key和value的值是反的,然后我就去下载了最新的SDK看了下,这时你就会惊奇的发现一个问题。
在Order.m中format,return_url,notify_url,app_auth_token这4个属性的key和value被写反了,而且最新的SDK的Order的属性和之前版本也有了很大的区别,所以以上代码仅做参考。
另外值得说的一点就是,如果私钥是放在服务器的话,在测试的过程中报错为ALi64这类签名问题的时候,你可以在本地签名,看能不能成功。
ALi159这个错误说的是支付宝的支付金额只能到分。
第三步:回调
这一步就只需要看开发文档或Demo,将两个回调方法都写到AppDelegate.m里就可以了。