使用 EasyPay 打造全能移動支付框架

qvpk5657 7年前發布 | 20K 次閱讀 安卓開發 Android開發 移動開發

前言

在這之前,筆者發布了兩篇移動app支付相關博文,得到一些關注,但是由于博文中代碼零碎,有些讀者私信博主,以及加筆者qq咨詢相關問題。考慮到這些,筆者把之前項目中的支付相關代碼從業務中剝離出來,重構,形成了現在的 EasyPay 。

EasyPay項目地址: https://github.com/xiong-it/EasyPay

目前項目還沒有readme,這個文章暫且當做readme吧。

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、資金安全風險

此外,天下沒有免費的午餐,第三方聚合支付平臺一般需要收取 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(" 此處替換為為你的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文檔
        }
    });</code></pre> 

開發者調用步驟:

  1. 通過建造者模式創建支付參數PayParams實例并傳入EasyPay的創建方法中
  2. 傳入支付結果回調接口實例得到支付結果回調

假如你的app中每個商品有id,請求服務器時可以用商品id代替價格,讓服務器自己去查詢價格,防止客戶端中的商品價格被惡意修改。

開發者需要做什么

上一節是開發者在Activity/Fragment之類的View層調用代碼,除此之外,開發者還需要做一些少量的額外的工作。

需要理解移動支付的流程

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

需要導入EasyPay/library源碼依賴并修改app客戶端相關文件

  1. 下載EasyPay源碼到本地
  2. 在Android Studio中打開你的app項目
  3. Android Studio左上角File->New->Import Module->... 選擇library目錄導入,app會自動依賴library這個module
  4. 復制 EasyPay/sample 下 wxapi 包到你的包路徑下,假如你的包名: com.app.payclient ,那么wxapi包應該放在payclient包下面
  5. 按照 EasyPay/sample 的 AndroidMenifest.xml 文件修改你的清單文件
  6. 按照 EasyPay/sample 的 proguard-rules.pro 修改你的混淆文件

需要修改服務器請求路徑和請求字段和返回的json解析

由于筆者并不知道你的服務器地址和請求路徑及字段和返回json格式,所以你只需要動動小手改下library中的相應代碼即可。

假如你的支付api接口文檔如下:

host: http://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。

后記

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

EasyPay項目地址

https://github.com/xiong-it/EasyPay

EasyPay的回調errCode錯誤碼列表

通用errCode 意義
1 當前網絡無連接(尚未進入支付階段)
2 請求APP服務器超時(尚未進入支付階段)
-1 支付失敗-原因未知,需要開發者手動排查
微信errCode 一般不會碰到
-3 微信接收支付請求失敗
-4 微信支付認證失敗,拒絕支付交易
-5 微信版本低,不支持交易
-6 微信拒絕了支付交易
-7 未安裝微信客戶端,交易失敗
支付寶errCode 一般不會碰到
8000 支付結果待確認,生成了交易訂單,但是未支付。
6002 網絡差導致支付失敗
6004 支付結果未知
6005 支付失敗,原因未知

 

 

來自:https://juejin.im/post/58d242232f301e007e63bce9

 

 本文由用戶 qvpk5657 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!