iOS支付宝、微信、银联支付集成封装调用(下)

一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下:

这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的接口全部代码,显然并不是很合适,更何况,可能一个app并不止两个入口。所以封装还是很有必要的。

1.新建Model:-------后台返回支付方式的列表json

#import <Foundation/Foundation.h>

@interface IOAPayItemModel : NSObject

//name:代表是支付宝,微信,银联或者余额等
@property (nonatomic, copy) NSString *name;
//icon:代表是支付方式的图片
@property (nonatomic, copy) NSString *icon;
//code:代表支付方式的唯一标识
@property (nonatomic, copy) NSString *code;
//payType:代表支付类型(自己确定的)
@property (nonatomic, assign) NSInteger payType;
@end
#import "IOAPayItemModel.h"
@implementation IOAPayItemModel
@end

2.封装第三方支付接口以及回调接口-----直接上源代码----会有解释(相信大家的能力,肯定能看懂)

#import <Foundation/Foundation.h>
//支付宝SDK
#import <AlipaySDK/AlipaySDK.h>
//微信接口
#import <WXApi.h>
//银联接口
#import "UPPaymentControl.h"

/**
 枚举:列出第三方支付方式
 */
typedef NS_ENUM(NSInteger, PayType) {
 kPayTypeWXPay, // 微信支付
 kPayTypeALiPay, // 支付宝支付
 kPayTypeUNPay // 银联支付
};

/**
 IOAPayRequestModel:第三方支付需要的参数
 */
@interface IOAPayRequestModel: NSObject
@property (nonatomic, assign) PayType payType;

/**
 支付宝和银联-后台返回是字符串类型----支付宝和银联使用此方式
 */
@property (nonatomic, copy) NSString *payString;
@property (nonatomic, copy) NSString *appScheme; // 根据设置的paytype设置

/**
 微信-后台返回是字典类型--- 微信使用此方式
 */
@property (nonatomic, strong) NSDictionary *userInfo;
@end

/**
 第三方支付接口返回的数据---
 */
@interface IOAPayResponseModel: NSObject
@property (nonatomic, assign) PayType payType;

//result和userInfo信息判断支付结果--(支付成功、支付失败、支付取消等)
@property (nonatomic, assign) NSInteger result;
@property (nonatomic, strong) NSDictionary *userInfo;
@end

@interface IOAPayApi : NSObject

//支付返回的回调方法
@property (nonatomic, copy) void (^callback)(IOAPayResponseModel *response);

//支付请求model ----IOAPayRequestModel---第三方支付需要的参数
@property (nonatomic, strong) IOAPayRequestModel *payRequestModel;

//单例方法
+ (instancetype)defaultPayManager;

// 是否安装了客户端
- (BOOL)isPayAppInstalled:(PayType)payType;
// 支付
- (void)pay:(IOAPayRequestModel *)payRequestModel callback:(void (^)(IOAPayResponseModel *response))callback;

// 支付回调
- (void)payCallbackWithUrl:(NSURL *)url;
@end
#import "IOAPayApi.h"

@implementation IOAPayRequestModel

- (void)setPayType:(PayType)payType {
 _payType = payType;
 if (_payType == kPayTypeALiPay) {
 self.appScheme = @"IOAAlipaySDK";
 // 测试
// self.payString = @"alipay_sdk=1.0&app_id=2018012502067343&biz_content=%7B%22subject%22%3A%22%E6%94%AF%E4%BB%98%E5%AE%9D%E6%94%AF%E4%BB%98%22%2C%22out_trade_no%22%3A%222018032100007%22%2C%22total_amount%22%3A%220.01%22%2C%22product_code%22%3A%22QUICK_MSECURITY_PAY%22%2C%22timeout_express%22%3A%2210m%22%2C%22seller_id%22%3A%222088001065568658%22%7D&charset=UTF-8&format=json&method=alipay.trade.app.pay&notify_url=api.ioa365.net%2Fapp%2Fapi%2FPayment%2Falipay_notify&sign_type=RSA2&timestamp=2018-03-21+16%3A59%3A15&version=1.0&sign=SFyiWFqdkG98qarJFKfNjts8w2RS7ATwjCRyNnKYILDaVVFEnR%2F943QjK9WFaZgipx38rZuRf%2Bl4M74Hp2PO%2F%2F0ZfSKAntTU3DMLIVgt4YD42W1F2lOP3iXtkL5BHpPzt6YfDQueCz1zReeAWQXlyBDvvnjbJ9p67f2jt8jfqM6Enz6kWwY5cShyDD6iJQF0FKXdmSYA%2BiCO6IIHdiqKsRLHuBPb8lfSxJyY1%2FbaAUysIB3%2BiU6HWASUGadCVL769ivwHKwdjZQZUoFpjcfnneyZG3%2B4f%2FnlBrY1pKk3ZWy2UqpTtk0w0GofsF167dRz47J0lW7UufyM8uA%2BIhZ7Lw%3D%3D";

 return;
 }

 if (_payType == kPayTypeUNPay) {
 self.appScheme = @"UPPay";

 // 测试
// self.payString = @"559018436594292239101";

 return;
 }

 // 测试
// self.userInfo = @{
//     @"appid":@"wx66a3135d1354b23b",
//     @"noncestr":@"J8pJbaEg6AjDQ9kk",
//     @"partnerid":@"1497576612",
//     @"prepayid":@"wx20180321170621b3fbce61a20187009040",
//     @"result_code":@"SUCCESS",
//     @"return_code":@"SUCCESS",
//     @"return_msg":@"OK",
//     @"sign":@"29FFF7B63A71D3FB4C6866BDBC443F72",
//     @"timestamp":@"1521623180",
//     @"trade_type":@"APP",
//     };
}
@end

