Android開發:使用EasyPay打造全能移動支付框架

前言

在這以前,筆者發佈了兩篇移動app支付相關博文,獲得一些關注,可是因爲博文中代碼零碎,有些讀者私信博主,以及加筆者qq諮詢相關問題。考慮到這些,筆者把以前項目中的支付相關代碼從業務中剝離出來,重構,造成了如今的EasyPayjavascript

EasyPay項目地址:github.com/xiong-it/Ea…,歡迎star & forkjava

本文原創做者:MichaelX,博客連接:blog.csdn.net/xiong_it 轉載請註明來源,謝謝合做!git

本篇文章已受權微信公衆號 guolin_blog(郭霖)獨家發佈.複製代碼

EasyPay是什麼

EasyPay旨在幫助Android開發者快速集成接入移動支付SDK,其中包括主流的微信APP支付支付寶APP支付,銀聯支付(開發中)。github


爲何要用EasyPay

EasyPay和微信支付等移動支付SDK的區別

EasyPay是一個開源的聚合支付可定製化框架,目前已集成微信APP支付,支付寶APP支付SDK。銀聯支付(開發中)。json

Android開發者只須要簡單調用EasyPay的幾行代碼,便可調起支付客戶端,完成支付流程,獲得支付結果。api

EasyPay宗旨:簡單,易用,可擴展。安全

EasyPay和其餘第三方聚合支付的區別

第三方聚合支付,如知名的Ping++,須要同時接入其Server端SDK和Client端SDK,使接入企業面臨風險:服務器

一、信息泄露風險
二、支付集成服務商提供服務跟不上商戶業務發展須要的風險
三、支付集成服務商系統穩定性、安全性的風險
四、資金安全風險
---知乎:《使用第三方支付集成有何風險,例如 Beecloud 或者 Ping++?》微信

此外,天下沒有免費的午飯,第三方聚合支付平臺通常須要收取5%~15%左右的手續費等各類服務費用,使得接入企業收益受損。網絡

而使用開源的EasyPay,代碼透明,與Server端無關,Android開發者只須要根據本身需求對EasyPay進行個性化定製,便可打造一個支付平臺齊全的無風險支付框架。可是客觀的講,這同時也是EasyPay的短板,它只簡化了APP端開發者的調用工做,Server端工做人員仍須要按照移動支付第三方平臺的SDK文檔進行開發。

若是以爲EasyPay對你有幫助,你付出的僅僅是一個點贊,或者一個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() {
            @Override
            public void onPayInfoRequetStart() {
                // TODO 在此處作一些loading操做,progressbar.show();
            }

            @Override
            public void onPayInfoRequstSuccess() {
                // TODO 能夠將loading狀態去掉了。請求預支付信息成功,開始跳轉到客戶端支付。
            }

            @Override
            public void onPayInfoRequestFailure() {
                // / TODO 能夠將loading狀態去掉了。獲取預支付信息失敗,會同時獲得一個支付失敗的回調。
            }
        }).toPay(new OnPayResultListener() {

            @Override
            public void onPaySuccess(PayWay payWay) {
                // 支付成功
            }

            @Override
            public void onPayCancel(PayWay payWay) {
                // 支付流程被用戶中途取消
            }

            @Override
            public 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格式,因此你只須要動動小手修改EasyPay/library中網絡請求和解析*部分代碼便可.

假如你的支付api接口文檔以下:
host:api.yourhost.com/
路徑:pay/
請求方式爲:Http,get
請求須要的參數字段爲:

假設你想使用的網絡框架是Retrofit2。那麼network/NetwrokClientInterf的實現類RetrofitClient須要作以下修改:
因爲Retrofit請求通常須要藉助一個xxService類,那麼實際修改的是xxService類,以EasyPay源碼中的network/PrePayInfoService爲例,它須要修改爲以下:

public interface PrePayInfoService {
    @GET("pay/")
    Call<ResponseBody> getPrePayInfo(@Query("pay_way")String payWay, @Query("price") String GoddsPrice, @Query("goods_name") String goodsName, @Query(("goods_introduction")) String goodsIntroduce);

   /*@POST("pay/") Call<ResponseBody> postPrePayInfo(@Query("pay_way")String payWay, @Query("price") String GoddsPrice, @Query("goods_name") String goodsName, @Query(("goods_introduction")) String goodsIntroduce);*/
}
// (如需更多字段請自行添加參數)複製代碼

當網絡鏈接使用其餘框架時,須要在NetworkClientInterf對應的實現類中修改路徑及請求參數字段。

假如當前用戶使用了微信支付,當服務器返回的數據格式以下時:

假如json的格式以下:


以大家server端人員給出的實際json字段來修改 pay/PrePayInfo

當爲其餘支付方式時,也須要在對應的PayStragetyInterf支付實現策略類中修改解析。

library源碼中須要修改的地方都打上了TODO標籤,導入Android Studio後,以下圖方式查看:

TODO


開發者能作什麼

EasyPay目前實現了微信,支付寶app支付,若是你以爲支付邏輯代碼不OK?徹底能夠經過實現PayStragetyInterf來徹底重寫一個本身的微信,支付寶支付策略。

EasyPay支持的平臺(微信,支付寶,銀聯)不在你的需求範圍內?能夠經過實現PayStragetyInterf來擴展一種支付方式。

EasyPay支持的網絡框架(HttpUrlConnection,OkHttp3(前二者嚴格意義上不屬於框架),Volley,Retrofit2)用的不順手?那就本身擼一個NetworkClientInterf接口的實現類來實現本身的網絡請求客戶端。

其餘,仍是不夠知足你的需求,歡迎提出issue,或者加入一塊兒開發,完善該repo,打造一個更加優秀的EasyPay。


本文原創做者:MichaelX,博客地址:blog.csdn.net/xiong_it.轉載…

歡迎光臨:MichaelX's Blog

後記

EasyPay算筆者的第一個正式的開源項目吧,受益於開源社區,也但願爲開源奉獻一點力量,幫助一些開發者快速打造一個無風險的功能完備的支付框架。

EasyPay項目地址

github.com/xiong-it/Ea…

附錄

移動支付開發博文

微信支付:Android App支付系列(一):微信支付接入詳細指南
支付寶:Android App支付系列(二):支付寶SDK接入詳細指南

移動支付的流程

  1. APP將商品信息post給APP服務器
  2. APP服務器攜帶商品信息和一些其餘信息請求支付平臺服務器,獲取預支付訂單信息
  3. APP服務器獲得預支付訂單信息並返給APP
  4. APP解析預支付訂單信息
  5. APP利用解析後的預支付信息調起支付客戶端(微信,支付寶,等)
  6. 支付客戶端將支付結果返給APP
  7. APP向用戶展現支付結果

EasyPay的回調errCode錯誤碼列表

通用errCode 意義
1 當前網絡無鏈接(還沒有進入支付階段)
2 請求APP服務器超時(還沒有進入支付階段)
-1 支付失敗-緣由未知,須要開發者手動排查
微信errCode 通常不會碰到
-3 微信接收支付請求失敗
-4 微信支付認證失敗,拒絕支付交易
-5 微信版本低,不支持交易
-6 微信拒絕了支付交易
-7 未安裝微信客戶端,交易失敗
支付寶errCode 通常不會碰到
8000 支付結果待確認,生成了交易訂單,可是未支付。
6002 網絡差致使支付失敗
6004 支付結果未知
6005 支付失敗,緣由未知
相關文章
相關標籤/搜索