Commit 21fc5c6c by 严久程

支付模块

parent 8619efbe
...@@ -24,7 +24,7 @@ import com.ydl.media.audio.utils.PlayProgressUtil ...@@ -24,7 +24,7 @@ import com.ydl.media.audio.utils.PlayProgressUtil
import com.ydl.media.view.PlayTypeEnum import com.ydl.media.view.PlayTypeEnum
import com.ydl.media.view.PlayerFloatHelper import com.ydl.media.view.PlayerFloatHelper
import com.ydl.ydl_image.module.GlideApp 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.ydl_router.manager.YDLRouterManager
import com.ydl.ydlcommon.adapter.CommonRecyclerAdapter import com.ydl.ydlcommon.adapter.CommonRecyclerAdapter
import com.ydl.ydlcommon.base.BaseActivity import com.ydl.ydlcommon.base.BaseActivity
......
...@@ -38,7 +38,7 @@ dependencies { ...@@ -38,7 +38,7 @@ dependencies {
testImplementation 'junit:junit:4.12' testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2' androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.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' implementation 'com.squareup.retrofit2:retrofit:2.3.0'
...@@ -49,11 +49,23 @@ dependencies { ...@@ -49,11 +49,23 @@ dependencies {
implementation 'com.facebook.stetho:stetho-okhttp3:1.4.1' implementation 'com.facebook.stetho:stetho-okhttp3:1.4.1'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1' implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
//noinspection GradleCompatible
implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'com.android.support:recyclerview-v7:27.1.1'
implementation 'de.greenrobot:eventbus:2.4.0' implementation 'de.greenrobot:eventbus:2.4.0'
api 'com.umeng.sdk:share-wechat:6.9.1' 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 { repositories {
......
package com.ydl.ydl_pay package com.yidianling.ydl_pay
import android.annotation.SuppressLint
import android.app.Activity import android.app.Activity
import android.app.Dialog import android.app.Dialog
import android.content.Context import android.content.Context
...@@ -13,19 +14,11 @@ import android.widget.LinearLayout ...@@ -13,19 +14,11 @@ import android.widget.LinearLayout
import com.alipay.sdk.app.PayTask import com.alipay.sdk.app.PayTask
import com.tencent.mm.opensdk.modelpay.PayReq import com.tencent.mm.opensdk.modelpay.PayReq
import com.tencent.mm.opensdk.openapi.WXAPIFactory 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.HttpUtils
import com.ydl.ydl_pay.http.PayRetrofitUtils
import com.ydl.ydl_pay.toast.ToastHelper import com.ydl.ydl_pay.toast.ToastHelper
import com.ydl.ydl_pay.widget.PayCouponView import com.ydl.ydl_pay.widget.PayCouponView
import com.ydl.ydl_pay.widget.PayInfoDetailView import com.ydl.ydl_pay.widget.PayInfoDetailView
import com.yidianling.ydl_pay.BuildConfig import com.yidianling.ydl_pay.bean.*
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.params.* import com.yidianling.ydl_pay.bean.params.*
import com.yidianling.ydl_pay.http.utils.NetUtils import com.yidianling.ydl_pay.http.utils.NetUtils
import com.yidianling.ydl_pay.http.utils.RxDeviceTool import com.yidianling.ydl_pay.http.utils.RxDeviceTool
...@@ -97,7 +90,7 @@ class CommonPayDialog : Dialog { ...@@ -97,7 +90,7 @@ class CommonPayDialog : Dialog {
private constructor(context: Context) : super(context, R.style.common_dialog_style) 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.goodsId = build.goodsId
this.activity = build.mActivity this.activity = build.mActivity
this.listener = build.listener this.listener = build.listener
...@@ -127,6 +120,7 @@ class CommonPayDialog : Dialog { ...@@ -127,6 +120,7 @@ class CommonPayDialog : Dialog {
/** /**
* 获取下单信息 * 获取下单信息
*/ */
@SuppressLint("CheckResult")
private fun getOrderInfo() { private fun getOrderInfo() {
if (!NetUtils.isConnected(activity)) { if (!NetUtils.isConnected(activity)) {
ToastHelper.show(activity, activity.getString(R.string.net_error)) ToastHelper.show(activity, activity.getString(R.string.net_error))
...@@ -214,6 +208,7 @@ class CommonPayDialog : Dialog { ...@@ -214,6 +208,7 @@ class CommonPayDialog : Dialog {
/** /**
获取所有选择优惠券 获取所有选择优惠券
*/ */
@SuppressLint("CheckResult")
private fun getAllCoupon() { private fun getAllCoupon() {
if (!NetUtils.isConnected(activity)) { if (!NetUtils.isConnected(activity)) {
ToastHelper.show(activity, activity.getString(R.string.net_error)) ToastHelper.show(activity, activity.getString(R.string.net_error))
...@@ -272,6 +267,7 @@ class CommonPayDialog : Dialog { ...@@ -272,6 +267,7 @@ class CommonPayDialog : Dialog {
* @param useMoneyType 支付类型 1余额,2三方支付,3混合 * @param useMoneyType 支付类型 1余额,2三方支付,3混合
* *
*/ */
@SuppressLint("CheckResult")
private fun createOrder(payWay: Int, payMoney: Float, useMoneyType: Int, code: String, couponType: String) { private fun createOrder(payWay: Int, payMoney: Float, useMoneyType: Int, code: String, couponType: String) {
if (!NetUtils.isConnected(activity)) { if (!NetUtils.isConnected(activity)) {
ToastHelper.show(activity, activity.getString(R.string.net_error)) ToastHelper.show(activity, activity.getString(R.string.net_error))
...@@ -336,6 +332,7 @@ class CommonPayDialog : Dialog { ...@@ -336,6 +332,7 @@ class CommonPayDialog : Dialog {
* 支付宝支付 * 支付宝支付
* *
*/ */
@SuppressLint("CheckResult")
private fun getAliPayOrderId(payId: String, isThreePay: Int) { private fun getAliPayOrderId(payId: String, isThreePay: Int) {
if (!NetUtils.isConnected(activity)) { if (!NetUtils.isConnected(activity)) {
activity.runOnUiThread { activity.runOnUiThread {
...@@ -386,6 +383,7 @@ class CommonPayDialog : Dialog { ...@@ -386,6 +383,7 @@ class CommonPayDialog : Dialog {
/** /**
* 微信支付 * 微信支付
*/ */
@SuppressLint("CheckResult")
private fun getWeiXinPayOrderId(payId: String, isThreePay: Int) { private fun getWeiXinPayOrderId(payId: String, isThreePay: Int) {
if (!NetUtils.isConnected(activity)) { if (!NetUtils.isConnected(activity)) {
activity.runOnUiThread { activity.runOnUiThread {
...@@ -527,7 +525,7 @@ class CommonPayDialog : Dialog { ...@@ -527,7 +525,7 @@ class CommonPayDialog : Dialog {
*/ */
fun setCourseId(courseId: String): Build { fun setCourseId(courseId: String): Build {
this.goodsId = courseId this.goodsId = courseId
payType = CommonPayDialog.TYPE_COURSE payType = TYPE_COURSE
return this@Build return this@Build
} }
...@@ -600,30 +598,30 @@ class CommonPayDialog : Dialog { ...@@ -600,30 +598,30 @@ class CommonPayDialog : Dialog {
*/ */
private fun initHttpHeadConfig() { private fun initHttpHeadConfig() {
RxDeviceTool.initContext(mActivity) RxDeviceTool.initContext(mActivity)
HttpConfig.version = RxDeviceTool.getAppVersionName(mActivity) // HttpConfig.version = RxDeviceTool.getAppVersionName(mActivity)
HttpConfig.osBuild = RxDeviceTool.getBuildMANUFACTURER() + "," + RxDeviceTool.getBuildBrandModel() + "," + RxDeviceTool.getOsBuileVersion() + "," + RxDeviceTool.getAppVersionName(mActivity) // HttpConfig.osBuild = RxDeviceTool.getBuildMANUFACTURER() + "," + RxDeviceTool.getBuildBrandModel() + "," + RxDeviceTool.getOsBuileVersion() + "," + RxDeviceTool.getAppVersionName(mActivity)
HttpConfig.uid = uid // HttpConfig.uid = uid
HttpConfig.accessToken = token // HttpConfig.accessToken = token
HttpConfig.ffrom = ffrom // HttpConfig.ffrom = ffrom
HttpConfig.isTestEnvironment = isTestEnvironment // HttpConfig.isTestEnvironment = isTestEnvironment
val packageName = mActivity.packageName // val packageName = mActivity.packageName
if (packageName.endsWith("zj.android")) {//专家版 // if (packageName.endsWith("zj.android")) {//专家版
HttpConfig.isFromApp = "2" // HttpConfig.isFromApp = "2"
} else { // } else {
HttpConfig.isFromApp = "1" // HttpConfig.isFromApp = "1"
} // }
if (BuildConfig.DEBUG) { // if (BuildConfig.DEBUG) {
if (TextUtils.isEmpty(HttpConfig.ffrom)) { // if (TextUtils.isEmpty(HttpConfig.ffrom)) {
ToastHelper.show(mActivity, "请先调用--setFfrom()--方法") // ToastHelper.show(mActivity, "请先调用--setFfrom()--方法")
} // }
if (TextUtils.isEmpty(HttpConfig.uid)) { // if (TextUtils.isEmpty(HttpConfig.uid)) {
ToastHelper.show(mActivity, "请先调用--setUid()--方法") // ToastHelper.show(mActivity, "请先调用--setUid()--方法")
} // }
if (TextUtils.isEmpty(HttpConfig.accessToken)) { // if (TextUtils.isEmpty(HttpConfig.accessToken)) {
ToastHelper.show(mActivity, "请先调用--setToken()--方法") // ToastHelper.show(mActivity, "请先调用--setToken()--方法")
} // }
} // }
PayRetrofitUtils.setConfig(HttpConfig) // PayRetrofitUtils.setConfig(HttpConfig)
} }
} }
......
package com.ydl.ydl_pay.bean package com.yidianling.ydl_pay.bean
/** /**
* author : Zhangwenchao * author : Zhangwenchao
......
package com.ydl.ydl_pay.bean package com.yidianling.ydl_pay.bean
/** /**
* @author jiucheng * @author jiucheng
......
package com.yidianling.ydl_pay.bean.params; package com.yidianling.ydl_pay.bean.params;
import com.ydl.ydlcommon.data.http.BaseCommand;
/** /**
* @author jiucheng * @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; package com.yidianling.ydl_pay.bean.params;
import com.ydl.ydlcommon.data.http.BaseCommand;
/** /**
* @author jiucheng * @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 package com.ydl.ydl_pay.http
import com.google.gson.Gson import com.google.gson.Gson
import com.ydl.ydl_pay.BuildConfig
import com.ydl.ydl_pay.actionpoint.ActionDataBean import com.ydl.ydl_pay.actionpoint.ActionDataBean
import com.ydl.ydl_pay.bean.* import com.ydl.ydl_pay.bean.*
import com.ydl.ydl_pay.bean.params.* import com.ydl.ydlcommon.data.http.BaseCommand
import com.ydl.ydl_pay.http.response.BaseResponse import com.ydl.ydlcommon.data.http.BaseResponse
import com.ydl.ydl_pay.http.utils.HttpUrlUtils import com.ydl.ydlcommon.utils.NetworkParamsUtils
import com.ydl.ydl_pay.http.utils.NetUtils import com.ydl.ydlnet.YDLHttpUtils
import com.ydl.ydl_pay.http.utils.RxHttpUtils 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 io.reactivex.Observable
import okhttp3.MediaType import okhttp3.MediaType
import okhttp3.RequestBody import okhttp3.RequestBody
...@@ -28,7 +31,7 @@ class HttpUtils { ...@@ -28,7 +31,7 @@ class HttpUtils {
fun getOrderInfo(bean: OrderRequestBean): Observable<BaseResponse<OrderInfoBean>> { fun getOrderInfo(bean: OrderRequestBean): Observable<BaseResponse<OrderInfoBean>> {
var str = Gson().toJson(bean) var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody 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 { ...@@ -37,7 +40,7 @@ class HttpUtils {
fun checkCourseCoupon(bean: CheckRequestCouponBean): Observable<BaseResponse<CouponCodeInfoBean>> { fun checkCourseCoupon(bean: CheckRequestCouponBean): Observable<BaseResponse<CouponCodeInfoBean>> {
var str = Gson().toJson(bean) var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody 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 { ...@@ -47,7 +50,7 @@ class HttpUtils {
fun selectCoupon(bean: GetAllCouponRequestBean): Observable<BaseResponse<AllCouponListBean>> { fun selectCoupon(bean: GetAllCouponRequestBean): Observable<BaseResponse<AllCouponListBean>> {
var str = Gson().toJson(bean) var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody 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 { ...@@ -57,7 +60,7 @@ class HttpUtils {
fun createOrder(bean: CreateOrderRequestBean): Observable<BaseResponse<PayOrderBean>> { fun createOrder(bean: CreateOrderRequestBean): Observable<BaseResponse<PayOrderBean>> {
var str = Gson().toJson(bean) var str = Gson().toJson(bean)
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), str) as RequestBody 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 { ...@@ -65,19 +68,18 @@ class HttpUtils {
* 支付宝在线支付 * 支付宝在线支付
*/ */
fun getAliPayOrderId(bean: BaseCommand): Observable<BaseResponse<CommonPayRecharge>> { fun getAliPayOrderId(bean: BaseCommand): Observable<BaseResponse<CommonPayRecharge>> {
var params = PayRetrofitUtils.getPostList(bean) var params = NetworkParamsUtils.getPostList(bean)
var map = PayRetrofitUtils.getMaps(params) var map = NetworkParamsUtils.getMaps(params)
return PayRetrofitUtils.getRetrofit().newBuilder().baseUrl(HttpUrlUtils.getBaseUrl(HttpConfig.isTestEnvironment, false)) return YDLHttpUtils.obtainApi(PayServices::class.java).getAliPayOrderId(map)
.build().create(PayServices::class.java).getAliPayOrderId(map)
} }
/** /**
* 微信在线支付 * 微信在线支付
*/ */
fun wxPay(bean: BaseCommand): Observable<BaseResponse<CommonWXPayBean>> { fun wxPay(bean: BaseCommand): Observable<BaseResponse<CommonWXPayBean>> {
var params = PayRetrofitUtils.getPostList(bean) var params = NetworkParamsUtils.getPostList(bean)
var map = PayRetrofitUtils.getMaps(params) var map = NetworkParamsUtils.getMaps(params)
return PayRetrofitUtils.getRetrofit().newBuilder().baseUrl(HttpUrlUtils.getBaseUrl(HttpConfig.isTestEnvironment, false)).build().create(PayServices::class.java).wxPay(map) return YDLHttpUtils.obtainApi(PayServices::class.java).wxPay(map)
} }
...@@ -86,7 +88,7 @@ class HttpUtils { ...@@ -86,7 +88,7 @@ class HttpUtils {
*/ */
internal fun actionDataCount(actionDataParams: ActionDataBean): Observable<BaseResponse<String>> { internal fun actionDataCount(actionDataParams: ActionDataBean): Observable<BaseResponse<String>> {
val body = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), Gson().toJson(actionDataParams)) 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 package com.ydl.ydl_pay.http
import com.ydl.ydl_pay.bean.* 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 io.reactivex.Observable
import okhttp3.RequestBody import okhttp3.RequestBody
import retrofit2.http.Body import retrofit2.http.*
import retrofit2.http.FieldMap
import retrofit2.http.FormUrlEncoded
import retrofit2.http.POST
/** /**
* @author jiucheng * @author jiucheng
...@@ -22,12 +22,14 @@ interface PayServices { ...@@ -22,12 +22,14 @@ interface PayServices {
* 获取下单的信息 * 获取下单的信息
*/ */
@POST("auth/Order/getOrderInfo") @POST("auth/Order/getOrderInfo")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun getOrderInfo(@Body body: RequestBody): Observable<BaseResponse<OrderInfoBean>> fun getOrderInfo(@Body body: RequestBody): Observable<BaseResponse<OrderInfoBean>>
/** /**
* 验证课程兑换券是否可用 * 验证课程兑换券是否可用
*/ */
@POST("auth/course/checkCourseCoupon") @POST("auth/course/checkCourseCoupon")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun checkCourseCoupon(@Body body: RequestBody): Observable<BaseResponse<CouponCodeInfoBean>> fun checkCourseCoupon(@Body body: RequestBody): Observable<BaseResponse<CouponCodeInfoBean>>
...@@ -35,6 +37,7 @@ interface PayServices { ...@@ -35,6 +37,7 @@ interface PayServices {
* 下单时候选择优惠券 * 下单时候选择优惠券
*/ */
@POST("auth/new_coupon/selectCoupon") @POST("auth/new_coupon/selectCoupon")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun selectCoupon(@Body body: RequestBody): Observable<BaseResponse<AllCouponListBean>> fun selectCoupon(@Body body: RequestBody): Observable<BaseResponse<AllCouponListBean>>
...@@ -42,6 +45,7 @@ interface PayServices { ...@@ -42,6 +45,7 @@ interface PayServices {
* 创建订单 * 创建订单
*/ */
@POST("auth/Order/createOrder") @POST("auth/Order/createOrder")
@Headers(YDL_DOMAIN + YDL_DOMAIN_JAVA)
fun createOrder(@Body body: RequestBody): Observable<BaseResponse<PayOrderBean>> 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; package com.yidianling.ydl_pay.http.utils;
import com.ydl.ydl_pay.BuildConfig; import com.yidianling.ydl_pay.BuildConfig;
/** /**
* @author jiucheng * @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