Commit cca9009b authored by 王雪伟's avatar 王雪伟

[提交人]:王雪伟

[提交简述] :加入PayPal
[实现方案] :
parent 18372f31
......@@ -10,7 +10,7 @@
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<!-- <uses-permission android:name="android.permission.READ_PHONE_STATE" /> &lt;!&ndash; 用于写入缓存数据到扩展存储卡 &ndash;&gt;-->
<uses-permission android:name="android.permission.READ_PHONE_STATE" /> <!-- 用于写入缓存数据到扩展存储卡 -->
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
......@@ -28,7 +28,6 @@
<uses-permission android:name="com.android.vending.BILLING" />
<uses-sdk tools:overrideLibrary="com.bun.miitmdid" />
<application
......
PACKAGE_NAME=com.zhangxin.magicbox
VERSION_CODE=14
VERSION_NAME=1.0.3.6
\ No newline at end of file
VERSION_CODE=15
VERSION_NAME=1.0.3.7
\ No newline at end of file
......@@ -8,7 +8,9 @@ import android.Manifest;
public class Constant {
public static String PAY_PAL_CLIENT_ID ="AfYZMocYWtjeORYcG29SjvjJjS8L9_Mh8xlTi74ifLXboxFaVb43F_ZLc8geZVqLN47m2wr9PD24tRIh";
// public static String PAY_PAL_CLIENT_ID ="AfYZMocYWtjeORYcG29SjvjJjS8L9_Mh8xlTi74ifLXboxFaVb43F_ZLc8geZVqLN47m2wr9PD24tRIh";
// public static String PAY_PAL_CLIENT_ID ="AUNiByBvj_gaUfuEZUFZZ03pekpYtJKBq2oeUVMFYGAH0zK6ranKhtEAvximJKNcJpdpxihdSbwXualp";
public static String PAY_PAL_CLIENT_ID ="AT2Yc3Rged9oSBpMXftEh9hNkvTIs55kHLL122G-1rFkdLHMkPzFaF-3ZAu2ZEzb28vTLvInJb-V2-3l";
//公共参数
......@@ -140,6 +142,16 @@ public class Constant {
public static String recoverType = "1";
}
public static class NewUserBox {
public static String newUserBoxId = "";
public static String newUserBoxPrice = "";
public static String newUserBoxFivePrice = "";
public static String firstBoxId = "";
public static String firstBoxPrice = "";
public static boolean isRefreshHomeList = false;
}
public static final String UPDATE_TAB_INFO = "update_tab_info";
public static final String UPDATE_VIDEO_TAB_INFO = "update_video_tab_info";
public static final String OPEN_MAIN_PAGE = "main_page_open";
......
......@@ -114,6 +114,10 @@ class UpdateVersionPresenter : UpdateVersionContract.Presenter {
mView?.onNoUpdate()
}
}
} else {
if (isShowToast) {
mView?.onNoUpdate()
}
}
}
......
......@@ -22,4 +22,9 @@ class HomeBoxListEntity {
var goodsList:List<GoodList>?=null
var discount:String?=""
var newUserPrice:String?=""
var activitiesType: Int? = 0
var activitiesPrice: String? = ""
var activitiesRefreshId: String? = ""
var activitiesTimes: Int? = 0
}
\ No newline at end of file
......@@ -27,6 +27,8 @@ import com.zxhl.cms.googlepay.GooglePayResult
import com.zxhl.cms.net.SettingPreference
import com.zxhl.cms.net.model.box.AppInEntity
import com.zxhl.cms.net.model.video.MemberEntity
import com.zxhl.cms.paypal.PayPalHelper
import com.zxhl.cms.paypal.PayPalPayCallBack
import com.zxhl.cms.utils.*
import com.zxhl.cms.utils.EventUtils.onEvent
import com.zxhl.cms.widget.LoadingDialog
......@@ -35,7 +37,6 @@ import io.reactivex.Observable
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.functions.Consumer
import kotlinx.android.synthetic.main.activity_member.*
import org.json.JSONObject
import java.util.*
......@@ -104,6 +105,7 @@ class PayActivity : BaseActivity(), PayContract.View,
EventUtils.onEvent("GooglePayError_bd", error)
}
})
payPalPay = PayPalHelper(this)
id_img_back?.setOnClickListener {
finish()
......@@ -171,13 +173,13 @@ class PayActivity : BaseActivity(), PayContract.View,
Utils.showToast(this, "Please select payment type")
return@setOnClickListener
}
mLoading?.setLoading("Loading")
mLoading?.show()
// mLoading?.setLoading("Loading")
// mLoading?.show()
onEvent("pay_page_pay_btn", product?.cash + "")
if (pay_type == GOOGLE_PAY) {
googlePay(product?.goodsId ?: "")
} else if (pay_type == PAY_PAL_PAY) {
onEvent("pay_type_error", "暂不支持paypal")
payPalPay(product?.goodsId ?: "", product?.cash ?: "")
} else {
onEvent("pay_type_error", "pay_type$pay_type")
}
......@@ -549,4 +551,41 @@ class PayActivity : BaseActivity(), PayContract.View,
})
}
var payPalPay: PayPalHelper? = null
private fun payPalPay(goodsId: String, goodsPrice: String) {
if (goodsId == "" || goodsPrice == "") {
EventUtils.onEvent("GooglePayGoodsIdNull")
return
}
mLoading?.setLoading(getString(R.string.wait_ing2))
mLoading?.show()
payPalPay?.payPalPay(goodsId, goodsPrice, "6", object : PayPalPayCallBack {
override fun onPaySuccess(result: String) {
EventUtils.onEvent("PayPalPaySuccess")
mPresenter?.verifyPay(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
......@@ -249,6 +249,11 @@ class PayPresenter : PayContract.Presenter {
val tradeOrder = googleJson.optString("orderId") ?: ""
val outTradeOrder = googleJson.optString("obfuscatedAccountId") ?: ""
requestVerify(outTradeOrder, tradeOrder, payType)
}else if (payType == 5) {
val googleJson = JSONObject(order)
val tradeOrder = googleJson.optString("payPalId") ?: ""
val outTradeOrder = googleJson.optString("orderId") ?: ""
requestVerify(outTradeOrder, tradeOrder, payType)
}
} catch (e: Exception) {
mView?.verifyOrderFail()
......
......@@ -2,8 +2,10 @@ package com.zxhl.cms.paypal
import android.app.Activity
import android.os.Build
import android.os.Handler
import android.util.Log
import androidx.annotation.RequiresApi
import com.facebook.Profile
import com.paypal.checkout.PayPalCheckout
import com.paypal.checkout.PayPalCheckout.start
import com.paypal.checkout.approve.Approval
......@@ -13,9 +15,19 @@ import com.paypal.checkout.createorder.*
import com.paypal.checkout.error.ErrorInfo
import com.paypal.checkout.error.OnError
import com.paypal.checkout.order.*
import com.paypal.checkout.order.CaptureOrderResult.Success
import com.paypal.checkout.paymentbutton.PayPalButton
import com.paypal.checkout.shipping.OnShippingChange
import com.paypal.checkout.shipping.ShippingChangeActions
import com.paypal.checkout.shipping.ShippingChangeData
import com.paypal.pyplcheckout.pojo.Item
import com.zxhl.cms.googlepay.GooglePayCallBack
import com.zxhl.cms.net.ApiClient
import com.zxhl.cms.net.RxSchedulers
import com.zxhl.cms.net.callback.BaseObserver
import com.zxhl.cms.net.model.uc.GooglePayEntity
import com.zxhl.cms.utils.EventUtils
import kotlinx.android.synthetic.main.activity_member.*
import java.util.*
import kotlin.collections.ArrayList
......@@ -25,7 +37,122 @@ import kotlin.collections.ArrayList
* @datetime 2022-03-10 16:06 GMT+8
* @detail :
*/
object PayPaylHelper {
class PayPalHelper {
private val TAG = "PayPalHelper"
private var mActivity: Activity;
private var mPayCallBack: PayPalPayCallBack? = null;
private var mPayButton: PayPalButton? = null;//payPal按钮
constructor(mActivity: Activity) {
this.mActivity = mActivity
}
/**
* payPal支付
*/
fun payPalPay(
goodsId: String,
goodsPrice: String,
payMode: String,
payCallBack: PayPalPayCallBack,
payView: PayPalButton
) {
mPayButton = payView;
// EventUtils.onEvent("GooglePayGetOrderIdS", "获取订单号")
mPayCallBack = payCallBack
//向服务端获取订单ID
ApiClient.userInfoAPi.googlePay(goodsId, "5", "", "", payMode)
.compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<GooglePayEntity>() {
override fun onSuccess(result: GooglePayEntity?) {
if (result != null) {
startPay(result.outTradeNo, goodsPrice)
} else {
mPayCallBack?.onError("payPalPay 未获取到订单数据")
}
}
override fun onFailure(e: Throwable?, code: String?, errorMsg: String?) {
mPayCallBack?.onError("payPalPay 获取订单号接口异常 Error:$errorMsg")
}
})
}
private fun startPay(orderId: String, price: String) {
mPayButton?.setup(
createOrder = CreateOrder { createOrderActions ->
Log.e(TAG, "PayPalOrderId $orderId")
val order =
Order(
intent = OrderIntent.CAPTURE,
appContext = AppContext(userAction = UserAction.PAY_NOW),
purchaseUnitList =
listOf(
PurchaseUnit(
//金额相关
amount = Amount(currencyCode = CurrencyCode.USD, value = price),
//发票编号
invoiceId = orderId,
//引用ID
// referenceId = "" + System.currentTimeMillis(),
// customId = orderId,
// description = "这是一笔订单描述",
//收款人(商户的电子邮件地址,商家加密的PayPal账号ID)
// payee = Payee("",""),
// items = listOf(
// Items
// .Builder()
// .name("测试订单")
// .category(category = ItemCategory.DIGITAL_GOODS)
// .quantity("1")
// .build()
// ),
// payments = Payments(),
// shipping = Shipping(),
// softDescriptor = "简单说明"
)
)/*,
ProcessingInstruction.ORDER_COMPLETE_ON_PAYMENT_APPROVAL*/
)
// createOrderActions.set(orderId)
createOrderActions.create(order)
// Log.i("id_PayPal_btn", "createOrderActions order: ${order.purchaseUnitList.size}")
},
onApprove = OnApprove { approval ->
approval.orderActions.capture { captureOrderResult ->
// Log.e(TAG, "CaptureOrder CaptureOrderResult: $captureOrderResult")
// Log.e(TAG, "CaptureOrder approval.data.orderId: ${approval.data.payerId}")
// Log.e(TAG, "CaptureOrder approval.data.orderId: ${approval.data.paymentId}")
// Log.e(TAG, "CaptureOrder approval.data.orderId: ${approval.data.cart}")
// Log.e(TAG, "CaptureOrder approval.data.orderId: ${approval.data.payer}")
if (captureOrderResult is CaptureOrderResult.Success) {
var result = if (!captureOrderResult.orderResponse?.purchaseUnits?.get(0)?.payments?.captures?.get(0)?.id.isNullOrEmpty()) {
"{\"orderId\":\"${orderId}\",\"payPalId\":\"${captureOrderResult.orderResponse?.purchaseUnits?.get(0)?.payments?.captures?.get(0)?.id}\"}"
} else {
"{\"orderId\":\"${orderId}\",\"payPalId\":\"\"}"
}
mPayCallBack?.onPaySuccess(result)
} else if (captureOrderResult is CaptureOrderResult.Error) {
mPayCallBack?.onError("PayPal 获取订单失败 msg: ${captureOrderResult.message} reason:${captureOrderResult.reason}")
}
}
},
onError = OnError { errorInfo ->
Log.e(TAG, "Wid_PayPal_btn OnError Error: $errorInfo")
mPayCallBack?.onError("payPalError:$errorInfo")
},
onCancel = OnCancel {
Log.e(TAG, " OnCancel Buyer canceled the PayPal experience.")
mPayCallBack?.onCancel()
}
)
mPayButton?.callOnClick()
}
// private val TAG = "PayPaylHelper"
// private var checkOrderMax: Int = 300//循环检测的最大次数
......
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
......@@ -229,7 +229,7 @@
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_marginLeft="15dp"
android:drawableLeft="@drawable/zhifub"
android:drawableLeft="@drawable/paypal_icon"
android:drawablePadding="5dp"
android:text="@string/pay_paypal"
android:textColor="@color/color_333333"
......
......@@ -90,7 +90,7 @@ class BoxAdapter : BaseRecyclerAdapter<HomeBoxListEntity, RecyclerView.ViewHolde
holder.item_tv_sales_volume?.text =
AppContext.get().getString(R.string.open_nums, bean.numbersStr)
// holder.item_tv_min_max_price?.text = "${bean.minPriceStr}~${bean.maxPriceStr}元商品"
holder.item_tv_min_max_price?.text = AppContext.get().getString(R.string.get_value)+"$${bean.minPrice}-${bean.maxPrice}"
holder.item_tv_min_max_price?.text = AppContext.get().getString(R.string.get_value)+"$${bean.minPrice}-$${bean.maxPrice}"
holder.item_ll?.setOnClickListener {
listener.onItemClick(it, position, bean)
}
......
......@@ -35,6 +35,7 @@ class AllFragment : BaseFragment, HomeContract.View,
constructor(title: String) : super() {
this.title = title
}
constructor() : super() {
this.title = ""
}
......@@ -45,7 +46,7 @@ class AllFragment : BaseFragment, HomeContract.View,
override fun init(view: View?) {
// showNewPeople()
wechatutil= WeChatUtils(mActivity,this)
wechatutil = WeChatUtils(mActivity, this)
mPresenter = HomePresenter(this)
mAdapter = BoxAdapter(mActivity, this)
//拥有的币数量
......@@ -87,6 +88,9 @@ class AllFragment : BaseFragment, HomeContract.View,
Log.d("lazyLoad", "isInitial:" + isInitial + " isVisible:" + isVisible)
if (isInitial && isVisible && mAdapter?.itemCount == 0) {
mPresenter?.getHomeBoxList(title, true)
} else if (isInitial && isVisible && Constant.NewUserBox.isRefreshHomeList) {
mPresenter?.getHomeBoxList(title, true)
Constant.NewUserBox.isRefreshHomeList = false
}
}
......@@ -124,16 +128,16 @@ class AllFragment : BaseFragment, HomeContract.View,
override fun onItemClick(view: View?, position: Int, data: HomeBoxListEntity?) {
when (view?.id) {
R.id.id_ll_item->{
R.id.id_ll_item -> {
JumpUtils.goodsDetailJump(data?.boxId)
}
R.id.id_tv_one_lottery->{
Log.e("MXL","点击抽奖")
R.id.id_tv_one_lottery -> {
Log.e("MXL", "点击抽奖")
wechatutil?.isWechatLogin(object : IsLoginCallBack<IsWeChatLoginEntity> {
override fun onResult(result: IsWeChatLoginEntity?) {
if(result?.status.equals("0")){
if (result?.status.equals("0")) {
JumpUtils.ThirdPardLoginJump()
}else{
} else {
oneLottery(data)
}
}
......@@ -149,8 +153,8 @@ class AllFragment : BaseFragment, HomeContract.View,
}
fun oneLottery(data: HomeBoxListEntity?){
ownCoin=SettingPreference.getUserCoinNum().toDoubleOrNull()
fun oneLottery(data: HomeBoxListEntity?) {
ownCoin = SettingPreference.getUserCoinNum().toDoubleOrNull()
if (ownCoin?.compareTo(data?.onePrice!!)!! >= 0) {
BoxResultDialog.showOneLotteryResult(
mActivity,
......@@ -158,7 +162,7 @@ class AllFragment : BaseFragment, HomeContract.View,
data?.onePrice!!,
data.fivePrice, 0
)
}else{
} else {
val chajia = data?.onePrice?.minus(ownCoin!!)
JumpUtils.payJump(data?.boxId, chajia.toString(), Constant.Key.ONE_LOTTERY)
}
......
package com.zxhl.main.page.presenter
import com.zxhl.cms.common.Constant
import com.zxhl.cms.net.ApiClient
import com.zxhl.cms.net.RxSchedulers
import com.zxhl.cms.net.callback.BaseObserver
......@@ -24,6 +25,15 @@ class HomePresenter : HomeContract.Presenter {
.compose(RxSchedulers.observableIO2Main())
.subscribe(object : BaseObserver<List<HomeBoxListEntity>>() {
override fun onSuccess(result: List<HomeBoxListEntity>?) {
if (page == 1 && !result.isNullOrEmpty()) {
if (result[0].activitiesType == 3) {
Constant.NewUserBox.newUserBoxId = result[0].boxId
Constant.NewUserBox.newUserBoxPrice = result[0].onePrice.toString()
Constant.NewUserBox.newUserBoxFivePrice = result[0].fivePrice.toString()
Constant.NewUserBox.firstBoxId = result[0].activitiesRefreshId ?: ""
Constant.NewUserBox.firstBoxPrice = result[0].activitiesPrice ?: ""
}
}
if ((result?.size ?: 0) < size) {
mView.setLoadMore(false)
} else {
......
......@@ -2,8 +2,6 @@ package com.zxhl.main.page.view
import android.app.Activity
import android.app.Dialog
import android.app.SearchManager
import android.graphics.Color
import android.text.Html
import android.text.TextUtils
import android.util.Log
......@@ -333,6 +331,25 @@ object BoxResultDialog : LotteryContract.View {
override fun setOneLotterResult(result: OneLotteryEntity?) {
UserDataUtils.updateUserInfo(null)
// if (!TextUtils.isEmpty(Constant.NewUserBox.firstBoxId)) {
// Log.e("MXL", "抽了新人的item")
// Constant.NewUserBox.isRefreshHomeList = true;
// }
//修正免费盲盒和新人盲盒的下一个盲盒id
if (boxId == "-2" && Constant.NewUserBox.newUserBoxId != "") {
boxId = Constant.NewUserBox.newUserBoxId
onePrice = Constant.NewUserBox.newUserBoxPrice.toDouble();
fivePrice = Constant.NewUserBox.newUserBoxFivePrice.toDouble();
} else if (boxId == Constant.NewUserBox.newUserBoxId && !Constant.NewUserBox.firstBoxId.isNullOrEmpty()) {
boxId = Constant.NewUserBox.firstBoxId;
onePrice = Constant.NewUserBox.firstBoxPrice.toDouble();
fivePrice = onePrice.times(5)
Constant.NewUserBox.firstBoxId = ""
Constant.NewUserBox.isRefreshHomeList = true;
}
if (mActivity != null && result?.goods != null) {
showResultDialog(
mActivity!!,
......
......@@ -67,12 +67,13 @@ object FreeGoodsDialog {
JumpUtils.lotteryBoxJump("-2", Constant.Key.ONE_LOTTERY, "0")
mDialog?.dismiss()
}
mDialog?.setOnDismissListener {
Log.d("MXL","我被关闭了")
}
mDialog?.setCanceledOnTouchOutside(false)
mDialog?.setCancelable(false)
mDialog?.show()
mDialog?.setOnDismissListener {
Log.d("MXL","我被关闭了")
}
}
}
\ No newline at end of file
......@@ -28,7 +28,7 @@
android:layout_height="wrap_content"
android:layout_alignParentRight="true"
android:layout_alignParentBottom="true"
android:layout_marginBottom="12dp"
android:paddingBottom="12dp"
android:drawablePadding="5dp"
android:paddingRight="15dp"
android:drawableLeft="@drawable/icon_cangku"
......
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