最新要闻
- 当前滚动:理查森的大型CityLine办公楼开发项目上市
- 【天天新要闻】50斤重鳄雀鳝藏匿水库一年偷鱼吃 为何不负责放生屡禁不止?律师、专家释疑
- 女子称41℃高温把盆里的衣服晒冒烟了!多地今日最高温40度:热热热
- 马斯克和扎克伯格约架 马斯克母亲发话:打打嘴仗算了|全球快资讯
- 巡演拯救经济?外媒称霉霉巡演可能为美国带来46亿美元收入
- 真八角笼中决斗!马斯克发战书 扎克伯格接受了:科技大佬约架 都认真对待
- 端午假期遇上高考查分 各地高考成绩今天起陆续公布:各省成绩查询时间一览
- 天天快消息!张绍刚你好狠的心 剧中亲儿子都舍得杀!《长风渡》热度破万 你追了吗
- 地表最强三缸机!丰田全新GR卡罗拉赛道版限量发布:三缸榨出300匹马力
- 夏日健康帖丨出现这几个症状别大意!你可能已经中暑|每日热文
- 苹果尴尬!iOS系统比安卓难上手实锤了:易用性相差58% 环球讯息
- 正式牵手!苏州和上海地铁连起来了:无感换乘 比坐高铁方便多了-每日观点
- 端午“龙舟”天花板!广西桂林遇龙河现“巨龙巡游”:无比壮观
- 每日报道:国产操作系统赶超Win 10:插上U盘就能用
- 泰坦号壳体破裂沉没 乘员无一生还 世界热点评
- 创两月以来最大跌幅!特斯拉市值一夜蒸发3400亿元
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
iOS 微信、支付宝、银联支付组件的进一步设计-天天播资讯
原文地址:https://zhanglei.blog.csdn.net/article/details/121376500
前言
有段时间没写技术文章了,一是因为工作太忙,再者因为本人文笔实在一般。最近终于闲下来,本着分享的目的将一些组件设计上的心得与大家分享。本篇文章是基于原有一篇关于支付文章的进一步优化设计,所以在阅读本篇文章前还是建议先移步到那篇文章。文章地址: 微信、支付宝、银联、Paypal 支付组件封装
(资料图片)
描述
在封装支付接口时,需要面临各支付平台不同SDK集成的问题,有的支付第三方平台只通过sdk组件就可完成支付,像支付宝,但大部分的支付第三方平台需要先去调用服务端API接口获取支付需要的信息,拿到这些支付信息后,再去调用sdk组件完成支付,这类第三方有银联(需要获取tn交易流水号),微信(需要获取prepayData
)等。
为了以后的支付功能复用,想要设计一个支付组件,该组件整合并统一了这些第三方支付sdk的接口,以便给客户端快速集成。在设计支付组件的过程中就遇到上面提到的问题。 如何解决某些第三方需要请求一些数据后,再进行支付的问题 ? 试想一下如果将这些请求hardcode到组件中,显然能满足当前的功能,局限性也非常明显,只能适用当前的支付业务。 此时的支付组件会和网络组件藕合,不利于扩展及复用。
设计
如何解藕? 如何能让这些需要请求API的第三方不污染组件? 解藕的思想就是“抽离变化,并封装”
。 我们需要把不稳定的部分抽离出来,使其独自变化,不影响稳定的部分。 找到了方向, 如何抽离? 这里我们可以使用面向协议的编程的思想,将请求API的行为进行抽象。伪代码:
//抽像一个协议, 协议定义一个获取支付信息的方法,调用接口是异步操作,所以返回的数据使用block返回@protocol PayDataPrepareProtocol @required- (void)getPayData:(void(^)(id result, NSError *error))block;@end
微信支付伪代码:
@interface WXPayPrepareData : NSObject @property (nonatomic,strong) NSDictionary *requestParams;@end@implementation WXPayPrepareData- (void)getPayData:(void(^)(id result, NSError *error))block { //根据请求参数,使用网络层组件调用API,并返回预支付信息 block(result,nil);}@end
银联支付伪代码:
@interface UnionPayPrepareData : NSObject @property (nonatomic,strong) NSDictionary *requestParams;@end@implementation UnionPayPrepareData- (void)getPayData:(void(^)(id result, NSError *error))block { //根据请求参数,使用网络层组件调用API,并返回预支付信息 block(result,nil);}@end
如何能将支付类型与预支付实现类之间建立联系呢?我们需要设计一个配置类来管理这种支付类型与预支付实现类的对应关系 。
支付配置的伪代码:
typedef NS_Enum(NSInteger, PayType) { PayTypeForAlipay, //支付宝支付 PayTypeForWXPay, //微信支付 PayTypeForUPPay, //银联支付} @interface PayConfig: NSObject//单例对象+ (instancetype)config;//添加获取预支付信息对应的策略类, 没有传递实例对象,避免未使用而造成的内存浪费- (void)appendPrepayDataStrategy:(Class)strategyClass withPayType:(PayType)payType;//判断是否存在指定类型对应的实现策略- (BOOL)containsPrepayDataStrategyWithPayType:(PayType)payType;//根据支付的枚举类型,获取预支付信息处理对象- (id)getPrepayDataStrategyWithPayType:(PayType)payType;@end@interface PayConfig ()@property (nonatomic,strong) NSMutableDictionary *strategyMap;@end@implementation PayConfig//单例对象+ (instancetype)config { static PayConfig *_instance; static dispatch_once_t onceToken; dispatch_once(&onceToken, ^{ if (!_instance) { _instance = [[PayConfig alloc] init]; } }); return _instance;}//添加获取预支付信息对应的策略类, 没有传递实例对象,避免未使用而造成的内存浪费- (void)appendPrepayDataStrategy:(Class)strategyClass withPayType:(PayType)payType { if (!strategyClass) { return; } //判断是否实现了协议 if (![strategyClass conformsToProtocol:@protocol(PayDataPrepareProtocol)]) { return; } NSString *payTypeKey = [Utils convertPayTypeToString:payType]; //将枚举转成字符串 [self.strategyMap setObject:strategyClass forKey:payTypeKey];}//判断是否存在指定类型对应的实现策略- (BOOL)containsPrepayDataStrategyWithPayType:(PayType)payType { NSString *payTypeKey = [Utils convertPayTypeToString:payType]; //将枚举转成字符串 return !self.strategyMap[payTypeKey];}//根据支付的枚举类型,获取预支付信息处理对象- (id)getPrepayDataStrategyWithPayType:(PayType)payType { if (![self containsPrepayDataStrategyWithPayType:payType]) { return nil; } NSString *payTypeKey = [Utils convertPayTypeToString:payType]; //将枚举转成字符串 Class cls = self.strategyMap[payTypeKey]; return [[cls alloc] init]; //在需要时才返回创建的对象}//懒加载,需要时创建- (NSMutableDictionary *)strategyMap { if (!_strategyMap) { _strategyMap = @{}.mutableCopy; } return _strategyMap;}@end
通过上面的支付配置(单例)对象,我们将以支付类型为key
, 以对应的获取预支付信息的类为value
, 使用字典来管理。 将配置类设计成单例
,这样就可以在支付组件中访问,并使用其中的配置信息。
支付组件的伪代码:
#import "PayConfig.h"@interface PayManager :NSObject //调用预支付信息API接口,用到的请求参数@property (nonatomic,strong) NSDictionary *requestParams;//支付第三方类型@property (nonatomic,assign) PayType payType;//开始支付- (void)startPay;@end@implementation PayManager //开始支付- (void)startPay { //1. 根据支付类型,判断支付配置中是否有需要请求服务API的处理类 if ([[PayConfig config] containsPrepayDataStrategyWithPayType:self.payType]) { id strategy = [[PayConfig config] getPrepayDataStrategyWithPayType:self.payType]; //利用KVC向请求API接口的策略类传递请求参数 [strategy setValue:self.requestParams forKey:@“requestParams”]; //准备好请求数据后,开始调用接口API获取所需要的预支付信息 [strategy getPayData:^(id result, NSError *error ) { //拿到需要的预支付信息后,再调起第三方支付组件 }]; }else { // 调起第三方支付组件 }}@end
总结
通过我们的进一步设计,支付组件已完全不依赖于网络组件来完成对预支付信息的获取,而且扩展性更强了。 如果以后有新的支付第三方加入进来,且需要获取预支付信息的, 我们只需要实现PayDataPrepareProtocol
协议, 并将其加入到 PayConfig
中就可以了。 通过少量的修改我们就可以完成扩展,也遵循了“开闭原则( 对扩展开放,对修改关闭)” 。
完整的支付组件代码请前往:RZPayManager在README.md文件中有该组件的使用详解,如果喜欢,点关注支持一下。
后记
如果本文对你有一点帮助的话,欢迎收藏、点赞,感谢。文中如有不对之处,也欢迎大家在评论区指出,共勉。
关键词:
iOS 微信、支付宝、银联支付组件的进一步设计-天天播资讯
当前滚动:理查森的大型CityLine办公楼开发项目上市
【天天新要闻】50斤重鳄雀鳝藏匿水库一年偷鱼吃 为何不负责放生屡禁不止?律师、专家释疑
女子称41℃高温把盆里的衣服晒冒烟了!多地今日最高温40度:热热热
马斯克和扎克伯格约架 马斯克母亲发话:打打嘴仗算了|全球快资讯
世界速读:1. Spring相关概念
巡演拯救经济?外媒称霉霉巡演可能为美国带来46亿美元收入
土耳其央行2年来首次加息 焦点消息
真八角笼中决斗!马斯克发战书 扎克伯格接受了:科技大佬约架 都认真对待
端午假期遇上高考查分 各地高考成绩今天起陆续公布:各省成绩查询时间一览
天天快消息!张绍刚你好狠的心 剧中亲儿子都舍得杀!《长风渡》热度破万 你追了吗
地表最强三缸机!丰田全新GR卡罗拉赛道版限量发布:三缸榨出300匹马力
前端Vue自定义导航栏菜单 定制左侧导航菜单按钮 中部logo图标 右侧导航菜单按钮
夏日健康帖丨出现这几个症状别大意!你可能已经中暑|每日热文
苹果尴尬!iOS系统比安卓难上手实锤了:易用性相差58% 环球讯息
正式牵手!苏州和上海地铁连起来了:无感换乘 比坐高铁方便多了-每日观点
端午“龙舟”天花板!广西桂林遇龙河现“巨龙巡游”:无比壮观
每日报道:国产操作系统赶超Win 10:插上U盘就能用
泰坦号壳体破裂沉没 乘员无一生还 世界热点评
创两月以来最大跌幅!特斯拉市值一夜蒸发3400亿元
被特斯拉坑了 半幅方向盘车型暂停上牌?多方回应 天天观点
读发布!设计与部署稳定的分布式系统(第2版)笔记09_一窝蜂和容量 全球最资讯
满汉全席所有菜谱(求满汉全席食谱 谁有)|天天最资讯
环球快看:凤凰古城端午热:众人跳水抓鸭 场面火爆!
megacli_sw服务器Raid卡的设置过程 环球快播
高温下北京白天现星星:肉眼可见金星、月亮同框|焦点短讯
视讯!Epic喜加二:《猎人:野性的呼唤》《遗忘国度之闲置冠军》免费
《最终幻想16》等级上限解答:新游戏+解锁100级-世界观速讯
爱奇艺王晓晖:影视不是一门好生意,却可以是伟大的生意
风靡至今什么意思(风靡一时是什么意思)
清远职业技术学校是大专还是中专_清远职业技术学校
焦点热议:使用近10年,说说向大家推荐Linux系统的理由
【世界速看料】吃下肚的粽子是用什么叶子包的?知道真相的人太少了!
中央气象台发布今年首个高温橙色预警:17站点最高气温破历史极值!
随着快船错过布罗格登,这件事情彻底暴露了3个可笑的事实
人人可用的开源数据可视化分析工具 焦点快报
文心一言 VS 讯飞星火 VS chatgpt (44)-- 算法导论6.1 1题_每日热议
天天讯息:周润发《别叫我“赌神”》豆瓣短评出炉:烂片没的说!
奇葩操作 男子让狗舔舐伤口消毒 医生:狗唾液细菌很多
【全球热闻】中央气象台发布今年首个高温橙色预警 17站点最高气温破历史极值
天天新消息丨关于高考一分一档数据分布的研究
每日简讯:《英雄联盟》夏季赛EDG 0:2不敌RNG:Uzi面对老东家无力回天
内蒙古乌兰浩特:民族团结庆端午
介绍CocosCreator系统事件是怎么产生及触发的
ChatGPT 会取代程序员吗?揭穿神话 世界观天下
7999元起 国人买iPhone 14 Pro需9.5%年收入引热议:你多久才能买?
外星人在美一户人家后院活动?别信:3D建模软件做的_当前资讯
寻找新的 AI 应用程序和 ChatGPT 工具的前 5 个网站
部署zabbix5_每日资讯
北京通州一业主私家车长期占用消防车通道且拒不整改 遭行政拘留7日
科学家付巧妹获得联合国首位阿勒福赞奖 从进化角度为人类健康问题带来新见解
郑州将于6月份发放5000万元汽车消费券 不限购买者户籍
著名球星贝克汉姆使用中文为中国粉丝献上端午祝福 网友热情回应
微软宣布Xbox Series X和XGP订阅服务将涨价 称其反应市场的竞争情况
美国亿万富翁家庭以91万元年薪招聘住家狗保姆 将狗的幸福放在首位
顺丰旗下大型无人机FH-98顺利降落 最大起飞重量5.25吨
余承东曾预告!中国自动驾驶迎来大进展:官方首次表态L3商用
天天微资讯!《英雄联盟》新英雄纳亚菲利玩法公布 这是真的狗!
为减少内卷 四家头部猪企发起“互不挖人公约”
贵州贵阳周边现奇幻红色湖泊 吸引众多游客前往打卡
第28届白玉兰奖评委见面会举行 《庆余年》导演称应杜绝文盲演员
吉林一市民驾车偶遇“拦路虎” 强调路边遇到老虎不要开车窗或下车
《超级马里奥兄弟 惊奇》公布 预计于本年10月20日发售
我国最长的深水油气管道完工 区域最大作业水深近1000米
辽宁铁岭一位母亲带着高考结束的女儿去整容 当事人提醒勿盲目去跟风
北京宣布对电动自行车进行管理 因含有尖锐的金属杆导致安全系数高
视讯!中国乡村“现象级”体育赛事频现
曾排名国内服装品牌第一:拉夏贝尔正式破产清算 世界快讯
世界今日讯!Java基础复习笔记详细版
xxx.opt-1.pyc、xxx.opt-2.pyc和xxx.pyc的区别-热点在线
每日热议!redis简单介绍和使用
尤文官方:35岁迪马利亚自由身离队,据悉将加盟本菲卡
高考生注意!明天起多地高考出分_世界新要闻
全球微动态丨盘点粽子界“显眼包”:各种奇葩口味粽子层出不穷
订单爆了?日产就奇骏e-POWER发布情况说明:满30天未提车获补偿|每日快报
Go-指针篇 世界滚动
首屈一指的首屈是什么意思(首屈一指的指是哪个指)_最资讯
长白山人参鲜参大促!10支独立包装券后仅39.9:煲汤超营养|报道
【天天新视野】99%人没用过的电视隐藏功能 宅家也能爽翻天
今日热搜:西湖边上卖花郎和卖花姑娘走红 本人:希望学习分享中国传统文化
京东四面面经整理|环球百事通
全球动态:OPEN AI 全新版本在线免费体验2.0.0支持最新对话模型,和16K上下文
学霸王小九防骗视频_学霸征集令 天天滚动
世界热资讯!古人过端午仪式感有多足?非常讲究
全球观天下!大雨中校长毕业典礼致辞:只念了标题 为了让学生少淋雨
宿命还是巧合?泰坦尼克号遇难者后裔丈夫在失踪观光潜艇上
世界视讯!专题速览:成都哪家医院治疗外阴白斑强
正统新作《超级马里奥兄弟惊奇》公布!10月20日发售
植物人父亲帮儿子挠痒引关注 背后故事暖心:为救人遭重创
焦点速递!在AI大爆发的背景下,企业管理软件有什么冲击
世界观焦点:国足未来再添新对手:排名157的也门晋级U17亚洲杯8强!
中国天眼取得重要成果!发现迄今轨道周期最短脉冲双星 最新资讯
天天短讯!会有奇迹吗?参观泰坦尼克号失联潜艇氧气即将耗尽 专家分析两种故障
深圳拟立法规范预付式消费
不限速超良心!阿里云盘iOS 4.8.1版发布:会员能看2K臻彩视频了
世界热消息:腾讯《王者荣耀》衍生游戏《星之破晓》开启预约:已拿到版号
折叠屏比直板手机都便宜!moto razr 40即将开卖:3999元
网友济南街头偶遇韦东奕:90后北大“扫地僧” 数学天才
东京股市小幅上扬_焦点滚动
陈思诚监制 悬疑片《消失的她》上映:打破过去5年端午档累计票房纪录