作者:朱晓辉Allen

链接:https://juejin.im/post/5a90dd3a6fb9a0634912b755

前言

前段时间由于项目需求,移除了项目中的微信支付SDK和支付宝支付SDK,这种情况下需要自己搞定支付,第一时间考虑到的是使用openshare,但是当下载openshare下来后发现,openshare的支付接口,并不能直接替换官方SDK支付接口,

官方SDK的实现逻辑是后台订单签名完成后,客服端传签名信息及参数给支付SDK,支付SDK生成协议url,然后拉起第三方支付APP,

而openshare的支付接口是直接传拉起支付的协议url地址,将生成协议url地址的操作也交给后台来生成,

这样的话后台需要修改代码,

能否不修改后台代码,弄一个支付接口直接替换官方SDK支付接口,实现无缝对接呢,于是就研究了下微信和支付宝支付时APP间通讯关系,最后封装成XHPayKit.

特性:

 

1.XHPayKit拥有和官方SDK类似接口,可以直接替换官方SDK支付接口,如果你使用过官方SDK,那么转换为本库你只需花费极短时间.

2.XHPayKit只有10kb大小,不用导入任何依赖库,便可实现微信支付、支付宝支付,如果你想为项目瘦身或由于某种原因,不想使用官方SDK实现支付功能,此库将是一个不错的选择.

3.XHPayKit使用时,不需要配置微信等平台appid等信息,服务端配置就可以了,因为后台签名订单时会返回appid等信息给客户端.

注意:

1.先在微信、支付宝开放平台注册你的应用,并获得支付能力

2.导入此库,并请将 weixin 、 alipay 字段添加到info.plist白名单

3.添加自己APP URL Schemes,和微信回调URL Schemes,详见README文档

使用方法:

 

1.微信支付

//微信支付参数,下面7个参数,由后台签名订单后生成,并返回给客服端(与官方SDK一致)

//注意:请将下面参数设置为你自己真实订单签名后服务器返回参数,便可进行实际支付

XHPayWxReq *req = [[XHPayWxReq alloc] init];

req.openID = @"";

req.partnerId = @"";

req.prepayId = @"";

req.nonceStr = @"";

req.timeStamp = 1518156229;

req.package = @"";

req.sign = @"";

//传入订单模型,拉起微信支付

[[XHPayKit defaultManager] wxpayOrder:req completed:^(NSDictionary *resultDict) {

NSLog(@"支付结果:\n%@",resultDict);

NSInteger code = [resultDict[@"errCode"] integerValue];

if(code == 0){//支付成功

}

}];

2.支付宝支付

//支付宝订单签名,此签名由后台签名订单后生成,并返回给客户端(与官方SDK一致)

//注意:请将下面值设置为你自己真实订单签名,便可进行实际支付

NSString *orderSign = @"很长的一串支付宝订单签名";

//传入支付宝订单签名 和 自己App URL Scheme,拉起支付宝支付

[[XHPayKit defaultManager] alipayOrder:orderSign fromScheme:@"XHPayKitExample" completed:^(NSDictionary *resultDict) {

NSLog(@"支付结果:\n%@",resultDict);

NSInteger status = [resultDict[@"ResultStatus"] integerValue];

if(status == 9000){//支付成功

}

}];

3.在Appdelegate中添加以下代码 - 处理第三方支付跳回商户app携带的支付结果Url

#if __IPHONE_OS_VERSION_MAX_ALLOWED >= __IPHONE_9_0

/** iOS9及以后 */

- (BOOL)application:(UIApplication *)app openURL:(NSURL *)url options:(NSDictionary<UIApplicationOpenURLOptionsKey, id> *)options

{

BOOL result = [[XHPayKit defaultManager] handleOpenURL:url];

if (!result) {//这里处理其他SDK(例如QQ登录,微博登录等)

}

return result;

}

#endif

/** iOS9以下 */

- (BOOL)application:(UIApplication *)application openURL:(NSURL *)url sourceApplication:(NSString *)sourceApplication annotation:(id)annotation

{

BOOL result = [[XHPayKit defaultManager] handleOpenURL:url];

if (!result) {//这里处理其他SDK(例如QQ登录,微博登录等)

}

return result;

}

其它接口:

/**

是否安装微信

@return 已安装YES,未安装NO

*/

+(BOOL)isWxAppInstalled;

/**

是否安装支付宝

@return 已安装YES,未安装NO

*/

+(BOOL)isAliAppInstalled;

支付结果resultDict释义:

微信

{

"errCode":0,

"errStr":"成功"

}

//以下状态码含义与官方SDK一致

errCode = 0,成功

errCode = -1,普通错误类型

errCode = -2,用户点击取消并返回

errCode = -3,发送失败

errCode = -4,授权失败

errCode = -5,微信不支持

支付宝

{

"result":"",

"resultStatus":"9000",

"memo":"支付成功"

}

//以下状态码含义与官方SDK一致

resultStatus = 9000,支付成功

resultStatus = 8000,正在处理中,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态

resultStatus = 4000,支付失败

resultStatus = 5000,重复请求

resultStatus = 6001,用户中途取消

resultStatus = 6002,网络连接出错

