支付宝、微信sdk支付流程模拟

本文详细介绍了一款iOS支付SDK的开发过程,包括数据模型定义、支付流程实现及回调机制设计等核心内容。通过具体实例展示了如何封装支付逻辑并提供统一接口供外部调用。

今天和同事闲聊的时候,聊到对接支付宝和微信sdk的事情,聊完以后兴致未尽。顺便去网上搜了一下,怎样做一款sdk,网上的教程少的可怜,能搜到的也是好坏各异,参差不齐。遂下决心,敲一篇博客,把sdk的实现流程讲解一下。给迷茫中的小白一点思路。还是那句话,一万个读者有一万个哈姆雷特,一万个程序员有一万种编码风格,代码仅供参考。最后的效果如图:
支付sdk流程图

sdk内部类文件:
sdk

导入sdk后demo内部类文件:
demo

①UserInfoModel类作为传入sdk的数据模型
UserInfoModel.h

#import <Foundation/Foundation.h>

@interface UserInfoModel : NSObject

@property (nonatomic, copy) NSString *money;

@end

②ResultModel类作为支付完成以后数据回调模型
ResultModel.h

#import <Foundation/Foundation.h>

@interface ResultModel : NSObject

@property (nonatomic, copy)   void(^payResultBlock)(NSString *status, NSDictionary *payDict);

+ (instancetype)sharedInstance;

@end

ResultModel.m

#import "ResultModel.h"

@implementation ResultModel

+ (instancetype)sharedInstance {
    static ResultModel *resultModel;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        resultModel = [[ResultModel alloc] init];
    });

    return resultModel;
}

@end

③PayAndReddem类作为支付sdk入口
PayAndReddem.h

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>
#import "UserInfoModel.h"

@interface PayAndReddem : NSObject

+ (void)setupPayInfo:(UserInfoModel *)userInfo subClass:(UIViewController *)subCotroller payResult:(void (^)(NSString *status, NSDictionary *payDict))payResultBlock;

@end

PayAndReddem.m

#import "PayAndReddem.h"
#import "ThridViewController.h"
#import "PayModel.h"
#import "ResultModel.h"

@implementation PayAndReddem

+ (void)setupPayInfo:(UserInfoModel *)userInfo subClass:(UIViewController *)subCotroller payResult:(void (^)(NSString *status, NSDictionary *payDict))payResultBlock {
    [ResultModel sharedInstance].payResultBlock = payResultBlock;

    PayModel *payModel = [PayModel sharedPayInfo];
    payModel.money = userInfo.money;
    ThridViewController *payInputVC = [[ThridViewController alloc] init];
    UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:payInputVC];
    [subCotroller presentViewController:nav animated:YES completion:nil];
}

@end

④SecondViewController,从此处开始调用sdk,并将数据通过PayReddem传入sdk。在支付完成以后,成功与否均返回此页面

SecondViewController.m

#import "SecondViewController.h"
#import "PayAndReddem.h"

@interface SecondViewController ()

@property (nonatomic, strong) UITextField *textField;
@property (nonatomic, strong) UIButton *button;

@end

@implementation SecondViewController

- (void)viewDidLoad {
    [super viewDidLoad];

    self.view.backgroundColor = [UIColor colorWithWhite:1 alpha:0.9];
    self.navigationItem.title = @"购买商品";
    [self setupSubviews];

}

- (void)setupSubviews {
    self.textField = [[UITextField alloc] initWithFrame:CGRectMake((CGRectGetWidth(self.view.bounds)-200)/2, 100, 200, 30)];
    self.textField.borderStyle = UITextBorderStyleNone;
    self.textField.backgroundColor = [UIColor whiteColor];
    self.textField.placeholder = @"请输入支付金额(分)";
    [self.textField becomeFirstResponder];
    [self.view addSubview:self.textField];

    self.button = [UIButton buttonWithType:UIButtonTypeCustom];
    self.button.backgroundColor = [UIColor greenColor];
    [self.button setTitle:@"进入支付sdk" forState:UIControlStateNormal];
    [self.button setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];
    self.button.frame = CGRectMake((CGRectGetWidth(self.view.bounds)-200)/2, 150, 200, 35);
    [self.button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside];
    [self.view addSubview:self.button];
}

- (void)buttonClick:(UIButton *)btn {
    BOOL isEmpty = [self checkTextField];

    //进入支付sdk
    if (isEmpty) {
        [PayAndReddem setupPayInfo:[self test] subClass:self payResult:^(NSString *status, NSDictionary *payDict) {
            if ([status isEqualToString:@"success"]) {
                //支付成功,并返回支付成功后的相应字段
                NSLog(@"result_code=%@,result_msg=%@",payDict[@"result_code"],payDict[@"result_msg"]);
            } else if ([status isEqualToString:@"fail"]) {
                //支付失败
                NSLog(@"支付失败");
            }
        }];
    }
}

- (BOOL)checkTextField {
    if (self.textField.text.length > 0) {
        return YES;
    } else {
        NSLog(@"金额不能为空");
        return NO;
    }
}

//传入支付sdk数据
- (UserInfoModel *)test {
    UserInfoModel *userInfoModel = [[UserInfoModel alloc] init];
    userInfoModel.money = self.textField.text;
    return userInfoModel;
}

@end

github:demo地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值