iOS-支付宝支付

作者: BestVast | 来源:发表于2016-04-11 18:00 被阅读1260次

1、导入支付宝的SDK


支付宝SDK.png

2、添加需要的framework

 libc++.tbd
 libz.tbd
 SystemConfiguration.framework
 CoreTelephony.framework
 QuartzCore.framework
 CoreText.framework
 CoreGraphics.framework
 UIKit.framework
 Foundation.framework
 CFNetwork.framework
 CoreMotion.framework
支付宝依赖库.png

3、在info里面的URL Types的配置


url scheme.png

4、在plist里面添加白名单

<key>LSApplicationQueriesSchemes</key>
    <array>
        <string>alipay</string>
        <string>alipayshare</string>
    </array>

5、注意事项,添加配置(我自己做支付宝遇到的问题)
(1)当值做了以上两步就运行程序的时候会报错


支付宝问题1.png

解决办法是:在报错的文件添加 #import <Foundation/Foundation.h>

(2) 这个错误,就是找不到支付宝文件夹里面的一些文件


支付宝问题2.png

解决办法如下:


支付宝注意2.png

6、在AppDelegate.m文件中添加的代码

#import <AlipaySDK/AlipaySDK.h>
- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<NSString *,id> *)options
{
    //如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
            NSLog(@"result = %@",resultDic);
        }];
    }
    if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
        
        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}
- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation
{
    
    //如果极简开发包不可用,会跳转支付宝钱包进行支付,需要将支付宝钱包的支付结果回传给开发包
    if ([url.host isEqualToString:@"safepay"]) {
        [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
            NSLog(@"result = %@",resultDic);
        }];
    }
    if ([url.host isEqualToString:@"platformapi"]){//支付宝钱包快登授权返回authCode
        
        [[AlipaySDK defaultService] processAuthResult:url standbyCallback:^(NSDictionary *resultDic) {
            //【由于在跳转支付宝客户端支付的过程中,商户app在后台很可能被系统kill了,所以pay接口的callback就会失效,请商户对standbyCallback返回的回调结果进行处理,就是在这个方法里面处理跟callback一样的逻辑】
            NSLog(@"result = %@",resultDic);
        }];
    }
    return YES;
}

7、支付时需要的代码
//支付宝

#import "Order.h"
#import "APAuthV2Info.h"
#import "DataSigner.h"
#import <AlipaySDK/AlipaySDK.h>

- (void)alipay
{
    NSString *partner = ALIPAY_PARTNER;  //支付宝商户id-账号id
    NSString *seller = ALIPAY_SELLER;
    NSString *privateKey = ALIPAY_PRIVATEKEY;  //私钥
    /*
     *生成订单信息及签名
     */
    //将商品信息赋予AlixPayOrder的成员变量
    Order *order = [[Order alloc] init];
    order.partner = partner;
    order.seller = seller;
    order.tradeNO = [self generateTradeNO]; //订单ID(由商家自行制定)
    order.productName = @"支付宝测试"; //商品标题
    order.productDescription = @"支付宝支付给安良浩"; //商品描述
    order.amount = [NSString stringWithFormat:@"%.2f", 0.02]; //商品价格
    order.notifyURL =  @"http://www.xiaheng666.com"; //回调URL
    
    order.service = @"mobile.securitypay.pay";
    order.paymentType = @"1";
    order.inputCharset = @"utf-8";
    order.itBPay = @"30m";
    order.showUrl = @"m.alipay.com";
    
    //应用注册scheme,在AlixPayDemo-Info.plist定义URL types
    NSString *appScheme = @“AlipayProject";  //需要和URL Types统一
    
    //将商品信息拼接成字符串
    NSString *orderSpec = [order description];
    
    //获取私钥并将商户信息签名,外部商户可以根据情况存放私钥和签名,只需要遵循RSA签名规范,并将签名字符串base64编码和UrlEncode
    id<DataSigner> signer = CreateRSADataSigner(privateKey);
    NSString *signedString = [signer signString:orderSpec];
    
    //将签名成功字符串格式化为订单字符串,请严格按照该格式
    NSString *orderString = nil;
    if (signedString != nil) {
        orderString = [NSString stringWithFormat:@"%@&sign=\"%@\"&sign_type=\"%@\"",
                       orderSpec, signedString, @"RSA"];
        
        [[AlipaySDK defaultService] payOrder:orderString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
            //【callback处理支付结果】
            NSLog(@"reslut = %@",resultDic);
        }];
    }
}
#pragma mark   ==============产生随机订单号==============
- (NSString *)generateTradeNO
{
    static int kNumber = 15;
    
    NSString *sourceStr = @"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    NSMutableString *resultStr = [[NSMutableString alloc] init];
    srand((unsigned)time(0));
    for (int i = 0; i < kNumber; i++)
    {
        unsigned index = rand() % [sourceStr length];
        NSString *oneStr = [sourceStr substringWithRange:NSMakeRange(index, 1)];
        [resultStr appendString:oneStr];
    }
    return resultStr;
}

