1.iOS 集成流程
主要按照官方文档设置即可:
1:关于openssl/asn.h file not found的问题
可能会遇到这个问题:
#include <openssl/asn.h> 找不到 也就是路径没有引入
解决方法如下:
在xcode 的build setting --> header searchPaths里 添加支付宝openssl/asn.h的文件路径
格式: $(PROJECT_DIR)/文件夹路径(可以直接选中openssl,show in finder),注意:路径为OpenSSL上层文件夹
支付宝配置文件:libcrypto.a libssl.a openssl util 四个文件,一个都不能少
2.支付宝sdk使用流程
第一步:需要服务器端配置,步骤如下:
/* 步骤: 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处理
坑点:如果服务端没有对订单字符串进行处理,需要移动端进行处理,如果不处理,支付宝会报错,系统繁忙
1、需要在URL Scheme进行设置:
TARGETS --> Info --> URL Types -->URL Schemes
2、需要设置头文件路径:点击“Build Settings”选项卡,在搜索框中,以关键字“search”搜索,对“Header Search Paths”增加头文件路径:$(SRCROOT)/项目名称。如果头文件信息已增加,可不必再增加。
3、官方的demo中会报一个错误,私钥为空
检查私钥的正确性后,如果还不能解决,尝试使用以下方法修改:
对私钥样式的拼接中进行修改
-----BEGIN PRIVATE KEY-----和-----END PRIVATE KEY-----
修改成
-----BEGIN RSA PRIVATE KEY-----和-----END RSA PRIVATE KEY-----
4、支付宝打开失败,ALI40247错误
这个错误的原因一般是支付宝的应用配置有问题,解决方法:
4.1、检查使用的APPID 私钥是否正确
4.2、检查支付宝中应用是否添加APP支付功能
4.3、检查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); } }
其余的问题都还没有遇到
来源:https://www.cnblogs.com/songyan-Z221/p/10523898.html