支付宝Block 支付跳转

#import <Foundation/Foundation.h>
@class Order;

typedef void (^ResultBlock)(Order *resultOrder);

@interface AlipayService : NSObject

+(instancetype)shareService;

/**
 *  支付动作,跳转到支付客户端
 *
 *  @param sourceOrder 支付定单
 *  @param resultBlock 结果定单
 */
-(void)payWithOrder:(Order *)sourceOrder resultBlock:(ResultBlock)resultBlock;

/**
 *  处理结果的URL
 */
-(void)handleURL:(NSURL *)url;
@end
#import "AlipayService.h"
#import "Order.h"
#import <UIKit/UIKit.h>

@interface AlipayService(){
    ResultBlock _resultBlock;//结果回调block
}

@end

@implementation AlipayService

+(instancetype)shareService{
    return [[self alloc] init];
}

+(instancetype)allocWithZone:(struct _NSZone *)zone{
    static AlipayService *service = nil;
    static dispatch_once_t onceToken;
#warning 线程安全
    dispatch_once(&onceToken, ^{
        service = [super allocWithZone:zone];
    });

    return service;
}

-(void)payWithOrder:(Order *)sourceOrder resultBlock:(ResultBlock)resultBlock{
    //1.先存储结果block
    _resultBlock = resultBlock;

    //2.支付
    //2.把定单属性拼接成orderDesc=124234&amount=1234
#warning 参数在网络的传输入过程都是字符串
    NSString *params = [sourceOrder query];
    NSLog(@"%@",params);

    NSString *alipayURLStr = [@"alipay2://payment?" stringByAppendingString:params];

#warning URL?号后面不能有中文,要进行URL Encode
    alipayURLStr = [alipayURLStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //跳转到支付宝客户端
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:alipayURLStr]];
}

-(void)handleURL:(NSURL *)url{
    //作处理
    NSLog(@"%s 处理支付结果",__func__);

    //url后面参数封装成一个结果Order
    //1.截取url的参数
    NSString *query = [url query];
    query = [query stringByReplacingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //转模型
    Order *resultOrder = [Order orderWithQuery:query];

    //回调block
    if (_resultBlock) {
        _resultBlock(resultOrder);
    }

}
@end

  

#import "AppDelegate.h"
#import "AlipayService.h"

@interface AppDelegate ()

@end

@implementation AppDelegate

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
    // Override point for customization after application launch.
    return YES;
}

