开发过支付宝、微信支付的同学都知道,微信的支付 API 设计感觉是 Java 开发工程师写的,远不如支付宝 SDK 的接口设计用起来顺手。在这里,统一封装微信支付和支付宝支付的API,使两种支付方式对外提供一致的调用接口。

   首先我们来看支付宝支付SDK的API是怎么设计的:

/**
* 支付接口
*
* @param orderStr 支付订单信息字串
* @param schemeStr 调用支付的app注册在info.plist中的scheme
* @param completionBlock 支付结果回调Block,用于wap支付结果回调
跳转支付宝支付时只有当processOrderWithPaymentResult接口的completionBlock为nil时会使用这个bolock
*/
- (void)payOrder:(NSString *)orderStr
fromScheme:(NSString *)schemeStr
callback:(CompletionBlock)completionBlock;

  支付宝SDK的设计十分简洁,只有三个参数,分别负责:1.支付信息 2.进程跳转的 scheme 3.支付结果回调 block。

  然后看一下微信支付的API:

/*! @brief 发送请求到微信,等待微信返回onResp
*
* 函数调用后,会切换到微信的界面。第三方应用程序等待微信返回onResp。微信在异步处理完成后一定会调用onResp。支持以下类型
* SendAuthReq、SendMessageToWXReq、PayReq等。
* @param req 具体的发送请求,在调用函数后,请自己释放。
* @return 成功返回YES,失败返回NO。
*/
+ (BOOL)sendReq:(BaseReq*)req;
/*! @brief 处理微信通过URL启动App时传递的数据
*
* 需要在 application:openURL:sourceApplication:annotation:或者application:handleOpenURL中调用。
* @param url 微信启动第三方应用时传递过来的URL
* @param delegate WXApiDelegate对象,用来接收微信触发的消息。
* @return 成功返回YES,失败返回NO。
*/
+ (BOOL)handleOpenURL:(NSURL *)url delegate:(nullable id<WXApiDelegate>)delegate;

  要发起微信支付,首先要实例化 一个PayReq对象,接着将这个对象的6个字段分别赋值,然后发起支付请求,等从微信返回到APP后,再从代理方法获取支付结果。相比支付宝SDK提供的接口,要繁琐了不少,可见接口设计是多么的重要,(当然支付宝的入参是事先拼接好的,拼接工作可以移交给后端)。

  我们希望不管是微信支付还是支付宝支付,都能有统一风格的调用接口,方便逻辑复用,那么接下来的工作就是通过封装 使这这两者的接口统一。

在这里,我们设想的接口是:

  1. 只有一个入参,组织参数的方式尽量简单
  2. 回调直接给出结果

以下是设计的接口:

typedef void(^PayResult)(PayResponse *result);
typedef void(^wxShareCallback)(int resp);
@interface PaymentHub : NSObject<WXApiDelegate>
/**
获取 单利
@return 返回单利实例
*/
+ (instancetype)hub;
/**
支付宝支付
@param orderStr 支付订单加密信息
@param callback 支付结果回调
*/
- (void)AlipayWithOrder:(NSString *)orderStr callback:(PayResult)callback; /**
微信支付
@param request 微信支付所需参数
@param callback 支付结果回调
*/
- (void)WXpayWithRequest:(PayReq *)request callback:(PayResult)callback; /**
进程间通信处理
@param url 进程间 交换的数据
@param callback 微信分享回调
*/
- (void)handleOpenUrl:(NSURL *)url response:(wxShareCallback)callback;
+ (PayReq *)fromMap:(NSDictionary *)dict;

为了方便组织微信支付所需的字段,fromMap 方法可以将包含数据的字典转换为 一个PayReq 实例对象。在封装里,将微信SDK的 代理指定为 PaymentHub 的实例,在实例内部处理微信的代理回调。

考虑到微信SDK还可能会负责分享,在handleOpenUrl 方法里需要做区分处理。

demo链接