@implementation IOAPayResponseModel

@end

@interface IOAPayApi() <WXApiDelegate>

@end

@implementation IOAPayApi

//单例方法
static IOAPayApi *manager = nil;
+ (instancetype)defaultPayManager {
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
 manager = [IOAPayApi new];
 });
 return manager;
}

+ (instancetype)allocWithZone:(struct _NSZone *)zone {
 static dispatch_once_t onceToken;
 dispatch_once(&onceToken, ^{
 manager = [super allocWithZone:zone];
 });

 return manager;
}

//copy在底层 会调用copyWithZone:
- (instancetype)copyWithZone:(NSZone *)zone {
 return [[self class] defaultPayManager];
}
+ (instancetype)copyWithZone:(struct _NSZone *)zone {
 return [self defaultPayManager];
}
+ (instancetype)mutableCopyWithZone:(struct _NSZone *)zone {
 return [self defaultPayManager];
}
- (instancetype)mutableCopyWithZone:(NSZone *)zone {
 return [[self class] defaultPayManager];
}

#pragma mark - WeiChatPayDelegate
- (void)onResp:(BaseResp *)resp {
 //启动微信支付的response
 if (self.payRequestModel.payType == kPayTypeWXPay) {
 if (self.callback) {
  IOAPayResponseModel *payResponseModel = [IOAPayResponseModel new];
  payResponseModel.result = 0;
  if([resp isKindOfClass:[PayResp class]]){
  //支付返回结果,实际支付结果需要去微信服务器端查询
  switch (resp.errCode) {
   case 0:
//   payResoult = @"支付结果:成功!";
   payResponseModel.result = 1;
   break;
   case -1:
   payResponseModel.result = 0;
   break;
   case -2:
   payResponseModel.result = 0;
   break;
   default:
   break;
  }
  }

  self.callback(payResponseModel);
 }
 }
}

#pragma mark - Public

// 是否安装了客户端
- (BOOL)isPayAppInstalled:(PayType)payType {
 switch (payType) {
 case kPayTypeWXPay:
  return [WXApi isWXAppInstalled];
  break;

 case kPayTypeALiPay:
  // 未提供接口 返回NO
  return NO;
  break;
 case kPayTypeUNPay:
  return [[UPPaymentControl defaultControl] isPaymentAppInstalled];
  break;
 default:
  break;
 }

 return NO;
}

- (void)pay:(IOAPayRequestModel *)payRequestModel callback:(void (^)(IOAPayResponseModel *response))callback {
 if (!payRequestModel) return;
 self.callback = callback;
 self.payRequestModel = payRequestModel;

 switch (payRequestModel.payType) {
 case kPayTypeWXPay:
  [self wxPay:payRequestModel];
  break;

 case kPayTypeALiPay:
  [self aliPay:payRequestModel];
  break;
 case kPayTypeUNPay:
  [self unPay:payRequestModel];
  break;
 default:
  break;
 }
}

// 支付回调
- (void)payCallbackWithUrl:(NSURL *)url {
 // 其他如支付等SDK的回调
 if ([url.host isEqualToString:@"safepay"]) {
 [self aliPayCallback:url];
 }
 else if ([url.host isEqualToString:@"pay"]) {
 // 处理微信的支付结果
 [self wxPayCallback:url];
 }
 else if ([url.host isEqualToString:@"uppayresult"]) {
 [self unPayCallback:url];
 }
}

#pragma mark - Pay

