标签:
#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
标签:
原文地址:http://www.cnblogs.com/dios/p/4518403.html