码迷,mamicode.com
首页 > 其他好文 > 详细

支付宝Block 支付跳转

时间:2015-05-20 23:41:01      阅读:199      评论:0      收藏:0      [点我收藏+]

标签:

#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

  

支付宝Block 支付跳转

标签:

原文地址:http://www.cnblogs.com/dios/p/4518403.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!