resultStatus = 6004,支付结果未知(有可能已经支付成功),请查询商户订单列表中订单的支付状态

小结:

 

XHPayKit的实现非常简单,感兴趣的同学可以下载下来研究下支付时APP间通讯.

代码地址:github.com/CoderZhuXH/…

iOS不用官方SDK实现微信和支付宝支付XHPayKit的更多相关文章

  1. 微信和支付宝支付模式详解及实现(.Net标准库)- OSS开源系列

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  2. 微信和支付宝支付模式详解及实现(.Net标准库)

    支付基本上是很多产品都必须的一个模块,大家最熟悉的应该就是微信和支付宝支付了,不过更多的可能还是停留在直接sdk的调用上,甚至和业务系统高度耦合,网上也存在各种解决方案,但大多形式各异,东拼西凑而成. ...

  3. Android H5调起原生微信或支付宝支付

    Android H5调起原生微信或支付宝支付 WebView调用原生微信或支付宝回调:其原理就是在shouldOverrideUrlLoading(final WebView view, String ...

  4. 使用开源库MAGICODES.WECHAT.SDK进行微信公众号支付开发

    概要 博客使用Word发博,发布后,排版会出现很多问题,敬请谅解.可加群获取原始文档. 本篇主要讲解微信支付的开发流程,相关业务基于MAGICODES.WECHAT.SDK实现.通过本篇教程,您可以很 ...

  5. MUI 微信 和支付宝支付 (前台代码)

    <!-- 校园公告详情界面 用于显示校园公告的详情信息 在校园公告界面点击某一条目后 进入本界面查看详情 --> <!DOCTYPE html> <html> &l ...

  6. 微信端支付宝支付,iframe改造,解决微信中无法使用支付宝付款和弹出“长按地址在浏览器中打开”

    微信对支付宝的链接屏蔽了, https://mapi.alipay.com/gateway.do?_input_charset=utf-8&notify_url=http%3A%2F%2Fzh ...

  7. 关于Java调用接入微信、支付宝支付提现

    前言: 本篇文章介绍关于自己写的一个集成微信.支付宝的支付.提现等功能的介绍,本项目已在码云上进行开源,欢迎大家一起来进行改造,使进行更好的创新供大家使用:也有对应的pom文件坐标可以导入,因目前不知 ...

  8. 微信、支付宝支付SDK

    1.首先是下载SDK,其对应的SDK在mvn上下载不了,需要手动配置到仓库 支付宝SDK下载地址 https://docs.open.alipay.com/54/103419 微信SDK官方下载地址  ...

  9. Python支付接口汇总大全(包含微信、支付宝等)

    微信接口 wzhifuSDK- 由微信支付SDK 官方PHP Demo移植而来,v3.37下载地址 weixin_pay- 是一个简单的微信支付的接口 weixin_pay- 微信支付接口(V3.3. ...

随机推荐

  1. java内存模型原理阅读总结

    Java内存模型可以理解为在特定操作协议下,对特定的内存或高速缓存进行读写访问的过程抽象.不同架构的物理计算机可以有不一样的内存模型,java虚拟机也有自己的内存模型,java虚拟机规范中试图定义一种 ...

  2. 梁勇Java语言程序设计第三章全部例题 为第五次作业

    完成例题3-1,通过系统当前时间毫秒值获取随机10以内的整数判断加的结果是否正确,不用if语句 package com.swift; import java.util.Scanner; public ...

  3. 新装Ubuntu后的一些配置

    一:Ubuntu 16.04 开启root用户和使用root用户登陆 1. 编辑/etc/lightdm/lightdm.conf autologin-guest=false autologin-us ...

  4. 【Django】Django中的模糊查询以及Q对象的简单使用

    Django中的模糊查询: 需要做一个查找的功能,所以需要使用到模糊查询. 使用方法是:字段名加上双下划线跟上contains或者icontains,icontains和contains表示是否区分大 ...

  5. PHP如何严格控制session过期时间

    第一种回答 那么, 最常见的一种回答是: 设置Session的过期时间, 也就是session.gc_maxlifetime, 这种回答是不正确的, 原因如下: 1. 首先, 这个PHP是用一定的概率 ...

  6. oop 单例模式

  7. Python周末21天笔记

    模块一: 基础相互据类型之间的相互转换 1. 字符串str 与 列表 list 与字典 dict 以及 元祖tuple的转换 例一: 把字典的key和value的值取出来,按照顺序存入到list中 d ...

  8. [译]The Python Tutorial#3. An Informal Introduction to Python

    3. An Informal Introduction to Python 在以下示例中,输入和输出以提示符(>>>和...)的出现和消失来标注:如果想要重现示例,提示符出现时,必须 ...

  9. greenplum-时间处理

    工作中遇到,需要改变两周以前的数据状态,于是查了下资料,原来数据库直接就可以处理,所以分享给大家! 在PostgreSQL中可以直接对时间进行加减运算:. SELECT now()::timestam ...

  10. MVC中Spring.net 对基类控制器无效 过滤器控制器无效

    比如现在我又一个BaseController作为基类控制器,用于过滤权限.登录判断等作用,其它控制由原本的继承Controller,改为继承BaseController.然后BaseControlle ...