Commit 21fc5c6c by 严久程

支付模块

parent 8619efbe
......@@ -24,7 +24,7 @@ import com.ydl.media.audio.utils.PlayProgressUtil
import com.ydl.media.view.PlayTypeEnum
import com.ydl.media.view.PlayerFloatHelper
import com.ydl.ydl_image.module.GlideApp
import com.ydl.ydl_pay.CommonPayDialog
import com.yidianling.ydl_pay.CommonPayDialog
import com.ydl.ydl_router.manager.YDLRouterManager
import com.ydl.ydlcommon.adapter.CommonRecyclerAdapter
import com.ydl.ydlcommon.base.BaseActivity
......
......@@ -38,7 +38,7 @@ dependencies {
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
compile "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
......@@ -49,11 +49,23 @@ dependencies {
implementation 'com.facebook.stetho:stetho-okhttp3:1.4.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
//noinspection GradleCompatible
implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'de.greenrobot:eventbus:2.4.0'
api 'com.umeng.sdk:share-wechat:6.9.1'
api rootProject.ext.dependencies["ydl-hnet"]
if (rootProject.ext.dev_mode){
//开发时使用
api project(':ydl-platform')
}else {
//发布时使用
api(rootProject.ext.dependencies["ydl-platform"]) {
transitive = true
}
}
}
repositories {
......
package com.ydl.ydl_pay
package com.yidianling.ydl_pay
import android.annotation.SuppressLint
import android.app.Activity
import android.app.Dialog
import android.content.Context
......@@ -13,19 +14,11 @@ import android.widget.LinearLayout
import com.alipay.sdk.app.PayTask
import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory
import com.ydl.ydl_pay.bean.*
import com.ydl.ydl_pay.http.HttpConfig
import com.ydl.ydl_pay.http.HttpUtils
import com.ydl.ydl_pay.http.PayRetrofitUtils
import com.ydl.ydl_pay.toast.ToastHelper
import com.ydl.ydl_pay.widget.PayCouponView
import com.ydl.ydl_pay.widget.PayInfoDetailView
import com.yidianling.ydl_pay.BuildConfig
import com.yidianling.ydl_pay.R
import com.yidianling.ydl_pay.bean.AllCouponListBean
import com.yidianling.ydl_pay.bean.CommonCouponBean
import com.yidianling.ydl_pay.bean.OrderInfoBean
import com.yidianling.ydl_pay.bean.PayResult
import com.yidianling.ydl_pay.bean.*
import com.yidianling.ydl_pay.bean.params.*
import com.yidianling.ydl_pay.http.utils.NetUtils
import com.yidianling.ydl_pay.http.utils.RxDeviceTool
......@@ -97,7 +90,7 @@ class CommonPayDialog : Dialog {
private constructor(context: Context) : super(context, R.style.common_dialog_style)
private constructor(build: CommonPayDialog.Build) : this(build.mActivity) {
private constructor(build: Build) : this(build.mActivity) {
this.goodsId = build.goodsId
this.activity = build.mActivity
this.listener = build.listener
......@@ -127,6 +120,7 @@ class CommonPayDialog : Dialog {
/**
* 获取下单信息
*/
@SuppressLint("CheckResult")
private fun getOrderInfo() {
if (!NetUtils.isConnected(activity)) {
ToastHelper.show(activity, activity.getString(R.string.net_error))
......@@ -214,6 +208,7 @@ class CommonPayDialog : Dialog {
/**
获取所有选择优惠券
*/
@SuppressLint("CheckResult")
private fun getAllCoupon() {
if (!NetUtils.isConnected(activity)) {
ToastHelper.show(activity, activity.getString(R.string.net_error))
......@@ -272,6 +267,7 @@ class CommonPayDialog : Dialog {
* @param useMoneyType 支付类型 1余额,2三方支付,3混合
*
*/
@SuppressLint("CheckResult")
private fun createOrder(payWay: Int, payMoney: Float, useMoneyType: Int, code: String, couponType: String) {
if (!NetUtils.isConnected(activity)) {
ToastHelper.show(activity, activity.getString(R.string.net_error))
......@@ -336,6 +332,7 @@ class CommonPayDialog : Dialog {
* 支付宝支付
*
*/
@SuppressLint("CheckResult")
private fun getAliPayOrderId(payId: String, isThreePay: Int) {
if (!NetUtils.isConnected(activity)) {
activity.runOnUiThread {
......@@ -386,6 +383,7 @@ class CommonPayDialog : Dialog {
/**
* 微信支付
*/
@SuppressLint("CheckResult")
private fun getWeiXinPayOrderId(payId: String, isThreePay: Int) {
if (!NetUtils.isConnected(activity)) {
activity.runOnUiThread {
......@@ -527,7 +525,7 @@ class CommonPayDialog : Dialog {
*/
fun setCourseId(courseId: String): Build {
this.goodsId = courseId
payType = CommonPayDialog.TYPE_COURSE
payType = TYPE_COURSE
return this@Build
}
......@@ -600,30 +598,30 @@ class CommonPayDialog : Dialog {
*/
private fun initHttpHeadConfig() {
RxDeviceTool.initContext(mActivity)
HttpConfig.version = RxDeviceTool.getAppVersionName(mActivity)
HttpConfig.osBuild = RxDeviceTool.getBuildMANUFACTURER() + "," + RxDeviceTool.getBuildBrandModel() + "," + RxDeviceTool.getOsBuileVersion() + "," + RxDeviceTool.getAppVersionName(mActivity)
HttpConfig.uid = uid
HttpConfig.accessToken = token
HttpConfig.ffrom = ffrom
HttpConfig.isTestEnvironment = isTestEnvironment
val packageName = mActivity.packageName
if (packageName.endsWith("zj.android")) {//专家版
HttpConfig.isFromApp = "2"
} else {
HttpConfig.isFromApp = "1"
}
if (BuildConfig.DEBUG) {
if (TextUtils.isEmpty(HttpConfig.ffrom)) {
ToastHelper.show(mActivity, "请先调用--setFfrom()--方法")
}
if (TextUtils.isEmpty(HttpConfig.uid)) {
ToastHelper.show(mActivity, "请先调用--setUid()--方法")
}
if (TextUtils.isEmpty(HttpConfig.accessToken)) {
ToastHelper.show(mActivity, "请先调用--setToken()--方法")
}
}
PayRetrofitUtils.setConfig(HttpConfig)
// HttpConfig.version = RxDeviceTool.getAppVersionName(mActivity)
// HttpConfig.osBuild = RxDeviceTool.getBuildMANUFACTURER() + "," + RxDeviceTool.getBuildBrandModel() + "," + RxDeviceTool.getOsBuileVersion() + "," + RxDeviceTool.getAppVersionName(mActivity)
// HttpConfig.uid = uid
// HttpConfig.accessToken = token
// HttpConfig.ffrom = ffrom
// HttpConfig.isTestEnvironment = isTestEnvironment
// val packageName = mActivity.packageName
// if (packageName.endsWith("zj.android")) {//专家版
// HttpConfig.isFromApp = "2"
// } else {
// HttpConfig.isFromApp = "1"
// }
// if (BuildConfig.DEBUG) {
// if (TextUtils.isEmpty(HttpConfig.ffrom)) {
// ToastHelper.show(mActivity, "请先调用--setFfrom()--方法")
// }
// if (TextUtils.isEmpty(HttpConfig.uid)) {
// ToastHelper.show(mActivity, "请先调用--setUid()--方法")
// }
// if (TextUtils.isEmpty(HttpConfig.accessToken)) {
// ToastHelper.show(mActivity, "请先调用--setToken()--方法")
// }
// }
// PayRetrofitUtils.setConfig(HttpConfig)
}
}
......
package com.ydl.ydl_pay.bean
package com.yidianling.ydl_pay.bean
/**
* author : Zhangwenchao
......
package com.ydl.ydl_pay.bean
package com.yidianling.ydl_pay.bean
/**
* @author jiucheng
......
package com.yidianling.ydl_pay.bean.params;
import com.ydl.ydlcommon.data.http.BaseCommand;
/**
* @author jiucheng
* @描述:
......
package com.yidianling.ydl_pay.bean.params;
import com.ydl.ydl_pay.http.HttpConfig;
/**
* 基础网络请求类
* Created by Dog on 2015/5/8.
*/
public class BaseCommand {
public String uid = HttpConfig.INSTANCE.getUid();
public String accessToken = HttpConfig.INSTANCE.getAccessToken();
public String ts;
public String version = HttpConfig.INSTANCE.getVersion();
public String osBuild = HttpConfig.INSTANCE.getOsBuild();
public String isFromApp = "1";//2表示专家版1表示用户版
public String ffrom = HttpConfig.INSTANCE.getFfrom();//渠Y道来源
public BaseCommand() {
ts = (System.currentTimeMillis() / 1000) + "";
}
}
package com.yidianling.ydl_pay.bean.params;
import com.ydl.ydlcommon.data.http.BaseCommand;
/**
* @author jiucheng
* @描述:
......
package com.yidianling.ydl_pay.http;
/**
* Post请求表单
*/
public class FormatText {
//key
private String mKey;
//value
private String mValue;
public FormatText(String mKey, String mValue) {
this.mKey = mKey;
this.mValue = mValue;
}
public String getmKey() {
return mKey;
}
public String getmValue() {
return mValue;
}
@Override
public String toString() {
return "FormatText{" +
"mKey='" + mKey + '\'' +
", mValue='" + mValue + '\'' +
'}';
}
}
package com.ydl.ydl_pay.http
import com.google.gson.Gson
import com.ydl.ydl_pay.BuildConfig
import com.ydl.ydl_pay.actionpoint.ActionDataBean
import com.ydl.ydl_pay.bean.*
import com.ydl.ydl_pay.bean.params.*
import com.ydl.ydl_pay.http.response.BaseResponse
import com.ydl.ydl_pay.http.utils.HttpUrlUtils
import com.ydl.ydl_pay.http.utils.NetUtils
import com.ydl.ydl_pay.http.utils.RxHttpUtils
import com.ydl.ydlcommon.data.http.BaseCommand
import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydlcommon.utils.NetworkParamsUtils
import com.ydl.ydlnet.YDLHttpUtils
import com.yidianling.ydl_pay.bean.*
import com.yidianling.ydl_pay.bean.params.CheckRequestCouponBean
import com.yidianling.ydl_pay.bean.params.CreateOrderRequestBean
import com.yidianling.ydl_pay.bean.params.GetAllCouponRequestBean
import com.yidianling.ydl_pay.bean.params.OrderRequestBean
import io.reactivex.Observable
import okhttp3.MediaType
import okhttp3.RequestBody
......@@ -28,7 +31,7 @@ class HttpUtils {
fun getOrderInfo(bean: OrderRequestBean): Observable<BaseResponse<OrderInfoBean>> {
var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody
return PayRetrofitUtils.getRetrofit().create(PayServices::class.java).getOrderInfo(body)
return YDLHttpUtils.obtainApi(PayServices::class.java).getOrderInfo(body)
}
/**
......@@ -37,7 +40,7 @@ class HttpUtils {
fun checkCourseCoupon(bean: CheckRequestCouponBean): Observable<BaseResponse<CouponCodeInfoBean>> {
var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody
return PayRetrofitUtils.getRetrofit().create(PayServices::class.java).checkCourseCoupon(body)
return YDLHttpUtils.obtainApi(PayServices::class.java).checkCourseCoupon(body)
}
......@@ -47,7 +50,7 @@ class HttpUtils {
fun selectCoupon(bean: GetAllCouponRequestBean): Observable<BaseResponse<AllCouponListBean>> {
var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody
return PayRetrofitUtils.getRetrofit().create(PayServices::class.java).selectCoupon(body)
return YDLHttpUtils.obtainApi(PayServices::class.java).selectCoupon(body)
}
......@@ -57,7 +60,7 @@ class HttpUtils {
fun createOrder(bean: CreateOrderRequestBean): Observable<BaseResponse<PayOrderBean>> {
var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody
return PayRetrofitUtils.getRetrofit().create(PayServices::class.java).createOrder(body)
return YDLHttpUtils.obtainApi(PayServices::class.java).createOrder(body)
}
......@@ -65,19 +68,18 @@ class HttpUtils {
* 支付宝在线支付
*/
fun getAliPayOrderId(bean: BaseCommand): Observable<BaseResponse<CommonPayRecharge>> {
var params = PayRetrofitUtils.getPostList(bean)
var map = PayRetrofitUtils.getMaps(params)
return PayRetrofitUtils.getRetrofit().newBuilder().baseUrl(HttpUrlUtils.getBaseUrl(HttpConfig.isTestEnvironment, false))
.build().create(PayServices::class.java).getAliPayOrderId(map)
var params = NetworkParamsUtils.getPostList(bean)
var map = NetworkParamsUtils.getMaps(params)
return YDLHttpUtils.obtainApi(PayServices::class.java).getAliPayOrderId(map)
}
/**
* 微信在线支付
*/
fun wxPay(bean: BaseCommand): Observable<BaseResponse<CommonWXPayBean>> {
var params = PayRetrofitUtils.getPostList(bean)
var map = PayRetrofitUtils.getMaps(params)
return PayRetrofitUtils.getRetrofit().newBuilder().baseUrl(HttpUrlUtils.getBaseUrl(HttpConfig.isTestEnvironment, false)).build().create(PayServices::class.java).wxPay(map)
var params = NetworkParamsUtils.getPostList(bean)
var map = NetworkParamsUtils.getMaps(params)
return YDLHttpUtils.obtainApi(PayServices::class.java).wxPay(map)
}
......@@ -86,7 +88,7 @@ class HttpUtils {
*/
internal fun actionDataCount(actionDataParams: ActionDataBean): Observable<BaseResponse<String>> {
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), Gson().toJson(actionDataParams))
return PayRetrofitUtils.getRetrofit().newBuilder().baseUrl(HttpUrlUtils.geActionUrl(HttpConfig.isTestEnvironment)).build().create(PayServices::class.java).actionDataCount(body)
return YDLHttpUtils.obtainApi(PayServices::class.java).actionDataCount(body)
}
}
}
package com.ydl.ydl_pay.http
import android.annotation.SuppressLint
import com.facebook.stetho.okhttp3.StethoInterceptor
import com.ydl.ydl_pay.BuildConfig
import com.ydl.ydl_pay.bean.params.BaseCommand
import com.ydl.ydl_pay.http.log.LogUtil
import com.ydl.ydl_pay.http.utils.HttpUrlUtils
import okhttp3.FormBody
import okhttp3.MultipartBody
import okhttp3.OkHttpClient
import okhttp3.logging.HttpLoggingInterceptor
import okio.Buffer
import retrofit2.Retrofit
import retrofit2.adapter.rxjava2.RxJava2CallAdapterFactory
import retrofit2.converter.gson.GsonConverterFactory
import java.security.KeyManagementException
import java.security.MessageDigest
import java.security.NoSuchAlgorithmException
import java.security.SecureRandom
import java.security.cert.X509Certificate
import java.util.*
import java.util.concurrent.TimeUnit
import javax.net.ssl.SSLContext
import javax.net.ssl.SSLSocketFactory
import javax.net.ssl.TrustManager
import javax.net.ssl.X509TrustManager
/**
* @author jiucheng
* @描述:支付模块的网络请求
* @Copyright Copyright (c) 2018
* @Company 壹点灵
* @date 2019/4/3
*/
class PayRetrofitUtils private constructor() {
private lateinit var config: HttpConfig
companion object {
private const val AUTHORIZATION_NAME = "Authorization"
private const val SESSION_KEY_DEFAULT_VALUE = "dc59cf294f37d237c1f06240568ffe21"
private const val YDL = "Ydl "
private const val UID = "uid"
private const val FFROM = "ffrom"
private const val IS_FROM_APP = "isFromApp"//1表示用户版2表示专家版
private const val OS_BUILD = "osBuild"
private const val TS = "ts"
private const val VERSION = "version"
private const val TOKEN = "accessToken"
private const val DEFAULT_TIMEOUT = 15
private const val OS_TYPE = "osType"// 1.ios 2.android
private fun getInstance(): PayRetrofitUtils {
return Holder.INSTANCE
}
fun setConfig(config: HttpConfig) {
getInstance().config = config
}
// 调用此方法获取 Retrofit 对象
fun getRetrofit(): Retrofit {
return getInstance().retrofit
}
fun getPostList(crq: BaseCommand): List<FormatText> {
val formTextList = ArrayList<FormatText>()
val fields = crq.javaClass.fields
for (field in fields) {
try {
val accessFlag = field.isAccessible
field.isAccessible = true
val o = field.get(crq)
if (o != null) {
val formatText = FormatText(field.name, o.toString())
formTextList.add(formatText)
}
field.isAccessible = accessFlag
} catch (e: IllegalAccessException) {
e.printStackTrace()
}
}
return formTextList
}
//获取网络请求表
fun getMaps(list: List<FormatText>): Map<String, String> {
val map = HashMap<String, String>()
val size = list.size
for (i in 0 until size) {
val formatText = list[i]
map[formatText.getmKey()] = formatText.getmValue().toString()
}
return map
}
}
private val retrofit: Retrofit by lazy {
Retrofit.Builder()
.baseUrl(getBaseJavaUrl())
.addConverterFactory(GsonConverterFactory.create())
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.client(getOkHttp())
.build()
}
private fun getBaseJavaUrl(): String {
return HttpUrlUtils.getBaseUrl(config.isTestEnvironment, true)
}
private fun getOkHttp(): OkHttpClient {
val builder = OkHttpClient.Builder()
builder.retryOnConnectionFailure(false)
builder.addInterceptor { chain ->
val body = chain.request().body()
val list = ArrayList<FormatText>()
if (body is FormBody) {
val formBody = body as FormBody?
for (i in 0 until formBody!!.size()) {
list.add(FormatText(formBody.name(i), formBody.value(i)))
}
}
if (body is MultipartBody) {
val multipartBody = body as MultipartBody?
val parts = multipartBody!!.parts()
for (part in parts) {
if ("text/plain; charset=utf-8" == part.body().contentType()!!.toString()) {
val headerStr = part.headers()!!.toString()
val name = headerStr.split("\"\\n".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[0].split("=\"".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray()[1]
val buffer = Buffer()
part.body().writeTo(buffer)
val value = buffer.readUtf8()
list.add(FormatText(name, value))
}
}
}
val head = YDL + getSign(list)
LogUtil.i("RetrofitLog", "head = $head")
val build = chain.request()
.newBuilder()
.header(AUTHORIZATION_NAME, head)
.addHeader(FFROM, config.ffrom)
.addHeader(IS_FROM_APP, config.isFromApp)
.addHeader(VERSION, config.version)
.addHeader(OS_BUILD, config.osBuild)
.addHeader(OS_TYPE, "2")
.addHeader(TOKEN, config.accessToken)
.addHeader(TS, (System.currentTimeMillis() / 1000).toString())
.addHeader(UID, config.uid)
chain.proceed(build.build())
}
if (BuildConfig.DEBUG) {
builder.addInterceptor(HttpLoggingInterceptor { message ->
//打印retrofit日志
LogUtil.i("RetrofitLog", "retrofitBack = $message")
}.setLevel(HttpLoggingInterceptor.Level.BODY))
builder.addNetworkInterceptor(StethoInterceptor())
}
//使用自定义SSLSocketFactory
val factory = createSSLSocketFactory()
if (factory != null) {
builder.sslSocketFactory(factory)
.hostnameVerifier { _, _ -> true }
}
builder.connectTimeout(DEFAULT_TIMEOUT.toLong(), TimeUnit.SECONDS)
.readTimeout(DEFAULT_TIMEOUT.toLong(), TimeUnit.SECONDS)
.writeTimeout(DEFAULT_TIMEOUT.toLong(), TimeUnit.SECONDS)
return builder.build()
}
//获取请求头签名
private fun getSign(list: List<FormatText>): String? {
//将请求参数倒序排列
Collections.sort(list, SortData())
val stringBuilder = StringBuilder()
val size = list.size
for (i in 0 until size) {
val formatText = list[i]
if (i != 0) {
stringBuilder.append("&")
}
stringBuilder.append(String.format("%s=%s", formatText.getmKey(), formatText.getmValue()))
}
stringBuilder.append(SESSION_KEY_DEFAULT_VALUE)
return digestMD5(stringBuilder.toString())
}
//用来命名排序规则的
internal class SortData : Comparator<FormatText> {
override fun compare(lhs: FormatText, rhs: FormatText): Int {
val res = lhs.getmKey().compareTo(rhs.getmKey())
if (res == 0) {
return 0
}
return if (res > 0) -1 else 1
}
}
/**
* 用于MD5加密
*
* @param clear 明文
* @return 密文
*/
private fun digestMD5(clear: String): String? {
val hexDigits = charArrayOf('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f')
try {
val strTemp = clear.toByteArray(charset("utf-8"))
// 使用MD5创建MessageDigest对象
val mdTemp = MessageDigest.getInstance("MD5")
mdTemp.update(strTemp)
val md = mdTemp.digest()
val j = md.size
val str = CharArray(j * 2)
var k = 0
for (b in md) {
// 将每个数(int)b进行双字节加密
str[k++] = hexDigits[b.toInt() shr 4 and 0xf]
str[k++] = hexDigits[b.toInt() and 0xf]
}
return String(str)
} catch (e: Exception) {
return null
}
}
/**
* 默认信任所有的证书
*/
@SuppressLint("TrustAllX509TrustManager")
private fun createSSLSocketFactory(): SSLSocketFactory? {
val xtm = object : X509TrustManager {
override fun checkClientTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun checkServerTrusted(chain: Array<X509Certificate>, authType: String) {}
override fun getAcceptedIssuers(): Array<X509Certificate?> {
return arrayOfNulls(0)
}
}
val sslContext: SSLContext
try {
sslContext = SSLContext.getInstance("SSL")
sslContext.init(null, arrayOf<TrustManager>(xtm), SecureRandom())
} catch (e: NoSuchAlgorithmException) {
e.printStackTrace()
return null
} catch (e: KeyManagementException) {
e.printStackTrace()
return null
}
return sslContext.socketFactory
}
private object Holder {
val INSTANCE = PayRetrofitUtils()
}
}
\ No newline at end of file
package com.ydl.ydl_pay.http
import com.ydl.ydl_pay.bean.*
import com.ydl.ydl_pay.http.response.BaseResponse
import com.ydl.ydlcommon.base.config.YDL_DOMAIN
import com.ydl.ydlcommon.base.config.YDL_DOMAIN_JAVA
import com.ydl.ydlcommon.data.http.BaseResponse
import com.yidianling.ydl_pay.bean.*
import io.reactivex.Observable
import okhttp3.RequestBody
import retrofit2.http.Body
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST
import retrofit2.http.*
/**
* @author jiucheng
......@@ -22,12 +22,14 @@ interface PayServices {
* 获取下单的信息
*/
@POST("auth/Order/getOrderInfo")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getOrderInfo(@Body body: RequestBody): Observable<BaseResponse<OrderInfoBean>>
/**
* 验证课程兑换券是否可用
*/
@POST("auth/course/checkCourseCoupon")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun checkCourseCoupon(@Body body: RequestBody): Observable<BaseResponse<CouponCodeInfoBean>>
......@@ -35,6 +37,7 @@ interface PayServices {
* 下单时候选择优惠券
*/
@POST("auth/new_coupon/selectCoupon")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun selectCoupon(@Body body: RequestBody): Observable<BaseResponse<AllCouponListBean>>
......@@ -42,6 +45,7 @@ interface PayServices {
* 创建订单
*/
@POST("auth/Order/createOrder")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun createOrder(@Body body: RequestBody): Observable<BaseResponse<PayOrderBean>>
......
package com.yidianling.ydl_pay.http.response;
import com.google.gson.annotations.SerializedName;
/**
* 基础返回数据类
* Created by Dog on 2015/5/8.
*/
public class BaseResponse<T> {
public int code;
public String msg;
public int status;
@SerializedName("total_page")
public int totalPage;
public T data;
}
package com.yidianling.ydl_pay.http.utils;
import com.ydl.ydl_pay.BuildConfig;
import com.yidianling.ydl_pay.BuildConfig;
/**
* @author jiucheng
......
package com.ydl.ydl_pay.http.utils
import com.ydl.ydl_pay.http.response.BaseResponse
import io.reactivex.Observable
import io.reactivex.ObservableTransformer
import java.net.ConnectException
/**
* author : Zhangwenchao
* e-mail : zhangwch@yidianling.com
*/
object RxHttpUtils {
/**
* 根据返回数据,得到真正需要的数据
* 若状态码不为0,抛出接口异常
*/
@JvmStatic
fun <T> resultData(): ObservableTransformer<BaseResponse<T>, T> {
return ObservableTransformer {
it.flatMap {
if (it.code == 0) Observable.just(it.data)
else Observable.error(Throwable(it.msg))
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment