主要按照官方文档设置便可:ios
1:关于openssl/asn.h file not found的问题express
可能会遇到这个问题:数组
#include <openssl/asn.h> 找不到 也就是路径没有引入xcode
解决方法以下:服务器
在xcode 的build setting --> header searchPaths里 添加支付宝openssl/asn.h的文件路径app
格式: $(PROJECT_DIR)/文件夹路径(能够直接选中openssl,show in finder),注意:路径为OpenSSL上层文件夹函数
支付宝配置文件:libcrypto.a libssl.a openssl util 四个文件,一个都不能少测试
第一步:须要服务器端配置,步骤以下:ui
/* 步骤: 1.设置商品信息 2.将商品信息按要求拼接成字符串 3.用私钥将商品信息签名 . 4.将加签成功后的字符串格式化成订单字符串,返回给客户端 5.客户端获取后台返回的订单字符串,调用支付宝支付接口发起支付请求 6.处理支付宝返回的支付结果 前4步须要在服务端进行处理,客户端只需获取字符串调用支付接口发送支付请求
*/
//生成订单信息及签名 //将商品信息赋予AlixPayOrder的成员变量 Order* order = [Order new]; // NOTE: app_id设置 order.app_id = appID; // NOTE: 支付接口名称 order.method = @"alipay.trade.app.pay"; // NOTE: 参数编码格式 order.charset = @"utf-8"; // NOTE: 当前时间点 NSDateFormatter* formatter = [NSDateFormatter new]; [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"]; order.timestamp = [formatter stringFromDate:[NSDate date]]; // NOTE: 支付版本 order.version = @"1.0"; // NOTE: sign_type设置 order.sign_type = @"RSA"; // NOTE: 商品数据 /*商品信息======================= total_amount:商品价格(支付金额) out_trade_no:订单ID(商户订单号)--这个地方用了随机的。正常状况下,服务器端会给! seller_id:收款商户号 timeout_express:超时时间设置 subject:主题(显示的数据,本身写,不影响支付) body:内容对一笔交易的具体描述信息(本身写就能够) ===================================*/ order.biz_content = [BizContent new]; order.biz_content.body = @"abc"; order.biz_content.subject = @"1"; order.biz_content.out_trade_no = [self generateTradeNO]; //订单ID(由商家自行制定) order.biz_content.timeout_express = @"30m"; //超时时间设置 order.biz_content.total_amount = [NSString stringWithFormat:@"%.2f", 0.01]; //商品价格 order.biz_content.seller_id =@"收款商户号";// 收款商户号 /*将订单信息拼接成字符串========================================= 订单信息串中的各个value是否encode 非encode订单信息串,用于生成签名 encode订单信息串 + 签名,用于最终的支付请求订单信息串===================================*/ NSString *orderInfo = [order orderInfoEncoded:NO]; NSString *orderInfoEncoded = [order orderInfoEncoded:YES]; /*
使用类CreateRSADataSigner(获取私钥),
调用signString签名函数作签名(并将商户信息签名)须要遵循RSA签名规范,
并将签名字符串base64编码和UrlEncode================================*/ id<DataSigner> signer = CreateRSADataSigner(privateKey); NSString *signedString = [signer signString:orderInfo]; // NOTE: 若是加签成功,则继续执行支付 if (signedString != nil) { NSString *appScheme = @"alisdkdemo";//url types设置 /*把签名结果赋值给参数sign,并把sign加入以前的待签名数组中,此时获得的即是要请求给支付宝的所有数据(订单字符串)。*/ NSString *orderString = [NSString stringWithFormat:@"%@&sign=%@", orderInfoEncoded, signedString]; NSLog(@"orderString%@",orderString);
注意点:须要对订单字符串进行base64和urlEncode处理编码
坑点:若是服务端没有对订单字符串进行处理,须要移动端进行处理,若是不处理,支付宝会报错,系统繁忙
一、须要在URL Scheme进行设置:
TARGETS --> Info --> URL Types -->URL Schemes
二、须要设置头文件路径:点击“Build Settings”选项卡,在搜索框中,以关键字“search”搜索,对“Header Search Paths”增长头文件路径:$(SRCROOT)/项目名称。若是头文件信息已增长,可没必要再增长。
三、官方的demo中会报一个错误,私钥为空
检查私钥的正确性后,若是还不能解决,尝试使用如下方法修改:
对私钥样式的拼接中进行修改
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----
修改为
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----
四、支付宝打开失败,ALI40247错误
这个错误的缘由通常是支付宝的应用配置有问题,解决方法:
4.一、检查使用的APPID 私钥是否正确
4.二、检查支付宝中应用是否添加APP支付功能
4.三、检查APP支付功能是否已经签约
若是以上都没问题,能够在支付宝删除应用,再从新建立一个新应用进行测试
客户端调用支付宝支付
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey,id> *)options { // 支付宝支付时会走appdelegate里面的方法 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standByCallback:^(NSDictionary *resultDic){ NSLog(@"%@", resultDic); }] return YES; }
若是客户端没有安装支付宝,那么支付时会走调用支付方法的那个地方
- (void)payButtonClick:(UIButton *)button { NSString *appScheme = @"alipaydemo.com"; // orderString 就是订单字符串,须要从后台获取,前提是后台已经处理完成(base64和urlEncode) [[AlipaySDK defaultService] payOrder:OrderString fromeScheme:appScheme callback:^(NSDictionary *resultDic){ // 若是客户端没有安装支付宝,支付时会用网页端的支付宝进行支付,完成后会调用这里的callback NSLog(@"%@", resultDic); } }
其他的问题都尚未遇到