-(BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation{
    NSLog(@"支付结果%@",url);
    [[AlipayService shareService] handleURL:url];
    return YES;
}

@end

  

/**
 *
 * 定单模型
 */
#import <Foundation/Foundation.h>

@interface Order : NSObject

/**
 * 定单的描述 (iWatch)
 */
@property (nonatomic,copy)NSString *orderDesc ;

/**
 * 支付金额
 */
@property (nonatomic,copy)NSString *amount ;

/**
 * 定单编号 (客户端自己定义) 20150426130323
 */
@property (nonatomic,copy)NSString *orderNum ;

/**
 * 定单状态 1:代表支付成功 0: 支付失败
 */
@property (nonatomic,copy)NSString *status ;

/**
* 支付类型; 1.支付 2.退款
*/
@property (nonatomic,copy)NSString *paymentType ;

/**
 *  回调到本应用的URL
 */
@property (nonatomic,copy)NSString *appCallbackURL ;

/**
 * query 是URL 问号?后面参数
 * 把定单属性拼接成orderDesc=124234&amount=1234
 */
-(NSString *)query;

/**
 *  通过query返回一个Order模型
 *
 */
+(Order *)orderWithQuery:(NSString *)query;
@end

  

//
//  Order.m
//  B01_电商APP
//
//  Created by apple on 15/4/26.
//  Copyright (c) 2015年 itcast. All rights reserved.
//

#import "Order.h"

@implementation Order

-(NSString *)query{
    /*
    •orderDesc : 定单的描述 (iWatch)
    •amount : 支付金额
    •orderNum : 定单编号 (客户端自己定义) 20150426130323
    •status : 定单状态 1:代表支付成功 0:支付失败
    •paymentType : 支付类型: 1.支付 2.退款*/

    NSMutableString *strM = [NSMutableString string];

    [strM appendFormat:@"orderDesc=%@&",self.orderDesc];
    [strM appendFormat:@"amount=%@&",self.amount];
    [strM appendFormat:@"orderNum=%@&",self.orderNum];
    [strM appendFormat:@"status=%@&",self.status];
    [strM appendFormat:@"appCallbackURL=%@&",self.appCallbackURL];
    [strM appendFormat:@"paymentType=%@",self.paymentType];

    return [strM copy];

}

+(Order *)orderWithQuery:(NSString *)query{
    Order *order = [[Order alloc] init];
    //orderDesc=iWatch智能手表&amount=7000&orderNum=201523412342134&status=0&paymentType=1

    NSArray *arr = [query componentsSeparatedByString:@"&"];
    NSLog(@"%@",arr);
    for (NSString *item in arr) {
        //"orderDesc=iWatch\U667a\U80fd\U624b\U8868",
        NSArray *kv = [item componentsSeparatedByString:@"="];
        [order setValue:kv[1] forKey:kv[0]];
    }

    return order;
}

@end

  

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *productNameLabel;
@property (weak, nonatomic) IBOutlet UILabel *priceLabel;
/**
 *  支付结果
 */
@property (weak, nonatomic) IBOutlet UILabel *resultLabel;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (IBAction)payBtnClick {

    //支付定单

    //数据传输
    /*
    •orderDesc : 定单的描述 (iWatch)
    •amount : 支付金额
    •orderNum : 定单编号 (客户端自己定义) 20150426130323
    •status : 定单状态 1:代表支付成功 0:支付失败
    •paymentType : 支付类型: 1.支付 2.退款
     */

    //1.创建定单
    Order *order = [[Order alloc] init];
    order.orderDesc = self.productNameLabel.text;
    order.amount = self.priceLabel.text;
    order.orderNum = @"201523412342134";
    order.paymentType = @"1";
    order.status = @"0";

    //设置回调app的URL
    order.appCallbackURL = @"dsapp://result";

    //支付,并通过block返回结果
    [[AlipayService shareService] payWithOrder:order resultBlock:^(Order *resultOrder) {

        if ([resultOrder.status isEqualToString:@"1"]) {
            NSLog(@"支付成功");
            self.resultLabel.text = @"支付成功";
        }else{
            NSLog(@"失败");
            self.resultLabel.text = @"支付失败";
        }

    }];
}

#pragma mark 第一种支付方法
-(void)pay1{
    //支付定单

    //数据传输
    /*
     •orderDesc : 定单的描述 (iWatch)
     •amount : 支付金额
     •orderNum : 定单编号 (客户端自己定义) 20150426130323
     •status : 定单状态 1:代表支付成功 0:支付失败
     •paymentType : 支付类型: 1.支付 2.退款
     */

    //1.创建定单
    Order *order = [[Order alloc] init];
    order.orderDesc = self.productNameLabel.text;
    order.amount = self.priceLabel.text;
    order.orderNum = @"201523412342134";
    order.paymentType = @"1";
    order.status = @"0";

    //设置回调app的URL
    order.appCallbackURL = @"dsapp://result";

    //2.把定单属性拼接成orderDesc=124234&amount=1234
#warning 参数在网络的传输入过程都是字符串
    NSString *params = [order query];
    NSLog(@"%@",params);

    NSString *alipayURLStr = [@"alipay2://payment?" stringByAppendingString:params];

#warning URL?号后面不能有中文,要进行URL Encode
    alipayURLStr = [alipayURLStr stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

    //跳转到支付宝客户端
    [[UIApplication sharedApplication] openURL:[NSURL URLWithString:alipayURLStr]];
}

@end

  

时间: 2024-10-21 02:27:57

支付宝Block 支付跳转的相关文章

支付宝移动支付之IOSApp调用支付宝钱包

最近客户提出要开发一个IOS上的app作为访问他们网站的途径之一,为什么说之一呢,因为目前PC和Mobile这两个站目前都已经上线了. 所以问题就简单了,我们只需要把mobile站UI修改一下,然后在根据客户的新需求修改下程序,之后把这个站套个IOS的壳子就可以了. 那么问题来了,我们的mobile支付的时候调用的是支付宝的网页支付,这个页面是支付宝的,我们没办法修改,所以如果套在壳子里继续使用这种支付方式会有点不伦不类的感觉,所以我们就决定调用支付宝钱包,也就是支付宝客户端. 下面是我参考支付

ios--集成支付宝钱包支付iOS SDK的方法与经验

文/胖花花(简书作者)原文链接:http://www.jianshu.com/p/fe56e122663e著作权归作者所有,转载请联系作者获得授权,并标注“简书作者”. 没想到,支付宝的SDK是我目前用过的所有第三方SDK中最难用的一个了. 下载 首先,你要想找到这个SDK,都得费点功夫.现在的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 “请点此下载集成开发包” Baidu和Googlep排在前面的支付宝开放平台,里面的SDK已经是2年前的版本了,而且还不支持64位架构. 文档 压缩

集成支付宝钱包支付iOS SDK的方法与经验

没想到,支付宝的SDK是我目前用过的所有第三方SDK中最难用的一个了. 下载 首先,你要想找到这个SDK,都得费点功夫.现在的SDK改名叫移动支付集成开发包了,下载页面在 这里 的 "请点此下载集成开发包" Baidu和Googlep排在前面的支付宝开放平台,里面的SDK已经是2年前的版本了,而且还不支持64位架构. 文档 压缩包里有两个相关文档 :<支付宝钱包支付接口开发包2.0标准版.pdf><支付宝钱包支付接口开发包2.0标准版接入与使用规则.pdf>iO

支付宝H5支付demo

支付宝H5支付 首先我们必须注册一个支付宝应用(本案例就直接用支付宝的沙箱环境,这个沙箱也就是支付宝提供给开发者的一个测试环境) 登录地址:https://open.alipay.com/platform/home.htm 1.怎么注册一个支付宝应用?看图(至于应用里面需要的资料你就跟着填就ok了,我就不多讲了,关于公钥秘钥这些,支付宝也有它自己的工具自动生成) 2.怎么获取沙箱环境?(看图) 就这样,支付宝的基本配置我们都能get到了,下面开始写代码吧! 3.思路描述 支付宝的h5支付比微信的

支付宝wap支付调起客户端

https://mclient.alipay.com/home/exterfaceAssign.htm?alipay_exterface_invoke_assign_client_ip=183.15.177.39 &body=%e6%b5%8b%e8%af%95%e5%85%85%e5%80%bc%e8%ae%a2%e5%8d%95 &subject=%e6%b5%8b%e8%af%95%e5%85%85%e5%80%bc%e8%ae%a2%e5%8d%95 &sign_type=

2分钟快速集成支付宝快捷支付

本文介绍了iOS快速集成支付宝支付的方法,本文中介绍的方法是经过一次封装,因此配置完成之后调用仅需一行代码即可支付宝支付,非常的方便,希望大家喜欢. 我只是根据官方的文档,对支付宝的SDK做了进一步封装,其中密钥的生成很简单,需要看官方的文档,官方的文档我在工程附件目录里也有一份,如果需要马上集成,没工夫研究的话,可以大致看一下密钥的生成即可,其他的配置我会在下面进行讨论. 要在iOS应用里集成支付宝支付,需要公司和支付宝签约,然后生成相应的密钥.密钥的生成支付宝的开发文档里已经说的非常清楚了,

支付宝在线支付接口开发教程

1.什么是第三方支付 所谓第三方支付,就是一些和各大银行签约.并具备一定实力和信誉保障的第三方独立机构提供的交易支持平台.在通过第三方支付平台的交易中,买方选购商品后,使用第三方平台提供的账户进行货款支付,由第三方通知卖家货款到达. 目前提供第三方支付的机构很多,常见的有支付宝.财付通.快钱.网银在线.易宝支付.云网等各大支付平台.网站如果需要实现第三方支付首先应该向第三方支付平台申请一个账号并签署协议,协议生效后第三方支付平台将为其开通在线支付功能,通过程序将接口集成到网站中. 为什么要使用第

支付宝WAP支付接口开发

支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些时候打算把测试代码整理好放到Github上. 1. 开发前准备 到官网了解此接口的信息,下载样例代码(只有ASP.NET和PHP)以便随时参考. 一个通过实名认证的企业支付宝账号,并申请开通手机WAP支付功能,我的测试账号是拿公司的,申请流程不清楚,官网有说怎么申请,各位各显神通吧. 公网域名和no

iOS开发:2分钟快速集成支付宝快捷支付

?这篇文章介绍了iOS快速集成支付宝支付的方法,这篇文章中介绍的方法是通过一次封装,因此配备完结今后调用仅需一行代码即可支付宝支付,非常的便当,希望我们喜欢. 我仅仅根据官方的文档,对支付宝的SDK做了进一步封装,其间密钥的生成很简略,需要看官方的文档,官方的文档我在工程附件目录里也有一份,假设需要立刻集成,没工夫研讨的话,可以大致看一下密钥的生成即可,其他的配备我会在下面进行谈论. 要在iOS运用里集成支付宝支付,需要公司和支付宝签约,然后生成相应的密钥.密钥的生成支付宝的开发文档里现已说的非