// 微信支付
- (void)wxPay:(IOAPayRequestModel *)payRequestModel {
 PayReq *req = [[PayReq alloc] init];
 NSDictionary *dataDic = payRequestModel.userInfo;
 //由用户微信号和AppID组成的唯一标识,用于校验微信用户
 req.openID = dataDic[@"appid"];
 // 商家id,在注册的时候给的
 req.partnerId = dataDic[@"partnerid"];
 // 预支付订单这个是后台跟微信服务器交互后,微信服务器传给你们服务器的,你们服务器再传给你
 req.prepayId = dataDic[@"prepayid"];
 // 根据财付通文档填写的数据和签名
 req.package = @"Sign=WXPay";
 // 随机编码,为了防止重复的,在后台生成
 req.nonceStr = dataDic[@"noncestr"];
 // 这个是时间戳,也是在后台生成的,为了验证支付的
 NSString * stamp = dataDic[@"timestamp"];
 req.timeStamp = stamp.intValue;
 // 这个签名也是后台做的
 req.sign = dataDic[@"sign"];
 //发送请求到微信,等待微信返回onResp
 [WXApi sendReq:req];
}

// 支付宝
- (void)aliPay:(IOAPayRequestModel *)payRequestModel {
 NSString *appScheme = payRequestModel.appScheme;
 NSString *payString = payRequestModel.payString;

 __weak __typeof(self)weakSelf = self;
 [[AlipaySDK defaultService] payOrder:payString fromScheme:appScheme callback:^(NSDictionary *resultDic) {
 if (weakSelf.payRequestModel.payType == kPayTypeALiPay) {
  if (weakSelf.callback) {
  IOAPayResponseModel *payResponseModel = [IOAPayResponseModel new];
  payResponseModel.userInfo = resultDic;
  payResponseModel.result = [resultDic[@"result"] integerValue];
  weakSelf.callback(payResponseModel);
  }
 }
 }];
}

// 银联支付
- (void)unPay:(IOAPayRequestModel *)payRequestModel {
 NSString *appScheme = payRequestModel.appScheme;
 NSString *payString = payRequestModel.payString;
 [[UPPaymentControl defaultControl] startPay:payString fromScheme:appScheme mode:@"01" viewController:[UIApplication sharedApplication].keyWindow.rootViewController];
}

//////
- (void)wxPayCallback:(NSURL *)url {
 //跳转支付宝钱包进行支付,处理支付结果
 [WXApi handleOpenURL:url delegate:self];
}

- (void)aliPayCallback:(NSURL *)url {
 __weak typeof(self)weakSelf = self;
 [[AlipaySDK defaultService] processOrderWithPaymentResult:url standbyCallback:^(NSDictionary *resultDic) {
 if (weakSelf.payRequestModel.payType == kPayTypeALiPay) {
  if (weakSelf.callback) {
  IOAPayResponseModel *payResponseModel = [IOAPayResponseModel new];
  payResponseModel.userInfo = resultDic;
  payResponseModel.result = [resultDic[@"result"] integerValue];
  weakSelf.callback(payResponseModel);
  }
 }
 }];
}

