傲视苍穹iOS《Objective-C》VIP专题iOS 开发每天分享优质文章iOS 开发

iOS集成支付宝和遇到的坑

2016-09-23  本文已影响0人  喊我超哥啊

首先导入支付宝SDK 和依赖库


98B035F7-6F66-4770-A8BB-F7E04CFFF4F1.png

libc++.tbd
libz.tbd
CoreMotion.framework
CFNetwork.framework
Foundation.framework
UIKit.framework
CoreGraphics.framework
CoreText.framework
QuartzCore.framework
CoreTelephony.framework
SystemConfiguration.framework

导入之后编译会报错openssl/asn1.h


6F957E50-107D-4D54-A3A0-8E92A62CF0C9.png

这是一个神奇的大坑,好多人卡在这里
解决方法:Targets -> Build Settings 下的 Header Search Paths。添加如下目录 "$(SRCROOT)/项目名称/支付宝sdk所在文件夹的绝对地址"

当使用xcode7的时候可能会报错


41AB3AB2-8921-4478-A575-63C96557D1D4.png

linker command failed with exit code 1 (use -v to see invocation)

这时我们找到Bitcode改为NO xcode默认为YES


259F6798-19BE-400D-8EF1-599FF154AC4D.png

然后再编译,ok没报错。 已经成功了一大半。

填上支付宝的信息,以及订单信息。


EF77CD74-F77C-4003-99F9-E40850270F76.png
/*
     *点击获取product实例并初始化订单信息
     */
    /*
     *商户唯一的partner 和seller
     签约后会给商户分配唯一的partner 和seller
     */
    //填写用户申请的
    NSString *partner=@"";
    NSString *seller=@"";
    NSString *privateKey=@"";//下载的公匙私匙文件
    
    //partner 和seller获取失败
    if([partner length]==0||[seller length]==0||[privateKey length]==0)
    {
        UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"提示" message:@"缺少partner或者seller" delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles: nil];
        [alert show];
        return;
    }
    //生成订单信息及签名
    //将商品信息赋予ALixpayOrder的成员变量
    UserModel *Model=[[UserModel alloc]init];
    Order *order=[[Order alloc]init];
    order.partner=partner;
    order.seller=seller;
    //    order.tradeNO=Model.oderNumber;//订单号
    //    order.productName=Model.orderName;//商品名称
    //    order.productDescription=Model.orderDescri;//商品描述
    //    order.amount=Model.orderPrice;//商品价格
    order.tradeNO=@"12398998d66522416565";
    order.productName=@"ipone6s玫瑰金";
    order.productDescription=@"但是";
    order.amount=@"0.01";
    order.notifyURL=@"http://www.xxx.com";//回调url
    //下面这些参数都是固定的
    order.service=@"mobile.securitypay.pay";
    order.paymentType=@"1";
    order.inputCharset=@"utf-8";
    order.itBPay=@"30m";
    order.showUrl=@"m.alipay.com";
    
    //用户注册scheme,在info.plist 定义URL types 用于快捷支付成功后重新唤起商户应用
    NSString *appSheme=@"chaoge";
    
    //将商品信息拼接成字符串
    NSString *orderFormat=[order description];
    
    //获取私匙并将商户信息签名,外部商户可以根据情况存放私匙和签名,只要遵循RSA签名规范将签名字符串base64编码和UrlEncode
    id<DataSigner>signer=CreateRSADataSigner(privateKey);
    
    NSString *signString=[signer signString:orderFormat];
    
    //将签名成功字符格式化为订单字符串,请严格按照格式
    NSString *orderString=nil;
    
    if(signString!=nil)
    {
        orderString=[NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",orderFormat,signString,@"RSA"];
        NSLog(@"%@",orderString);
        [[AlipaySDK defaultService]payOrder:orderString fromScheme:appSheme callback:^(NSDictionary *resultDic) {
            NSLog(@"------%@",resultDic);
            NSString *msg=[resultDic objectForKey:@"result"];
            if(msg.length==0)
            {
                msg=@"支付失败";
            }else{
                msg=@"支付成功";
            }
            UIAlertView *alert=[[UIAlertView alloc]initWithTitle:@"提示" message:msg delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:nil];
            [alert show];
        }];
    }

第二个大坑来了

A024ADC6-503F-481C-A40E-A085B9E8EF97.png
Undefined symbols for architecture arm64:
"_CreateRSADataSigner", referenced from:
-[ViewController payment:] in ViewController.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)报错。
C++混编。
这时候我们只需要把写对应支付宝操作地方的类文件后缀.m改为.mm就行了
F6F93805-EBB8-4FD8-839E-E55E14424716.png 。
然后运行。完美。
Demo地址:https://github.com/ZhichaoZhan/AlipayDemo
上一篇下一篇

猜你喜欢

热点阅读