8、后台返回支付数据进行支付

- (void)alipay
{
    NSString *appScheme = @"xxxxxxxx";
    [[AlipaySDK defaultService] payOrder:_dataDict[@"data"] fromScheme:appScheme callback:^(NSDictionary *resultDic) {
        //【callback处理支付结果】
        NSLog(@"reslut = %@",resultDic);
        if ([resultDic[@"resultStatus"] isEqual:@"9000"]) {
             [self shareAlertControllerWithMessage:@"支付成功"];
        }
        else if ([resultDic[@"resultStatus"] isEqual:@"8000"]) {
            [self shareAlertControllerWithMessage:@"正在处理中"];
        }
        else if ([resultDic[@"resultStatus"] isEqual:@"4000"]) {
            [self shareAlertControllerWithMessage:@"订单支付失败"];
        }
        else if ([resultDic[@"resultStatus"] isEqual:@"6001"]) {
            [self shareAlertControllerWithMessage:@"您已中途取消支付"];
        }
        else if ([resultDic[@"resultStatus"] isEqual:@"6002"]) {
            [self shareAlertControllerWithMessage:@"您的网络连接出错"];
        }
        else {
            [self shareAlertControllerWithMessage:@"支付失败"];
        }
    }];
}
//弹出框
- (void)shareAlertControllerWithMessage:(NSString *)message
{
    NSString *title = [NSString stringWithFormat:@"提示:%@", message];
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:title message:@"" preferredStyle:UIAlertControllerStyleAlert];
    
    UIAlertAction *action = [UIAlertAction actionWithTitle:@"好的" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
       
        [alert dismissViewControllerAnimated:YES completion:nil];
        
    }];
    [alert addAction:action];
    [self presentViewController:alert animated:NO completion:nil];
}

相关文章

  • iOS- 收藏 (专题文章分类)

    支付宝/ 微信 / 银联 1. iOS 支付宝详细集成总结2. 支付宝3. iOS-微信支付和支付宝支付4. ...

  • iOS-一句话仿秒拍、支付宝“更多”长按移动View,动态动画

    iOS-一句话仿秒拍、支付宝“更多”长按移动View,动态动画 最近,项目里面有个需求就是仿秒拍、支付宝“更多”长...

  • 功能博客整理

    1.类似支付宝后台语音播报 ``` http://lumengru.com/2017/06/23/iOS-%E5%...

  • iOS-支付宝支付

    1、导入支付宝的SDK 2、添加需要的framework 3、在info里面的URL Types的配置 4、在pl...

  • iOS-接入支付宝支付(2)

    App支付iOS集成流程详解URL地址

  • iOS-接入支付宝支付(1)

    一、开发前的准备 第一步:创建应用 开发者使用支付宝账号登录开放平台(需实名认证的支付宝账号),并创建应用。 第二...

  • Android支付宝支付集成

    Android支付宝支付 标签: android Android支付宝支付使用的流程介绍 支付宝流程介绍 支付宝流...

  • ## [iOS 支付宝支付]

    [iOS开发系列-支付宝支付] 概述 开发中支付通常都会集成支付宝支付,下面讲解支付宝的整体流程。 集成支付宝支付...

  • 三方支付流程总结

    支付宝支付和微信支付 支付宝支付流程图: 支付宝支付: 当我们选择点击了支付宝支付按钮开始 1.app选择商品进行...

  • iOS支付

    支付宝支付 支付宝支付支付宝补充 微信支付 微信支付 内购 iOS开发 内购流程

网友评论

  • 34e7190e77f7: 请问这个回调的URL 是什么?
    order.notifyURL = @"http://www.xiaheng666.com&quot;; //回调URL
    34e7190e77f7:@风_雨 谢谢
    BestVast:@晓天别趴下 这个是支付宝需要的回调网址,会把订单信息发送到这个网址上,同你确定订单信息,这个在支付宝的开发文档上有解释
  • Sean_Shi:搞个支付宝 添加这么多不需要的白名单
  • jackiehoo:这几本照搬支付宝的集成啊,客户端拿到私钥不安全啊,API返回更好
    BestVast:@jackiehoo 谢谢,希望多多指点一下
    jackiehoo:嗯。私钥是是保密的,公钥对外的。私钥尽量少暴露出去,服务器保护更容易掌控,客户端暴露风险大,减少被截取的风险
    BestVast:@jackiehoo 多谢指点,这个订单信息如果是后台返回的情况我就不需要本地存储私钥了吧
  • 一蓝秋水:我喜欢很有用。简单明了

本文标题:iOS-支付宝支付

本文链接:https://www.haomeiwen.com/subject/nxuilttx.html