支付宝支付 微信支付SDK接口不统一? 盘他!的更多相关文章

  1. .net core 支付宝,微信支付 二

    源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 今天开始微信支付 微信支付坑比较多,支付流程也不太一样,微信支付需要先生成预 ...

  2. Android接入支付宝和微信支付

    然后把下载下来的aar包,放到项目目录下面的libs目录下,通过下面的gradle依赖进来 // 支付宝 SDK AAR 包所需的配置compile(name: 'alipaySdk-15.6.0-2 ...

  3. tp5支付宝和微信支付

    一.生成二维码给用户进行扫码支付 1.先在vendor目录下加入支付宝和微信支付的引用 2.付款处调用 /** * 订单支付接口 * * @api {post} {:url('order/pay')} ...

  4. ThinkPHP 提供Auth 权限管理、支付宝、微信支付、阿里oss、友盟推送、融云即时通讯、云通讯短信、Email、Excel、PDF 等等

    多功能 THinkPHP 开源框架 项目简介:使用 THinkPHP 开发项目的过程中把一些常用的功能或者第三方 sdk 整合好,开源供亲们参考,如 Auth 权限管理.支付宝.微信支付.阿里oss. ...

  5. iOS三方支付--微信支付/支付宝支付

    一.微信支付 1.注册账号并申请app支付功能 公司需要到微信开放品台进行申请app支付功能 , 获得appid和微信支付商户号(mch_id)和API秘钥(key) . Appsecret(secr ...

  6. android app 集成 支付宝支付 微信支付

    项目中部分功能点需要用到支付功能,移动端主要集成支付宝支付和微信支付 支付宝sdk以及demo下载地址:https://doc.open.alipay.com/doc2/detail.htm?spm= ...

  7. .net core 支付宝,微信支付 一

    源码: https://github.com/aspros-luo/Qwerty.Payment/tree/develop 支付宝支付:参考支付宝sdk及文档,https://docs.open.al ...

  8. Android 支付宝以及微信支付快速接入流程

    简介 随着移动支付的普及,越来越多的App采用第三发支付,在这里我们以支付宝为例,做一个快速集成! 一.Android快速实现支付宝支付 1.首先,我们需要前往支付宝开放平台,申请我们的支付功能:ht ...

  9. 简聊iOS支付集成(支付宝和微信支付)

    一.支付集成是什么 1.现在大部分app都有快捷支付功能,支付集成将第三方支付平台集成到自己的项目中,能够完成自己项目中的支付功能, 二.支付集成的使用 <1>.支付宝: 下载SDK和De ...

随机推荐

  1. Vue日常开发问题

    1.sh: webpack-dev-server: command not found 我的公众号:

  2. 带有Q_OBJECT的类要放在头文件的第一个类位置,否则可能无法moc

    如果头文件中有多个类,带有Q_OBJECT的类要放在头文件的第一个类位置,否则可能无法moc

  3. ZXing生成二维码、读取二维码

    使用谷歌的开源包ZXing maven引入如下两个包即可 <dependency>   <groupId>com.google.zxing</groupId>  & ...

  4. nginx使用与配置入门指南

    这是一篇关于nginx使用与配置的入门指南,但不包括nginx的编译与安装.我假定你知晓如何安装nginx.对大多数Linux系统来说,nginx都已经存在于它们的软件包里,直接使用系统提供的软件管理 ...

  5. 【MongoDB学习之四】索引 聚合 备份与恢复 监控

    环境 MongoDB 4.0 CentOS 6.5_x64 一.索引语法ensureIndex()方法基本语法格式如下所示:>db.COLLECTION_NAME.ensureIndex({KE ...

  6. Android 横竖屏切换处理

    最近在做一个平板项目,有横竖屏切换的问题,写一下处理的方法. 第一种:禁止横竖屏切换. 对于单独的Activity,使用下面的方式直接配置: <activity android:name=&qu ...

  7. Java操作fastDFS

    一.加入Maven依赖 <dependency> <groupId>org.csource</groupId> <artifactId>fastdfs- ...

  8. Linux字符设备驱动基本结构

    1.Linux字符设备驱动的基本结构 Linux系统下具有三种设备,分别是字符设备.块设备和网络设备,Linux下的字符设备是指只能一个字节一个字节读写的设备,不能随机读取设备内存中某一数据,读取数据 ...

  9. java修饰符的权限范围

    java有四个修饰符,分别为public/protected/default/private,这四个修饰符的权限范围是不一样的. public修饰的成员,在同类.同包.子类(继承自本类).其他包中都可 ...

  10. latex 写大论文图目录中图注过长解决方案

    写论文(尤其是学位论文)的时候,Figure通常都是有很长的注释,而Latex的list of figures似乎不能换行(看到有换行的,不过感觉不够美观). 再说,list of figures里面 ...