在這以前,筆者發佈了兩篇移動app支付相關博文,獲得一些關注,可是因爲博文中代碼零碎,有些讀者私信博主,以及加筆者qq諮詢相關問題。考慮到這些,筆者把以前項目中的支付相關代碼從業務中剝離出來,重構,造成了如今的EasyPay。javascript
EasyPay項目地址:github.com/xiong-it/Ea…,歡迎star & forkjava
本文原創做者:MichaelX,博客連接:blog.csdn.net/xiong_it 轉載請註明來源,謝謝合做!git
本篇文章已受權微信公衆號 guolin_blog(郭霖)獨家發佈.複製代碼
EasyPay旨在幫助Android開發者快速集成接入移動支付SDK,其中包括主流的微信APP支付,支付寶APP支付,銀聯支付(開發中)。github
EasyPay是一個開源的聚合支付可定製化框架,目前已集成微信APP支付,支付寶APP支付SDK。銀聯支付(開發中)。json
Android開發者只須要簡單調用EasyPay的幾行代碼,便可調起支付客戶端,完成支付流程,獲得支付結果。api
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,你能夠較快的搭建一個私有的功能完善的支付框架。
用戶場景:
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文檔
}
});複製代碼
開發者調用步驟:
假如你的app中每一個商品有id,請求服務器時能夠用商品id代替價格,讓服務器本身去查詢價格,防止客戶端中的商品價格被惡意修改。
上一節是開發者在Activity/Fragment之類的View層調用代碼,除此以外,開發者還須要作一些少許的額外的工做。
須要導入EasyPay/library源碼依賴並修改app客戶端相關文件
EasyPay/sample
下wxapi
包到你的包路徑下,假如你的包名:com.app.payclient
,那麼wxapi包應該放在payclient包下面EasyPay/sample
的AndroidMenifest.xml
文件修改你的清單文件EasyPay/sample
的proguard-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的格式以下:
pay/PrePayInfo
。
當爲其餘支付方式時,也須要在對應的PayStragetyInterf支付實現策略類中修改解析。
library源碼中須要修改的地方都打上了TODO
標籤,導入Android Studio後,以下圖方式查看:
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算筆者的第一個正式的開源項目吧,受益於開源社區,也但願爲開源奉獻一點力量,幫助一些開發者快速打造一個無風險的功能完備的支付框架。
微信支付:Android App支付系列(一):微信支付接入詳細指南
支付寶:Android App支付系列(二):支付寶SDK接入詳細指南
通用errCode | 意義 |
---|---|
1 | 當前網絡無鏈接(還沒有進入支付階段) |
2 | 請求APP服務器超時(還沒有進入支付階段) |
-1 | 支付失敗-緣由未知,須要開發者手動排查 |
微信errCode | 通常不會碰到 |
-3 | 微信接收支付請求失敗 |
-4 | 微信支付認證失敗,拒絕支付交易 |
-5 | 微信版本低,不支持交易 |
-6 | 微信拒絕了支付交易 |
-7 | 未安裝微信客戶端,交易失敗 |
支付寶errCode | 通常不會碰到 |
8000 | 支付結果待確認,生成了交易訂單,可是未支付。 |
6002 | 網絡差致使支付失敗 |
6004 | 支付結果未知 |
6005 | 支付失敗,緣由未知 |