Commit 460cdf3b authored by 王雪伟's avatar 王雪伟

[提交人]:王雪伟

[提交简述] :修改充值弹窗
[实现方案] :
parent 5729eae5
......@@ -13,6 +13,12 @@ import androidx.multidex.MultiDex
import com.heytap.msp.push.HeytapPushManager
import com.huawei.hms.push.HmsMessaging
import com.meizu.cloud.pushsdk.PushManager
import com.paypal.checkout.PayPalCheckout
import com.paypal.checkout.config.CheckoutConfig
import com.paypal.checkout.config.Environment
import com.paypal.checkout.config.SettingsConfig
import com.paypal.checkout.createorder.CurrencyCode
import com.paypal.checkout.createorder.UserAction
import com.tencent.android.tpush.XGPushConfig
import com.tencent.bugly.crashreport.CrashReport
import com.tencent.imsdk.v2.V2TIMCallback
......@@ -105,8 +111,26 @@ class Appli : Application() {
// }
// })
registerActivityLifecycleCallbacks(StatisticActivityLifecycleCallback())
}
initPayPal()
}
private fun initPayPal() {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
val config = CheckoutConfig(
application = this,
clientId = Constant.PAY_PAL_CLIENT_ID,
environment = Environment.SANDBOX,//正式上线后,改为Environment.LIVE
returnUrl = "com.zhangxin.starlight://paypalpay",//创建应用时填的RETURN_URL
currencyCode = CurrencyCode.USD,//货币种类:CNY-人民币;HKD-港币;TWD-新台币;USD-美元...
userAction = UserAction.PAY_NOW,
settingsConfig = SettingsConfig(
loggingEnabled = false,
shouldFailEligibility = false
)
)
PayPalCheckout.setConfig(config)
}
}
private fun getOaid() {
MiitHelper(appIdsUpdater).getDeviceIds(AppContext.mAppContext)
}
......
......@@ -8,6 +8,8 @@ import android.Manifest;
public class Constant {
public static String PAY_PAL_CLIENT_ID ="AeCOQewq8tWcuy7V2YsL3S3IRMDZk6zSTtHP76x-yiHIgYN7PZ1xT4Iyzv-2zJm15OqR5sWjc6__9xhE";
//公共参数
String UMENG_APPKEY = "597dbf2abbea835685001b27";
......
......@@ -30,6 +30,7 @@ public class NetConfig {
public static String BASE_FEED_URL = "";
public static final String URL_REPORT_BASE = "http://report.zhangxinhulian.com/";
public static final String HOME_BANNER_BASE_URL = "https://bs.zhangxinhulian.com/";
public static final String URL_PAY_BASE = "http://paytest.zhangxinhulian.com/";
public static void setBase_Url(Environment s) {
sEnvironment = s;
......@@ -155,6 +156,9 @@ public class NetConfig {
public static final String URL_AUTH_GOOGLE_LOGIN = "app/v1/auth/googleLogin";//绑定谷歌登录
public static final String URL_AUTH_FACEBOOK_LOGIN = "app/v1/auth/facebookLogin";//绑定FaceBook登录
///unifiedpay/gateway/google/替换包名/notify/order
public static final String URL_GOOGLE_NOTIFY = URL_PAY_BASE + "unifiedpay/gateway/google/com.zhangxin.magicbox/notify/order";
}
public static class Task {
......
......@@ -8,6 +8,7 @@ import com.zxhl.cms.net.model.other.IsWeChatLoginEntity
import com.zxhl.cms.net.model.other.WxBindEntity
import com.zxhl.cms.net.model.uc.UserInfo
import com.zxhl.cms.net.model.uc.VersionEntity
import com.zxhl.cms.pay.googlepay.GooglePayResult
import io.reactivex.Observable
import okhttp3.MultipartBody
import retrofit2.http.*
......@@ -305,4 +306,12 @@ interface IHomeApi {
@POST(NetConfig.StarLight.HOME_STAR_CONSTELLATION_RESLUT)
fun getStarMachReslut(): Observable<Response<StarMachEntity>>
/**
* google支付成功后 通知后台
*/
@POST(NetConfig.User.URL_GOOGLE_NOTIFY)
fun googlePaySuccess(
@Body entity: GooglePayResult?
): Observable<Response<Any>>
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.zxhl.cms.net.api;
import com.zxhl.cms.ad.upload.model.Response;
import com.zxhl.cms.common.NetConfig;
import com.zxhl.cms.net.model.pay.GooglePayEntity;
import com.zxhl.cms.net.model.uc.AliPayEntity;
import com.zxhl.cms.net.model.uc.PayVerifyEntity;
import com.zxhl.cms.net.model.uc.UserInfo;
......@@ -64,6 +65,13 @@ public interface IUserInfoApi {
@POST(NetConfig.User.URL_PAY_ORDER)
Observable<Response<AliPayEntity>> aliPay(@Query("goodsId") String goodsId, @Query("payType") String payType, @Query("voucherId") String voucherId, @Query("appId") String appId);
/**
* Google支付
*
* @return
*/
@POST(NetConfig.User.URL_PAY_ORDER)
Observable<Response<GooglePayEntity>> googlePay(@Query("goodsId") String goodsId, @Query("payType") String payType, @Query("voucherId") String voucherId, @Query("appId") String appId, @Query("payMode") String payMode);
/**
* 获取用户资料
......
package com.zxhl.cms.net.model.pay;
/**
* @author (wangXuewei)
* @detail :
*/
public class GooglePayEntity {
/**
* payType : 4
* wakeup : {"orderNo":1503315110133714944}
* payPlatform : null
* outTradeNo : 1503315110133714944
*/
private int payType;
private WakeupBean wakeup;
private String outTradeNo;
public int getPayType() {
return payType;
}
public void setPayType(int payType) {
this.payType = payType;
}
public WakeupBean getWakeup() {
return wakeup;
}
public void setWakeup(WakeupBean wakeup) {
this.wakeup = wakeup;
}
public String getOutTradeNo() {
return outTradeNo;
}
public void setOutTradeNo(String outTradeNo) {
this.outTradeNo = outTradeNo;
}
public static class WakeupBean {
/**
* orderNo : 1503315110133714944
*/
private long orderNo;
public long getOrderNo() {
return orderNo;
}
public void setOrderNo(long orderNo) {
this.orderNo = orderNo;
}
}
}
package com.zxhl.cms.pay.adapter
import android.content.Context
import android.graphics.Color
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.LinearLayout
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView
import com.zxhl.cms.R
import com.zxhl.cms.common.base.BaseRecyclerAdapter
import com.zxhl.cms.net.model.pay.VipPayEntity
import com.zxhl.cms.utils.OnRecycleItemClickListener
/**
* @author (wangXuewei)
* @datetime 2022-04-12 19:04 GMT+8
* @detail :
*/
class BecomeVipDialogPriceAdapter : BaseRecyclerAdapter<VipPayEntity, BecomeVipDialogPriceAdapter.ViewHolder> {
private var mContext: Context? = null
private var mPosition = 0
private val listener: OnRecycleItemClickListener<VipPayEntity>
constructor(
content: Context?,
listener: OnRecycleItemClickListener<VipPayEntity>
) : super() {
this.listener = listener
mContext = content
}
fun setSelectView(position: Int) {
mPosition = position;
notifyDataSetChanged()
}
override fun onCreateViewHolder(holder: ViewGroup, p1: Int): BecomeVipDialogPriceAdapter.ViewHolder {
return ViewHolder(
LayoutInflater.from(holder.context)
.inflate(R.layout.item_layout_become_dialog_vip_price_view, holder, false)
)
}
override fun onBindViewHolder(holder: BecomeVipDialogPriceAdapter.ViewHolder, position: Int) {
// val data = mList[position]
holder.id_vip_time.text = "1 Week +"
holder.id_coin_num.text = "780"
holder.id_money.text = "$${2.99}"
if (mPosition==position){
holder.id_item_view.background = mContext?.getDrawable(R.drawable.shape_8857ff_bd8aff_bg_r10)
holder.id_vip_time.setTextColor(Color.parseColor("#FFFFFF"))
holder.id_coin_num.setTextColor(Color.parseColor("#FFFFFF"))
holder.id_money.setTextColor(Color.parseColor("#FFFFFF"))
}else{
holder.id_item_view.background = mContext?.getDrawable(R.drawable.shape_f4edff_r10_bg)
holder.id_vip_time.setTextColor(Color.parseColor("#333333"))
holder.id_coin_num.setTextColor(Color.parseColor("#333333"))
holder.id_money.setTextColor(Color.parseColor("#333333"))
}
holder.id_item_view?.setOnClickListener {
listener.onItemClick(it,position,null)
}
}
override fun getItemCount(): Int {
return 3
}
inner class ViewHolder : RecyclerView.ViewHolder {
var id_vip_time: TextView
var id_money: TextView
var id_coin_num: TextView
var id_item_view: LinearLayout
constructor(itemView: View) : super(itemView) {
id_item_view = itemView.findViewById(R.id.id_ll_dialog_item_become_vip_view)
id_vip_time = itemView.findViewById(R.id.id_tv_dialog_item_vip_time)
id_coin_num = itemView.findViewById(R.id.id_tv_dialog_coin_num)
id_money = itemView.findViewById(R.id.id_tv_dialog_item_price)
}
}
}
\ No newline at end of file
package com.zxhl.cms.pay.googlepay
/**
* @author (wangXuewei)
* @datetime 2022-03-14 16:49 GMT+8
* @detail :
*/
interface GooglePayCallBack {
fun onPaySuccess(purchase: GooglePayResult, googleJson:String)
fun onCancel()
fun onError(error: String)
}
\ No newline at end of file
package com.zxhl.cms.pay.googlepay
class GooglePayResult {
var packageName: String = ""
var orderId: String = ""
var productId: String = ""
var developerPayload: String = ""
var obfuscatedAccountid: String = ""
var purchaseTime: String = ""
var purchaseState: String = ""
var purchaseToken: String = ""
}
\ No newline at end of file
This diff is collapsed.
package com.zxhl.cms.paypal
/**
* @author (wangXuewei)
* @datetime 2022-03-14 16:49 GMT+8
* @detail :
*/
interface PayPalPayCallBack {
fun onPaySuccess(result:String)
fun onCancel()
fun onError(error: String)
}
\ No newline at end of file
......@@ -17,7 +17,7 @@ class PaymentPagePresenter:PaymentPageContract.Presenter {
}
override fun verifyThePayment(result: String?, payType: Int) {
mView.orderVerificationSuccessful("")
}
override fun appInfo() {
......
......@@ -58,6 +58,6 @@ class CoinStoreActivity : BaseActivity(), CoinStoreContract.View,
}
override fun onItemClick(view: View?, position: Int, data: RecordEntity?) {
JumpUtils.paymentPageJump(Constant.Key.PAY_TYPE_COIN,"1","name","0.0")
JumpUtils.paymentPageJump(Constant.Key.PAY_TYPE_COIN,"1","name","0.1")
}
}
\ No newline at end of file
package com.zxhl.cms.pay.view
import android.content.Intent
import android.os.Build
import android.util.Log
import android.view.View
import com.paypal.checkout.PayPalCheckout
import com.zxhl.cms.R
import com.zxhl.cms.common.base.BaseActivity
import com.zxhl.cms.net.model.box.AppInEntity
import com.zxhl.cms.pay.PayContract
import com.zxhl.cms.pay.contract.PaymentPageContract
import com.zxhl.cms.pay.googlepay.GooglePayCallBack
import com.zxhl.cms.pay.googlepay.GooglePayHelper
import com.zxhl.cms.pay.googlepay.GooglePayResult
import com.zxhl.cms.pay.paypal.PayPalHelper
import com.zxhl.cms.pay.presenter.PaymentPagePresenter
import com.zxhl.cms.paypal.PayPalPayCallBack
import com.zxhl.cms.utils.EventUtils
import com.zxhl.cms.utils.Utils
import com.zxhl.cms.widget.CenterDialog
import com.zxhl.cms.widget.LoadingDialog
import kotlinx.android.synthetic.main.activity_layout_payment_page.*
import kotlinx.android.synthetic.main.activity_layout_payment_page.id_img_back
import kotlinx.android.synthetic.main.activity_member.*
......@@ -30,11 +43,21 @@ class PaymentPageActivity : BaseActivity(), PaymentPageContract.View {
private var payType: Int? = GOOGLE_PAY
private var googlePay: GooglePayHelper? = null
private var payPalPay: PayPalHelper? = null
private var mLoading: LoadingDialog? = null
private var mPresenter: PaymentPageContract.Presenter? = null
private var goodsType: String = "";
private var goodsId: String = "";
private var goodsName: String = "";
private var goodsPrice: String = "";
override fun init() {
val goodsType = intent?.data?.getQueryParameter("pay_goods_type") ?: ""
val goodsId = intent?.data?.getQueryParameter("pay_goods_id") ?: ""
val goodsName = intent?.data?.getQueryParameter("pay_goods_name") ?: ""
val goodsPrice = intent?.data?.getQueryParameter("pay_goods_price") ?: ""
goodsType = intent?.data?.getQueryParameter("pay_goods_type") ?: ""
goodsId = intent?.data?.getQueryParameter("pay_goods_id") ?: ""
goodsName = intent?.data?.getQueryParameter("pay_goods_name") ?: ""
goodsPrice = intent?.data?.getQueryParameter("pay_goods_price") ?: ""
id_tv_goods_name.text = goodsName
id_tv_goods_price.text = "Price:$${goodsPrice}"
......@@ -44,6 +67,35 @@ class PaymentPageActivity : BaseActivity(), PaymentPageContract.View {
id_img_google_btn.setOnClickListener(this)
id_rl_paypal_pay.setOnClickListener(this)
id_tv_pay_btn.setOnClickListener(this)
mLoading = LoadingDialog.getLoadingDialog(
this,
getString(com.zxhl.cms.R.string.wait_ing),
false,
false
)
mPresenter = PaymentPagePresenter(this)
googlePay = GooglePayHelper(this)
googlePay?.init(object : GooglePayCallBack {
override fun onPaySuccess(purchase: GooglePayResult, googleJson: String) {
mPresenter?.verifyThePayment(googleJson, GOOGLE_PAY)
//mLoading?.setResult(true, "Pay for success", 1000)
EventUtils.onEvent("GooglePaySuccess_bd")
}
override fun onCancel() {
EventUtils.onEvent("GooglePayCancel_bd")
}
override fun onError(error: String) {
Log.d("wxw", "补单PayError:$error")
EventUtils.onEvent("GooglePayError_bd", error)
}
})
payPalPay = PayPalHelper(this)
}
override fun onClick(v: View?) {
......@@ -58,7 +110,20 @@ class PaymentPageActivity : BaseActivity(), PaymentPageContract.View {
selectPayType(PAY_PAL_PAY)
}
id_tv_pay_btn -> {
CenterDialog.showPaySuccessDialog(this)
//CenterDialog.showPaySuccessDialog(this)
if (payType == 0) {
Utils.showToast(this, "Please select payment type")
return
}
EventUtils.onEvent("pay_page_pay_btn", goodsPrice)
Log.d("wxw","Payment${goodsId}${goodsPrice}")
if (payType == GOOGLE_PAY) {
googlePay(goodsId)
} else if (payType == PAY_PAL_PAY) {
payPalPay(goodsId, goodsPrice)
} else {
EventUtils.onEvent("pay_type_error", "pay_type$payType")
}
}
}
}
......@@ -82,15 +147,94 @@ class PaymentPageActivity : BaseActivity(), PaymentPageContract.View {
}
override fun orderVerificationSuccessful(status: String) {
EventUtils.onEvent("pay_suc")
mLoading?.setResult(true, "Pay for success", 1000)
}
override fun orderVerificationFailed(errorMsg: String) {
EventUtils.onEvent("pay_fail")
mLoading?.setResult(false, "Pay for failure", 1000)
}
override fun setAppInfo(result: AppInEntity?) {
}
private fun googlePay(goodsId: String) {
if (goodsId == "") {
EventUtils.onEvent("GooglePayGoodsIdNull")
return
}
mLoading?.setLoading(getString(R.string.wait_ing))
mLoading?.show()
EventUtils.onEvent("GooglePayStart", "开始支付")
googlePay?.googlePay(goodsId, "6", object : GooglePayCallBack {
override fun onPaySuccess(purchase: GooglePayResult, googleJson: String) {
mPresenter?.verifyThePayment(googleJson, GOOGLE_PAY)
EventUtils.onEvent("GooglePaySuccess")
EventUtils.onEvent("GooglePayEnd", "支付结束_成功")
}
override fun onCancel() {
runOnUiThread {
mLoading?.setResult(false, "pay cancel", 1000)
}
EventUtils.onEvent("GooglePayCancel")
EventUtils.onEvent("GooglePayEnd", "支付结束_取消")
}
override fun onError(error: String) {
Log.d("wxw", "PayError:$error")
runOnUiThread {
mLoading?.setResult(false, "pay error", 1000)
}
EventUtils.onEvent("GooglePayError", error)
EventUtils.onEvent("GooglePayEnd", "支付结束_异常 msg:${error}")
}
})
}
private fun payPalPay(goodsId: String, goodsPrice: String) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
showToast("Sorry your device does not currently support this payment method")
return
}
if (goodsId == "" || goodsPrice == "") {
EventUtils.onEvent("PayPalPayGoodsIdNull")
return
}
mLoading?.setLoading(getString(R.string.wait_ing))
mLoading?.show()
payPalPay?.payPalPay(goodsId, goodsPrice, "6", object : PayPalPayCallBack {
override fun onPaySuccess(result: String) {
EventUtils.onEvent("PayPalPaySuccess")
mPresenter?.verifyThePayment(result, PAY_PAL_PAY)
// runOnUiThread {
// mLoading?.setResult(false, "pay success", 1000)
// }
}
override fun onCancel() {
EventUtils.onEvent("PayPalPayCancel")
runOnUiThread {
mLoading?.setResult(false, "pay cancel", 1000)
}
}
override fun onError(error: String) {
Log.d("wxw", "PayError:$error")
EventUtils.onEvent("PayPalPayError", error)
runOnUiThread {
mLoading?.setResult(false, "pay error", 1000)
}
}
}, id_PayPal_btn)
}
}
\ No newline at end of file
......@@ -11,6 +11,8 @@ import androidx.recyclerview.widget.RecyclerView
import com.zxhl.cms.R
import com.zxhl.cms.pay.adapter.BecomeVipBannerAdapter
import com.zxhl.cms.pay.adapter.BecomeVipDialogBannerAdapter
import com.zxhl.cms.pay.adapter.BecomeVipDialogPriceAdapter
import com.zxhl.cms.utils.OnRecycleItemClickListener
import com.zxhl.cms.widget.CenterDialog
import com.zxhl.cms.widget.RecyclerViewPageChangeListenerHelper
import com.zxhl.cms.widget.UIndicator
......@@ -25,6 +27,7 @@ import org.greenrobot.eventbus.EventBus
object VipPayDialog {
private var mActivity: Activity? = null;
private var mBannerAdapter: BecomeVipDialogBannerAdapter? = null
private var mPriceAdapter: BecomeVipDialogPriceAdapter? = null
private var mCallBack: VipPayCallBack? = null
fun setDialogDismissCallback(callback: VipPayCallBack?) {
this.mCallBack = callback
......@@ -60,9 +63,9 @@ object VipPayDialog {
val pay_banner = mDialogView.findViewById<RecyclerView>(R.id.id_rcl_pay_banner)
val banner_indic = mDialogView.findViewById<UIndicator>(R.id.id_banner_indicator)
val btn_continue = mDialogView.findViewById<TextView>(R.id.id_tv_vip_dialog_pay_btn)
val price_list = mDialogView.findViewById<RecyclerView>(R.id.id_rcl_pay_price_list)
//banner
banner_indic.setIndicatorCount(5)
mBannerAdapter = BecomeVipDialogBannerAdapter(act)
pay_banner?.layoutManager = LinearLayoutManager(
act, LinearLayoutManager.HORIZONTAL,
......@@ -87,7 +90,13 @@ object VipPayDialog {
}
})
)
//price
mPriceAdapter =
BecomeVipDialogPriceAdapter(act) { view, position, data ->
mPriceAdapter?.setSelectView(position)
}
price_list?.layoutManager = LinearLayoutManager(act)
price_list?.adapter = mPriceAdapter
btn_continue.setOnClickListener {
mDialog?.dismiss()
......
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<solid android:color="#F4EDFF" />
<corners android:radius="10dp" />
</shape>
\ No newline at end of file
......@@ -165,4 +165,11 @@
android:textSize="18sp"
android:textStyle="bold" />
<com.paypal.checkout.paymentbutton.PayPalButton
android:id="@+id/id_PayPal_btn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_marginBottom="-100dp"
android:visibility="gone" />
</RelativeLayout>
\ No newline at end of file
......@@ -33,9 +33,10 @@
android:id="@+id/id_rcl_pay_price_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/id_rcl_pay_banner"
android:layout_below="@id/id_banner_indicator"
android:layout_marginLeft="10dp"
android:layout_marginTop="5dp"
android:layout_marginTop="30dp"
android:layout_above="@id/id_tv_vip_dialog_pay_btn"
android:layout_marginRight="10dp" />
<TextView
......@@ -44,7 +45,10 @@
android:layout_height="50dp"
android:layout_alignParentBottom="true"
android:layout_centerHorizontal="true"
android:layout_margin="20dp"
android:layout_marginLeft="20dp"
android:layout_marginRight="20dp"
android:layout_marginBottom="20dp"
android:layout_marginTop="5dp"
android:background="@drawable/shape_8857ff_bd8aff_bg_r25"
android:gravity="center"
android:text="Continue"
......
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:gravity="center_vertical"
android:orientation="horizontal">
<LinearLayout
android:id="@+id/id_ll_dialog_item_become_vip_view"
android:layout_width="match_parent"
android:layout_height="50dp"
android:paddingLeft="15dp"
android:paddingRight="15dp"
android:background="@drawable/shape_8857ff_bd8aff_bg_r10"
android:gravity="center_vertical"
android:orientation="horizontal">
<TextView
android:id="@+id/id_tv_dialog_item_vip_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="1 Month +"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
<ImageView
android:layout_width="20dp"
android:layout_height="20dp"
android:layout_marginLeft="10dp"
android:layout_marginEnd="5dp"
android:src="@drawable/icon_xingbi_da_wode" />
<TextView
android:id="@+id/id_tv_dialog_coin_num"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:text="780"
android:textColor="@color/white"
android:textSize="16sp"
android:textStyle="bold" />
<TextView
android:id="@+id/id_tv_dialog_item_price"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="$2.99"
android:textColor="@color/white"
android:textSize="18sp"
android:textStyle="bold" />
</LinearLayout>
</RelativeLayout>
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