- (void)unPayCallback:(NSURL *)url {
 __weak typeof(self)weakSelf = self;
 [[UPPaymentControl defaultControl]handlePaymentResult:url completeBlock:^(NSString *code, NSDictionary *data) {
 if (weakSelf.payRequestModel.payType == kPayTypeUNPay) {
  if (weakSelf.callback) {
  IOAPayResponseModel *payResponseModel = [IOAPayResponseModel new];
  payResponseModel.userInfo = data;
  if ([code isEqualToString:@"success"]) {
   [[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYS" object:nil];
   payResponseModel.result = [code boolValue];
  }
  else if([code isEqualToString:@"fail"]) {
   //交易失败
   [[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYF" object:nil];
   payResponseModel.result = [code boolValue];
  }
  else if([code isEqualToString:@"cancel"]) {
   //交易取消
   [[NSNotificationCenter defaultCenter] postNotificationName:@"YINLIANPAYC" object:nil];
   payResponseModel.result = 0;
  }

  weakSelf.callback(payResponseModel);
  }
 }
 }];
}
@end

3.此时方法就开始封装好了,可以在需要的地方直接使用(弹框已作出)

- (void)alipay{
 [self startProgress];
 self.requestModel.pay_type = @"alipayMobile";
 //自己后台的接口---拿到后台返回的数据作为第三方接口的参数
 [self.viewModel requestCartSettlePay:self.requestModel callback:^(IOAResponse *response) {
 dispatch_async(dispatch_get_main_queue(), ^{
  [self stopProgress];
  if (response.success) {
  NSString *appScheme = @"IOAAlipaySDK";
  self.payRequestModel.payString = response.responseObject;
  self.payRequestModel.payType = 1;
  self.payRequestModel.appScheme = appScheme;
  //第三方接口调用(封装)
  [[IOAPayApi defaultPayManager] pay:self.payRequestModel callback:^(IOAPayResponseModel *response) {
   dispatch_async(dispatch_get_main_queue(), ^{
   NSDictionary *userInfo = response.userInfo;
   if (![userInfo[@"resultStatus"] isEqualToString:@"9000"]) {
    //进入待付款界面(支付失败或者支付取消等)
    [self pushWait];
   }else{
    //进入订单列表界面(支付成功)
    [self pushList];
   }
   });
  }];
  }else{
  [self.view makeToast:@"支付失败"];
  }
 });
 }];
}

4.重磅来临(一些人弹框没有作出,可以直接拷贝下面代码)

新建控制器控制弹框.h文件中

#import <UIKit/UIKit.h>

#import "IOAPayApi.h"
#import "IOAPayItemModel.h"

@interface IOAPayViewController : UIViewController
//点击第几行回调声明
@property (nonatomic, copy) void (^clickCallback)(NSInteger atIndex);

+ (instancetype)show;
//block回调方法
+ (instancetype)show:(void (^)(NSInteger atIndex))clickCallback;
+ (void)dismiss;

- (void)setupItemTitles:(NSArray <NSString *>*)titles;
- (void)setupItems:(NSArray <IOAPayItemModel *>*)items;

- (void)setupTitle:(NSString *)title;
@end

实现其方法.m文件中

#import "IOAPayViewController.h"

#define PayCellHeight 50
#define PaySectionHeaderHeight 44

@interface IOAPayViewController () <UITableViewDataSource, UITableViewDelegate>
@property (nonatomic, strong) CALayer *maskLayer;

@property (nonatomic, strong) UILabel *titleView;
@property (nonatomic, strong) UIView *payBgView;
@property (nonatomic, strong) UITableView *tableView;
@property (nonatomic, strong) NSMutableArray *dataSources;

@property (nonatomic, assign) CGFloat payViewHeight;

- (void)showPayView;
- (void)dismissPayView;
@end

@implementation IOAPayViewController

- (void)dealloc {

}

+ (instancetype)show {
 UIViewController *rootvc = [UIApplication sharedApplication].keyWindow.rootViewController;

 IOAPayViewController *vc = [IOAPayViewController new];
 [rootvc addChildViewController:vc];
 [rootvc.view addSubview:vc.view];

 [vc setupItemTitles:@[@"微信支付", @"支付宝支付", @"银联支付"]];
 [vc showPayView];
 return vc;
}

+ (instancetype)show:(void (^)(NSInteger atIndex))clickCallback {
 IOAPayViewController *vc = [self show];
 vc.clickCallback = clickCallback;

 return vc;
}

+ (void)dismiss {
 UIViewController *rootvc = [UIApplication sharedApplication].keyWindow.rootViewController;
 for (UIViewController *vc in rootvc.childViewControllers) {
 if ([vc isKindOfClass:[IOAPayViewController class]]) {
  IOAPayViewController *tempVC = (IOAPayViewController *)vc;
  [tempVC dismissPayView];
  return;
 }
 }
}

- (void)viewDidLoad {
 [super viewDidLoad];
 self.view.backgroundColor = [UIColor clearColor];

 self.maskLayer.frame = self.view.bounds;
 [self.view.layer addSublayer:self.maskLayer];

 [self.view addSubview:self.payBgView];
// [self.view addSubview:self.tableView];
}

- (void)didReceiveMemoryWarning {
 [super didReceiveMemoryWarning];
 // Dispose of any resources that can be recreated.
}

#pragma mark - UITableViewDataSource
- (NSInteger )numberOfSectionsInTableView:(UITableView *)tableView {
 return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
 return self.dataSources.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
 id temp = self.dataSources[indexPath.row];
 if ([temp isKindOfClass:[NSString class]]) {
 cell.textLabel.text = temp;
 }
 else {
 IOAPayItemModel *item = temp;
 cell.textLabel.text = item.name;
 }
 cell.textLabel.font = [UIFont systemFontOfSize:18];
 cell.textLabel.textColor = RGB_HEXString(@"#323232");
 cell.selectionStyle = UITableViewCellSelectionStyleNone;

 return cell;
}

#pragma mark - UITableViewDelegate
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
 return PayCellHeight;
}

- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
 return self.titleView;
}
- (CGFloat )tableView:(UITableView *)tableView heightForHeaderInSection:(NSInteger)section {
 return PaySectionHeaderHeight;
}

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
// IOAPayRequestModel *payRequestModel = [IOAPayRequestModel new];
// payRequestModel.payType = indexPath.row;
//// WS(weakSelf);
//// __weak typeof (self)weakSelf = self;
// __block IOAPayViewController *payVC = self;
// [[IOAPayApi defaultPayManager] pay:payRequestModel callback:^(IOAPayResponseModel *response) {
//// __strong __typeof (weakSelf)strongSelf = weakSelf;
// response.payType = indexPath.row;
// if (payVC.clickCallback) {
//  payVC.clickCallback(response);
//  payVC = nil;
// }
// }];

 if (self.clickCallback) {
 self.clickCallback(indexPath.row);
 }

 [self dismissPayView];
}

#pragma mark - Touches
- (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event {
 [self dismissPayView];
}

#pragma mark - Public
- (void)setupItemTitles:(NSArray<NSString *> *)titles {
 if (!titles.count) {
 return ;
 }

 self.payViewHeight = titles.count * PayCellHeight + PaySectionHeaderHeight;
 CGRect frame = self.view.frame;
 frame.size.height = self.payViewHeight;
 self.tableView.frame = frame;

 [self.dataSources removeAllObjects];
 [self.dataSources addObjectsFromArray:titles];
 [self.tableView reloadData];

 [self setPayViewFrame];
}

- (void)setupItems:(NSArray <IOAPayItemModel *>*)items {
 if (!items.count) {
 return ;
 }

 for (IOAPayItemModel *item in items) {
 if ([item.code isEqualToString:@"appWeixinPay"]) {
  item.payType = 0;
  continue;
 }

 if ([item.code isEqualToString:@"alipayMobile"]) {
  item.payType = 1;
  continue;
 }

 if ([item.code isEqualToString:@"unionpay"]) {
  item.payType = 2;
  continue;
 }
 if ([item.code isEqualToString:@"ye"]) {
  item.payType = 3;
  continue;
 }
 item.payType = 3;
 }

 self.payViewHeight = items.count * PayCellHeight + PaySectionHeaderHeight;
 CGRect frame = self.view.frame;
 frame.size.height = self.payViewHeight;
 self.tableView.frame = frame;
 [self.dataSources removeAllObjects];
 [self.dataSources addObjectsFromArray:items];
 [self.tableView reloadData];
 [self setPayViewFrame];
}

- (void)setupTitle:(NSString *)title {
 self.titleView.text = title;
}

#pragma mark - Private
- (void)showPayView {
 [self.view.layer removeAllAnimations];
 CGFloat payBgViewHeight = self.payViewHeight + BottomHeightOffset;
 CGRect frame = self.view.frame;
 frame.origin.y = self.view.frame.origin.y + self.view.frame.size.height;
 frame.size.height = payBgViewHeight;
 self.payBgView.frame = frame;

 frame.origin.y = self.view.frame.size.height - payBgViewHeight;
 [UIView animateWithDuration:0.25 animations:^{
 self.payBgView.frame = frame;
 }];
}

- (void)setPayViewFrame {
 CGFloat payBgViewHeight = self.payViewHeight + BottomHeightOffset;
 CGRect frame = self.view.frame;
 frame.origin.y = self.view.frame.origin.y + self.view.frame.size.height;
 frame.size.height = payBgViewHeight;
 frame.origin.y = self.view.frame.size.height - payBgViewHeight;
 self.payBgView.frame = frame;
}

- (void)dismissPayView {
 CGFloat payBgViewHeight = self.payViewHeight + BottomHeightOffset;

 CGRect frame = self.view.frame;
 frame.origin.y = self.view.frame.origin.y + self.view.frame.size.height;
 frame.size.height = payBgViewHeight;

 [UIView animateWithDuration:0.25 animations:^{
 self.payBgView.frame = frame;
 } completion:^(BOOL finished) {
 [self.view removeFromSuperview];
 [self removeFromParentViewController];
 }];
}

#pragma mark - Setter / Getter
- (CALayer *)maskLayer {
 if (_maskLayer == nil) {
 _maskLayer = [CALayer layer];
 _maskLayer.backgroundColor = [UIColor blackColor].CGColor;
 _maskLayer.opacity = 0.2;
 }

 return _maskLayer;
}

- (UILabel *)titleView {
 if (!_titleView) {
 _titleView = [UILabel new];
 _titleView.textAlignment = NSTextAlignmentCenter;
 _titleView.text = @"请选择支付方式";
 _titleView.font = [UIFont systemFontOfSize:16];
 _titleView.textColor = [UIColor blackColor];
 _titleView.backgroundColor = RGB_HEXString(@"#f2f2f2");//[UIColor whiteColor];
 }

 return _titleView;
}

- (UIView *)payBgView {
 if (!_payBgView) {
 _payBgView = [UIView new];
 _payBgView.backgroundColor = [UIColor whiteColor];
 [_payBgView addSubview:self.tableView];
 }
 return _payBgView;
}

- (UITableView *)tableView{
 if (!_tableView) {
 _tableView = [[UITableView alloc]initWithFrame:CGRectZero style:UITableViewStylePlain];
 _tableView.delegate = self;
 _tableView.dataSource = self;
 _tableView.showsVerticalScrollIndicator = NO;
 _tableView.showsHorizontalScrollIndicator = NO;
 _tableView.separatorStyle = UITableViewCellSeparatorStyleSingleLine;
 _tableView.separatorColor = RGB_HEXString(@"#f2f2f2");
 if ([_tableView respondsToSelector:@selector(setSeparatorInset:)]) {
  [_tableView setSeparatorInset:UIEdgeInsetsZero];
 }
 if ([_tableView respondsToSelector:@selector(setLayoutMargins:)]) {
  [_tableView setLayoutMargins:UIEdgeInsetsZero];
 }

 //
 [_tableView registerClass:[UITableViewCell class] forCellReuseIdentifier:@"Cell"];
 }
 return _tableView;
}

- (NSMutableArray *)dataSources {
 if (!_dataSources) {
 _dataSources = [NSMutableArray array];
 }
 return _dataSources;
}

- (void)setPayViewHeight:(CGFloat)payViewHeight {
 _payViewHeight = payViewHeight;
 CGFloat height = self.view.frame.size.height * 0.6;
 self.tableView.scrollEnabled = NO;
 if (_payViewHeight > height) {
 _payViewHeight = height;
 self.tableView.scrollEnabled = YES;
 }
}
@end

举例方法

利用请求的数据进行赋值传值。

IOAOrderBaseModel *dataSourceModel = self.dataSource[indexPath.section];
  IOAOrderSelectAbleItemModel *itemModel = (IOAOrderSelectAbleItemModel *) dataSourceModel.items[row];
  IOAPayViewController *vc = [IOAPayViewController show:^(NSInteger atIndex) {
  IOAPayItemModel *payItem = itemModel.items[atIndex];
  itemModel.selectedIndex = atIndex;

  weakSelf.requestModel.pay_type = payItem.code;
  weakSelf.payItem = payItem;

  [weakSelf.tableView reloadSections:[NSIndexSet indexSetWithIndex:section] withRowAnimation:UITableViewRowAnimationNone];
  }];
  [vc setupItems:self.confirmOrderInfo.payment_list];
  [vc setupTitle:@"请选择支付方式"];

最后的举例方法并不是所有的适用,对于上面1.2.3还是可以直接拿过去使用,这些都是原创,如果第一次接入还是希望各位读者读一下上篇文章,集成的整个过程,链接为http://www.jb51.net/article/139186.htm,这个代码的整个demo。

您可能感兴趣的文章:

  • IOS应用内支付返回新旧Receipt适配的方法
  • iOS动画解析之支付宝支付打钩动画的实现方法
  • IOS 集成微信支付功能的实现方法
  • iOS实现微信支付流程详解
  • iOS开发傻瓜式微信支付的方法教程
  • iOS开发支付宝支付成功返回字符串的处理操作
  • iOS支付宝支付方法详解
  • iOS支付宝使用方法详解
  • iOS支付宝、微信、银联支付集成封装调用(上)
(0)

相关推荐

  • iOS支付宝支付方法详解

    支付宝SDK下载地址:https://doc.open.alipay.com/doc2/detail?treeId=54&articleId=103419&docType=1 支付宝集成 在支付宝集成的过程中,会遇到一些报错,下面就碰到的报错,和大家一起解决. 集成参考官方文档: 导入代码文档:https://doc.open.alipay.com/doc2/detail.htm?spm=0.0.0.0.RiFaVa&treeId=59&articleId=103676&a

  • IOS 集成微信支付功能的实现方法

    IOS 集成微信支付功能的实现方法 第一步:集成微信的SDK https://pay.weixin.qq.com/wiki/doc/api/index.html 点击进入 下载对应SDK或示例,最后可以看看示例程序 第二步:在Xcode中填写微信开放平台申请的Appid Xcode>info>URL Types  中新建加入Appid 第三步:在Appdelegate.m 中注册微信支付 和回调 #import "WXApi.h" 添加 代理 WXApiDelegate -

  • iOS实现微信支付流程详解

    背景 自微信支付.支付宝支付入世以来,移动端的支付日渐火热.虚拟货币有取代实体货币的趋向(这句纯属扯淡,不用管),支付在app开发中是一项基本的功能,有必要去掌握.从难易程度上讲,不管是微信支付还是支付宝支付都是非常简单的,因为第三方的支付文档非常详细,而且他们内部的安全性也非常高.作为使用这些支付策略的我们,只需要掌握流程,能够实现正常支付的功能即可.为什么要写下这篇博文,原因有二.其一,微信支付流程中有坑,其二,以后忘记了可以拿出来看看. 配置 1.微信支付需要两个账号,财付通和微信开发者,

  • IOS应用内支付返回新旧Receipt适配的方法

    ios7.0后ios支付成功返回的票据Receipt的获取方式有了新的方式, 原来的SKPaymentTransaction中的transactionReceipt属性获取票据的方式已经过期,虽然还能使用,但是苹果官方建议使用新的 新版的获取Receipt的方式是通过新接口如下 NSURL *receiptURL = [[NSBundle mainBundle] appStoreReceiptURL]; NSData *receipt = [NSData dataWithContentsOfUR

  • iOS动画解析之支付宝支付打钩动画的实现方法

    前言 我们平时在用支付宝付款时,会有一个支付中的动画和一个支付完成的动画.这篇博客主要分析一下这种动画效果,效果如下: 支付宝支付动画 一.动画解析 为了方便观察,放慢了动画的速度并添加辅助线: 放慢后的动画 从图中可以看出:加载圆弧运动轨迹可分为前半段和后半段:并且圆弧的起始角度(StartAngle)和结束角度(EndAngle)在做有规律的变化: 前半段: 从-0.5π到π,这一段运动中速度较快:StartAngle不变,始终未-0.5π:EndAngle在匀速上升,一直到π:前半段中圆弧

  • iOS开发支付宝支付成功返回字符串的处理操作

    { memo=""; result="partner=\"311811\"&seller_id=\"nse@gmail.com\"&out_trade_no=\"S005372\"&subject=\"\U522b\U5885\U8ba2\U5355\"&body=\"\U5885\"&total_fee=\"0.1\"

  • iOS支付宝使用方法详解

    支付宝相关资源下载地址:支付宝开放平台 在移动支付功能处下载. 一.使用官方的Demo 需要配置基本信息: 打开"APViewController.m"文件,对以下三个参数进行编辑. 二.集成支付宝到自己的工程 1.启动Xcode,为了方便快速开发,将解压包里面的AlipaySDK.bundle和AlipaySDK.framework 和Demo里面的以下文件拷贝到自己的工程文件夹中去,并导入到项目工程中. 2.在Build Phases选项卡的Link Binary With Lib

  • iOS支付宝、微信、银联支付集成封装调用(上)

    一.集成支付宝支付 支付宝集成官方教程 https://docs.open.alipay.com/204/105295/ 支付宝集成官方demo https://docs.open.alipay.com/54/104509/ 1.导入SDK并添加依赖库 启动IDE(如Xcode),把iOS包中的压缩文件中以下文件拷贝到项目文件夹下,并导入到项目工程中. AlipaySDK.bundle AlipaySDK.framework 在Build Phases选项卡的Link Binary With L

  • iOS开发傻瓜式微信支付的方法教程

    前言 本文主要给大家介绍了关于iOS开发傻瓜式微信支付的相关内容,分享出来供大家参考学习,下面来一起看看详细的介绍吧. 方法步骤如下: 先下载微信SDK,如果集成了友盟分享里的微信,那就不用下载,也不用配置环境,因为配置友盟分享的时候已经把微信支付的环境都配置好了(包括框架,schema跳转,白名单)如果没有集成过友盟分享那么请到微信开放平台下载SDK 如果公司没有给微信平台的appkey则需要自己帮公司去微信平台申请 工程的bundle id 也要和在微信平台注册的bundle id一样 链接

  • iOS支付宝、微信、银联支付集成封装调用(下)

    一.越来越多的app增加第三方的功能,可能app有不同的页面但调用相同的支付方式,例如界面如下: 这两个页面都会使用第三方支付支付:(微信,支付宝,银联)如果在每一个页面都直接调用第三方支付的接口全部代码,显然并不是很合适,更何况,可能一个app并不止两个入口.所以封装还是很有必要的. 1.新建Model:-------后台返回支付方式的列表json #import <Foundation/Foundation.h> @interface IOAPayItemModel : NSObject

  • 微信JSAPI支付操作需要注意的细节

    首先介绍一下我在调用微信支付接口使用的是 weixin.senparc SDK,非常方便好用开源的一个微信开发SDK. weixin.senparc SDK 官网:http://weixin.senparc.com/ 先去下载下来Senparc.Weixin SDK. 在调起支付接口之前,需要先要调用统一下单接口,商户系统先调用该接口在微信支付服务后台生成预支付交易单,返回正确的预支付交易回话标识后再在APP里面调起支付. 微信 JsApi支付 在这个目录下 Senparc.Weixin.MP.

  • Android仿支付宝微信支付密码界面弹窗封装dialog

    一,功能效果 二,实现过程 1,先写xml文件:dialog_keyboard.xml 注意事项 (1),密码部分用的是一个线性布局中6个TextView,并设置android:inputType="numberPassword",外框是用的一个有stroke属性的shape, (2),1-9数字是用的recycleview ,每个item的底部和右边有1dp的黑线,填充后形成分割线. (3),recycleview 要设置属性  android:overScrollMode=&quo

  • Android支付宝和微信支付集成

    场景 随着移动支付的兴起,在我们的app'中,会经常有集成支付的需求.这时候一般都会采用微信和支付宝的sdk 来集成 (一)支付宝支付 在使用支付宝支付的过程中,我们是在服务器端生成订单,客户端访问接口,并得到订单信息,调用接口支付,支付成功后支付宝会分别 异步调用服务器端,并向客户端返回支付结果. 开发步骤: ①注册支付宝账号--进行实名认证--提交审核资料--审核通过 支付宝无线快捷支付接口: b.alipay.com/order/productDetail.htm?productId=20

  • Android 支付宝支付、微信支付、银联支付 整合第三方支付接入方法(后台订单支付API设计)

    客户端获取后台支付API请求参数的设计 参数样例: { data: { method: 1, platform: 1, version:"1.0", relate_orders:"B201602031023,B2016020310231", order_no: "BZY201604200952100", order_type: 1, total_fee: 1, description: "商品购买", client_ip:'1

  • vue 解决在微信内置浏览器中调用支付宝支付的情况

    我的思路大概是这样的 1. 验证是否是在微信内置浏览器中调用支付宝 2.给支付页面的url加上调用接口所需的参数(因为在微信里是不能直接调用支付宝的需要调用外部浏览器) 3.在外部浏览器中完成支付跳转页面 第一步: payment: 是选择支付页面,pay-mask是用于在微信内置浏览器中调用支付宝的中间页 payment主要代码: let ua = window.navigator.userAgent.toLowerCase() ua.match(/MicroMessenger/i) == "

  • iOS APP实现微信H5支付示例总结

    微信H5支付流程 1.发起下单请求(调用统一下单接口)注:交易类型trade_type=MWEB 2.统一下单接口返回支付相关参数给商户后台,如支付跳转url(参数名"mweb_url"),商户通过mweb_url调起微信支付中间页.如:https://wx.tenpay.com/cgi-bin/mmpayweb-bin/checkmweb?prepay_id=wx27142704550165900edae5270331515985&package=600759311&

  • iOS开发微信支付的方法

    本文实例为大家分享了iOS开发微信支付的具体代码,供大家参考,具体内容如下 首先我们到微信开放平台,下载相应的SDK.微信的官方文档感觉说的很简单,没有支付宝那么详细,在这里说下集成SDK到我们的工程中. 下载好demol后(最新版本SDKSample_v2.0.2_V3pay),看到有个SDKExport的文件; 你可以直接将这个文件夹添加到你的工程中,或者你自己新建一个文件夹,将里面那三个文件粘贴到你新建的文件夹中,并添加到你的工程中; 接下来就是添加相应地库文件; 我们看到demol中有个

  • python实现银联支付和支付宝支付接入

    本文实例为大家分享了python银联支付和支付宝支付接入的具体代码,供大家参考,具体内容如下 前置条件:需要安装Python的OpenSSL模块,我使用的版本是16.1.0,可以使用pip install pyopenssl来安装 一.支付宝支付 1. 使用RSA公钥加密系统进行签名和签名验证,需要自己生成一个RSA私钥和对应的一个RSA公钥(在Linux下可以使用ssh-keygen命令来生成),公钥需要上传至支付宝,供支付宝对开发者发送的请求做签名验证使用:而同时支付宝会提供一个RSA公钥给

随机推荐