文章目录

  • @[toc] 前言
  • EasyPay是什么
  • 为什么要用EasyPay
    • EasyPay和微信支付等移动支付SDK的区别
    • EasyPay和其他第三方聚合支付的区别
  • EasyPay怎么用
  • 开发者需要做什么

前言

在这之前,笔者发布了两篇移动app支付相关博文,得到一些关注,但是由于博文中代码零碎,有些读者私信博主,以及加笔者qq咨询相关问题。考虑到这些,笔者把之前项目中的支付相关代码从业务中剥离出来,重构,形成了现在的[EasyPay][1]。

EasyPay项目地址:[https://github.com/xiong-it/EasyPay][5]
姊妹项目EasyShare:https://blog.csdn.net/Xiong_IT/article/details/89384884

本文原创作者:MichaelX,博客链接:[http://blog.csdn.net/xiong_it][2] 转载请注明来源,谢谢合作!


EasyPay是什么

EasyPay旨在帮助Android开发者快速集成接入移动支付SDK,其中包括主流的微信APP支付支付宝APP支付,银联支付(开发中)。


为什么要用EasyPay

EasyPay和微信支付等移动支付SDK的区别

EasyPay是一个开源的聚合支付可定制化框架,目前已集成微信APP支付,支付宝APP支付SDK。银联支付(开发中)。

Android开发者只需要简单调用EasyPay的几行代码,即可调起支付客户端,完成支付流程,得到支付结果。

EasyPay宗旨:简单,易用,可扩展。

EasyPay和其他第三方聚合支付的区别

第三方聚合支付,如知名的Ping++,需要同时接入其Server端SDK和Client端SDK,使接入企业面临风险:

1、信息泄露风险
2、支付集成服务商提供服务跟不上商户业务发展需要的风险
3、支付集成服务商系统稳定性、安全性的风险
4、资金安全风险
—知乎:[《使用第三方支付集成有何风险,例如 Beecloud 或者 Ping++?》][4]

此外,天下没有免费的午餐,第三方聚合支付平台一般需要收取**5%~15%**左右的手续费等各种服务费用,使得接入企业收益受损。

而使用开源的[EasyPay][5],代码透明,与Server端无关,Android开发者只需要根据自己需求对EasyPay进行个性化定制,即可打造一个支付平台齐全的无风险支付框架。但是客观的讲,这同时也是EasyPay的短板,它只简化了APP端开发者的调用工作,Server端工作人员仍需要按照移动支付第三方平台的SDK文档进行开发。

如果觉得[EasyPay][6]对你有帮助,你付出的仅仅是一个点赞,或者一个star或者fork,如果不满意,请帮忙提issue指出,而不是5%-15%左右的手续费等各种服务费用。

通过阅读EasyPay源码,你可以知道移动支付的流程是怎样的:

APP->APP服务器->支付平台后台服务器->APP服务器->APP->支付客户端->APP

通过扩展EasyPay,你可以较快的搭建一个私有的功能完善的支付框架。


EasyPay怎么用

用户场景:

APP用户选择一个价格为666元的商品:“皮皮虾”,商品描述:“此商品属性过于强大,难以调教,一般人切勿轻易购买,吼吼!”,然后用户进入收款台,选择了微信支付。

好勒,皮皮虾,咱们走!此处省略:皮皮虾,咱们走.jpg

 PayParams params = new PayParams.Builder(this).wechatAppID("your_wechat_appid")// 仅当支付方式选择微信支付时需要此参数.payWay(PayWay.WechatPay).goodsPrice(66600)// 单位为:分.goodsName("皮皮虾").goodsIntroduction("此商品属性过于强大,难以调教,一般人切勿轻易购买,吼吼!").httpType(HttpType.Get).httpClientType(NetworkClientType.Retrofit).requestBaseUrl("http://blog.csdn.net/")// 此处替换为为你的app服务器host主机地址.build();EasyPay.newInstance(params).requestPayInfo(new OnPayInfoRequestListener() {@Overridepublic void onPayInfoRequetStart() {// TODO 在此处做一些loading操作,progressbar.show();}@Overridepublic void onPayInfoRequstSuccess() {// TODO 可以将loading状态去掉了。请求预支付信息成功,开始跳转到客户端支付。}@Overridepublic void onPayInfoRequestFailure() {// / TODO 可以将loading状态去掉了。获取预支付信息失败,会同时得到一个支付失败的回调。}}).toPay(new OnPayResultListener() {@Overridepublic void onPaySuccess(PayWay payWay) {// 支付成功}@Overridepublic void onPayCancel(PayWay payWay) {// 支付流程被用户中途取消}@Overridepublic void onPayFailure(PayWay payWay, int errCode) {// 支付失败,errCode码详见来源博客或者github项目主页的README文档}});

开发者调用步骤:

  1. 通过建造者模式创建支付参数PayParams实例并传入EasyPay的创建方法中
  2. 传入支付结果回调接口实例得到支付结果回调

假如你的app中每个商品有id,请求服务器时可以用商品id代替价格,让服务器自己去查询价格,防止客户端中的商品价格被恶意修改。


开发者需要做什么

上一节是开发者在Activity/Fragment之类的View层调用代码,除此之外,开发者还需要做一些少量的额外的工作。

需要导入EasyPay/library源码依赖并修改app客户端相关文件

  1. 下载EasyPay源码到本地
  2. 在Android Studio中打开你的app项目
  3. Android Studio左上角File->New->Import Module->… 选择library目录导入,app会自动依赖library这个module
  4. 复制EasyPay/samplewxapi包到你的包路径下,假如你的包名:com.app.payclient,那么wxapi包应该放在payclient包下面
  5. 按照EasyPay/sampleAndroidMenifest.xml文件修改你的清单文件
  6. 按照EasyPay/sampleproguard-rules.pro修改你的混淆文件

需要修改服务器请求路径和请求字段和返回的json解析

由于笔者并不知道你的服务器地址和请求路径及字段和返回json格式,所以你只需要动动小手改下library中的相应代码即可。

假如你的支付api接口文档如下:
host:http://api.yourhost.com/
路径:pay/
请求方式为:Http,get
请求需要的参数字段为:

字段 类型 意义
pay_way int 支付方式:0-微信,1-支付宝,2-银联 等
price int 商品价格,单位:人民币-分
goods_name String(128) 商品名称,将在支付客户端展示
goods_introduction String(512) 商品描述,微信支付可填,支付宝必填

假设你想使用的网络框架是**Retrofit2**。那么`network/NetwrokClientInterf`的实现类RetrofitClient需要做如下修改: 由于Retrofit请求一般需要借助一个xxService类,那么实际修改的是xxService类,以EasyPay源码中的`network/PrePayInfoService`为例,它需要修改成如下: ```java public interface PrePayInfoService { @GET("pay/") Call getPrePayInfo(@Query("pay_way")String payWay, @Query("price") String GoddsPrice, @Query("goods_name") String goodsName, @Query(("goods_introduction")) String goodsIntroduce);

/@POST(“pay/”)
Call postPrePayInfo(@Query(“pay_way”)String payWay, @Query(“price”) String GoddsPrice, @Query(“goods_name”) String goodsName, @Query((“goods_introduction”)) String goodsIntroduce);
/
}
// (如需更多字段请自行添加参数)

**当网络连接使用其他框架时,需要在NetworkClientInterf对应的实现类中修改路径及请求参数字段。**假如当前用户使用了**微信支付**,当服务器返回的数据格式如下时:
字段|类型|意义
-|-|-
errCode|int|错误码,0表示数据正确返回
errString|String|错误提示
data|String|返给客户端的json数据假如json的格式如下:
字段|类型|意义
-|-|-
appid|String|微信appid
partnerid|String|商户号
prepayid|String|预支付交易id
package|String|固定值:Sign=WXPay
noncestr|String|随机字符串
timestamp|String|时间戳
sign|String|签名<br/>
以你们server端人员给出的实际json字段来修改`pay/PrePayInfo`。**当为其他支付方式时,也需要在对应的PayStragetyInterf支付实现策略类中修改解析。**library源码中需要修改的地方都打上了`TODO`标签,导入Android Studio后,如下图方式查看:
![TODO](https://img-blog.csdn.net/20170322143832260?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvWGlvbmdfSVQ=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)----------开发者能做什么
=======
EasyPay目前实现了微信,支付宝app支付,如果你觉得支付逻辑代码不OK?完全可以通过实现PayStragetyInterf来完全重写一个自己的微信,支付宝支付策略。EasyPay支持的平台(微信,支付宝,银联)不在你的需求范围内?可以通过实现PayStragetyInterf来扩展一种支付方式。EasyPay支持的网络框架(HttpUrlConnection,OkHttp3(前两者严格意义上不属于框架),Volley,Retrofit2)用的不顺手?那就自己撸一个NetworkClientInterf接口的实现类来实现自己的网络请求客户端。其他,还是不够满足你的需求,欢迎提出issue,或者加入一起开发,完善该repo,打造一个更加优秀的EasyPay。----------
> 本文原创作者:[MichaelX](http://blog.csdn.net/xiong_it),博客地址:http://blog.csdn.net/xiong_it.转载请注明来源欢迎光临:[MichaelX's Blog](https://xiong-it.github.io)后记
==
EasyPay算笔者的第一个正式的开源项目吧,受益于开源社区,也希望为开源奉献一点力量,帮助一些开发者快速打造一个无风险的功能完备的支付框架。EasyPay项目地址
-----------
[https://github.com/xiong-it/EasyPay][5]附录
==移动支付开发博文
---------
微信支付:[Android App支付系列(一):微信支付接入详细指南][7]
支付宝:[Android App支付系列(二):支付宝SDK接入详细指南][8]移动支付的流程
-------1. APP将商品信息post给APP服务器2. APP服务器携带商品信息和一些其他信息请求支付平台服务器,获取预支付订单信息3. APP服务器得到预支付订单信息并返给APP4. APP解析预支付订单信息5. APP利用解析后的预支付信息调起支付客户端(微信,支付宝,等)6. 支付客户端将支付结果返给APP7. APP向用户展示支付结果EasyPay的回调errCode错误码列表
----------------------**通用errCode**|**意义**
-|-
1|当前网络无连接(尚未进入支付阶段)
2|请求APP服务器超时(尚未进入支付阶段)
-1|支付失败-原因未知,需要开发者手动排查
**微信errCode**|一般不会碰到
-3|微信接收支付请求失败
-4|微信支付认证失败,拒绝支付交易
-5|微信版本低,不支持交易
-6|微信拒绝了支付交易
-7|未安装微信客户端,交易失败
**支付宝errCode**|一般不会碰到
8000|支付结果待确认,生成了交易订单,但是未支付。
6002|网络差导致支付失败
6004|支付结果未知
6005|支付失败,原因未知<EasyPay内部流程步骤:1. EasyPay得到PayParams对象,解析得到下单所需要的基本信息2. EasyPay通过简单工厂创建出用户选择的网络请求框架对象3. EasyPay使用网络框架对象请求APP服务器获取预支付信息4. EasyPay通过策略模式进行支付方式分发-跳转到指定的客户端进行支付5. EasyPay向开发者回调支付结果>[1]: https://github.com/xiong-it/EasyPay[2]: http://blog.csdn.net/xiong_it[3]: https://github.com/xiong-it/EasyPay[4]: https://www.zhihu.com/question/31237376[5]: https://github.com/xiong-it/EasyPay[6]: https://github.com/xiong-it/EasyPay[7]: http://blog.csdn.net/xiong_it/article/details/51685033[8]: http://blog.csdn.net/xiong_it/article/details/51819559

Android开发:使用EasyPay打造全能移动支付框架相关推荐

  1. Android开发:app工程集成银联支付功能(客户端)

    Android开发:app工程集成银联支付功能(客户端) email:chentravelling@163.com 上一篇博文完成了服务器端的集成,可参考: Android开发:app工程集成银联支付 ...

  2. Android 开发之手把手教你写 ButterKnife 框架(三)

    系列文章目录导读: Android开发之手把手教你写ButterKnife框架(一) Android开发之手把手教你写ButterKnife框架(二) Android开发之手把手教你写ButterKn ...

  3. Android开发:app工程集成银联支付功能(服务器端)

    一功能描述 二实现过程 1下载银联支付SDK和Demo 1银联商家服务地址httpsopenunionpaycomajwebindex 2下载的文件如下 2集成过程 1先试官方Demo 2集成到自己的 ...

  4. android 开发从入门到精通

    Android-Tips This is an awesome list of tips for android. If you are a beginner, this list will be t ...

  5. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版

    前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...

  6. Android开发,你所不知道的Android原生开发的现状

    此外还有许多针对Android的非关系型的数据库,例如Realm,Parse,Firebase,ObjectBox等(其中有些仍在使用SQLite).如果我没记错的话,它们中的大多数(甚至全部)都具有 ...

  7. Android开发高手课笔记--如何打造高质量应用?

    前言 学习<Android开发高手课>也有一段时间了,确实对技术的提高很有帮助,可以开拓自己的视野.想利用这一段时间好好整理下学习笔记,以便回顾.由于版权问题,后续笔记不再公开,感兴趣可扫 ...

  8. Android开发笔记(一百四十六)仿支付宝的支付密码输入框

    编辑框EditText算是Android的一个基础控件了,表面上看,EditText只负责接收用户手工输入的文本:可实际上,要把这看似简单的文本输入做得方便易用,并不是一个简单的事情.因为用户可能希望 ...

  9. Android开发笔记(一百零六)支付缴费SDK

    第三方支付 第三方支付指的是第三方平台与各银行签约,在买方与卖方之间实现中介担保,从而增强了支付交易的安全性.国内常用的支付平台主要是支付宝和微信支付,其中支付宝的市场份额为71.5%,微信支付的市场 ...

最新文章

  1. CCS5.2 Graph的使用方法及步骤 FFT
  2. 成功解决TypeError: tuple indices must be integers or slices, not str
  3. 用numpy,matplotlib库画笛卡尔爱心曲线
  4. 纸机器人的折法_好神奇!他们竟用一张纸折成了一个机器人
  5. java android rsa加密解密_Android RSA数据加密与Java服务端RSA私钥解密出错问题
  6. python中if控制语句_Python中流程控制语句之IF语句
  7. 华为发布“吓人技术”GPU Turbo
  8. 力扣104. 二叉树的最大深度(JavaScript)
  9. concurrentbag 删除_你知道吗?这样删除iPhone中的APP腾出的空间会更大
  10. python后台Flask 快速入门
  11. matlab-plot绘制点线图
  12. 概率论 计算机论文,《概率论与数理统计》毕业论文
  13. 华为 eNSP模拟器安装教程
  14. Linux串口调试工具,可视化界面
  15. 如何做好一位合格qc_如何做好现场QC,一位老QC的经验分享
  16. 盖洛普 之 首先打破一切常规
  17. 用3Ds Max做三维场景建模
  18. 王垠—写给清华大学的退学申请
  19. 数据库服务器硬件运行环境,数据库及WEB服务器环境部署硬件配置模板
  20. 上班假装很忙,下班装逼唬妹子的几个神器,人人都能用

热门文章

  1. desktop不可用。如果该位置位于这台电脑上,请确保设备或驱动器已连接,或者光盘已插入。如果该位置位于网络上请确保已连接到网络或Internet,然后重试。如果仍然找不到该位置,则他可能已移动或删除
  2. Unity3D 动态加载本地/网络GLB模型
  3. 激光雷达和相机联合标定
  4. 数字图像处理——图像退化(大气湍流模型与运动模糊模型)与图像复原(逆滤波与维纳滤波)
  5. 使用UltraISO制作Ubuntu16.04 U盘启动盘
  6. 消消乐php源码,PHP实现开心消消乐的算法示例分享
  7. Free SQL Server tools that might make your life a little easier
  8. 谢启鸿老师思考题及解答合集
  9. 次要和主要等位基因的定义
  10. 华为云cce生态环境搭建整理