ios集成支付宝

前提是你 提交于 2020-04-04 20:30:24

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);
}
}        

其余的问题都还没有遇到

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!