123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581 |
- package com.edufound.reader.presenter;
- import android.content.Intent;
- import android.content.IntentSender;
- import android.os.Handler;
- import android.os.Message;
- import android.text.TextUtils;
- import android.view.LayoutInflater;
- import android.view.View;
- import android.view.ViewGroup;
- import android.widget.FrameLayout;
- import android.widget.ImageView;
- import android.widget.LinearLayout;
- import android.widget.TextView;
- import android.widget.Toast;
- import androidx.annotation.NonNull;
- import com.edufound.reader.R;
- import com.edufound.reader.apiserver.OrderApiServerImpl;
- import com.edufound.reader.base.BaseActivity;
- import com.edufound.reader.base.BasePresenter;
- import com.edufound.reader.bean.HttpResultBean;
- import com.edufound.reader.bean.PayResultBean;
- import com.edufound.reader.contract.HuaWeiPayContract;
- import com.edufound.reader.cusview.CusToast;
- import com.edufound.reader.interfaces.EfunboxInterfaces;
- import com.edufound.reader.model.HuaWeiPayModel;
- import com.edufound.reader.util.Consts;
- import com.edufound.reader.util.EfunboxUtil;
- import com.google.gson.reflect.TypeToken;
- import com.huawei.hmf.tasks.OnFailureListener;
- import com.huawei.hmf.tasks.OnSuccessListener;
- import com.huawei.hmf.tasks.Task;
- import com.huawei.hms.iap.Iap;
- import com.huawei.hms.iap.IapApiException;
- import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseReq;
- import com.huawei.hms.iap.entity.ConsumeOwnedPurchaseResult;
- import com.huawei.hms.iap.entity.InAppPurchaseData;
- import com.huawei.hms.iap.entity.IsEnvReadyResult;
- import com.huawei.hms.iap.entity.OrderStatusCode;
- import com.huawei.hms.iap.entity.OwnedPurchasesReq;
- import com.huawei.hms.iap.entity.OwnedPurchasesResult;
- import com.huawei.hms.iap.entity.PurchaseIntentReq;
- import com.huawei.hms.iap.entity.PurchaseIntentResult;
- import com.huawei.hms.iap.entity.PurchaseResultInfo;
- import com.huawei.hms.iap.util.IapClientHelper;
- import com.huawei.hms.support.api.client.Status;
- import com.okhttplib.HttpInfo;
- import com.okhttplib.callback.Callback;
- import com.orhanobut.logger.Logger;
- import org.json.JSONException;
- import org.json.JSONObject;
- import java.io.IOException;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- public class HuaWeiPayPresenter extends BasePresenter<HuaWeiPayContract.View> implements HuaWeiPayContract.Presenter {
- HuaWeiPayModel mModel;
- OrderApiServerImpl mOrderApi;
- List<PayResultBean> mPayResult;
- HuaWeiPayBean payBean;
- String HuaWeiPayType = "";
- public HuaWeiPayPresenter() {
- this.mModel = new HuaWeiPayModel();
- mOrderApi = new OrderApiServerImpl();
- }
- @Override
- public void getProductInfo() {
- mOrderApi.getProductListInfo(mView.getActivity(), Consts.getUMengChannel(), new Callback() {
- @Override
- public void onSuccess(HttpInfo info) throws IOException {
- HttpResultBean<List<PayResultBean>> bean = info.getRetDetail(new TypeToken<HttpResultBean<List<PayResultBean>>>() {
- }.getType());
- mPayResult = bean.getData();
- mView.getProductSuccess();
- }
- @Override
- public void onFailure(HttpInfo info) throws IOException {
- Logger.e("error:" + info.getRetDetail());
- }
- });
- }
- @Override
- public void activityDestory() {
- if (handler != null) {
- handler.removeMessages(1);
- handler.removeMessages(2);
- handler = null;
- }
- }
- @Override
- public void initPayItem(LinearLayout itemFrame) {
- Logger.e("initPayItem");
- for (int i = 0; i < mPayResult.size(); i++) {
- Message message = new Message();
- message.obj = itemFrame;
- message.what = 1;
- message.arg1 = i;
- handler.sendMessageDelayed(message, 50 * i);
- }
- }
- void initItem(LinearLayout itemFrame, int position) {
- View view = LayoutInflater.from(mView.getActivity()).inflate(R.layout.activity_pay_tmail_item, null);
- view.setLayoutParams(new LinearLayout.LayoutParams(0, ViewGroup.LayoutParams.MATCH_PARENT, 1));
- view.animate().scaleX(0.9f).scaleY(0.9f).setDuration(0).start();
- PayItemHolder holder = new PayItemHolder(view);
- holder.mTitle.setText(mPayResult.get(position).getTitle());
- holder.mPayMoney.setText(String.valueOf(Integer.parseInt(mPayResult.get(position).getPrice()) / 100));
- holder.mRecommend.setVisibility(View.VISIBLE);
- holder.mOriginPrice.setText("原价¥ " + String.valueOf(Integer.parseInt(mPayResult.get(position).getOriginPrice()) / 100));
- if (mPayResult.get(position).getPayType().equals("YEAR")) {
- holder.mConstraintLayoutBg.setBackgroundResource(R.drawable.activity_pay_tmail_item_year);
- } else if (mPayResult.get(position).getPayType().equals("MONTH")) {
- holder.mConstraintLayoutBg.setBackgroundResource(R.drawable.activity_pay_tmal_item_month);
- holder.mRecommend.setVisibility(View.INVISIBLE);
- } else {
- holder.mConstraintLayoutBg.setBackgroundResource(R.drawable.activity_pay_tmal_item_month);
- holder.mRecommend.setVisibility(View.INVISIBLE);
- }
- view.setTag(holder);
- mView.addUiClick(view, o -> {
- Map<String, String> params = new HashMap<>();
- params.put("productId", mPayResult.get(position).getId());
- params.put("channel", Consts.getUMengChannel());
- params.put("payType", mPayResult.get(position).getPayType());
- params.put("uid", Consts.getmConstsUserBean().getUid());
- params.put("first", "false");
- //连续包月走单独接口
- //创建订单,然后调用华为支付
- //先判断是否登录华为账号了,然后再进行支付处理isEnvReady
- //0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- String json = ((BaseActivity) mView.getActivity()).getGson().toJson(params);
- if (mPayResult.get(position).getPayType().equals("CONSECUTIVE_MONTH")) {
- //连续包月
- HuaWeiPayType = "2";
- mModel.HuaWeiPayContinuous(mView.getActivity(), json, createOrderCallBack);
- } else {
- HuaWeiPayType = "0";
- mModel.HuaWeiPay(mView.getActivity(), json, createOrderCallBack);
- }
- });
- itemFrame.addView(view);
- if (position >= mPayResult.size() - 1) {
- // Logger.e("position:" + position);
- // Logger.e("mPayResult.size():" + mPayResult.size());
- // itemFrame.getChildAt(0).performClick();
- }
- }
- Callback createOrderCallBack = new Callback() {
- @Override
- public void onSuccess(HttpInfo info) throws IOException {
- Logger.e("创建订单返回信息成功:" + info.getRetDetail());
- Logger.e("创建订单返回信息成功:getParamJson-" + info.getParamJson());
- try {
- JSONObject object = new JSONObject(info.getRetDetail());
- JSONObject json = object.getJSONObject("data");
- Logger.e("json:" + json);
- //缺少参数
- payBean = new HuaWeiPayBean();
- payBean.orderId = json.getString("orderId");
- payBean.productIds = json.getString("productId");
- payBean.priceType = HuaWeiPayType;
- toPay(payBean);
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- @Override
- public void onFailure(HttpInfo info) throws IOException {
- Logger.e("创建订单返回信息失败:" + info.getRetDetail());
- Logger.e("创建订单返回信息成功:getParamJson-" + info.getParamJson());
- Toast.makeText(mView.getActivity(), "创建订单失败", Toast.LENGTH_SHORT).show();
- }
- };
- Handler handler = new Handler(new Handler.Callback() {
- @Override
- public boolean handleMessage(@NonNull Message message) {
- switch (message.what) {
- case 1:
- initItem(((LinearLayout) message.obj), message.arg1);
- break;
- case 2:
- break;
- }
- return false;
- }
- });
- @Override
- public void isEnvReady() {
- // 获取调用接口的Activity对象
- Task<IsEnvReadyResult> task = Iap.getIapClient(mView.getActivity()).isEnvReady();
- task.addOnSuccessListener(new OnSuccessListener<IsEnvReadyResult>() {
- @Override
- public void onSuccess(IsEnvReadyResult result) {
- // 获取接口请求的结果
- String carrierId = result.getCarrierId();
- Logger.e("onSuccess=carrierId:" + carrierId);
- if (payBean != null) {
- toPay(payBean);
- } else {
- CusToast.getInstance(mView.getActivity()).show("payBean==null", 3000);
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- if (status.getStatusCode() == OrderStatusCode.ORDER_HWID_NOT_LOGIN) {
- // 未登录帐号
- if (status.hasResolution()) {
- try {
- // 6666是您自定义的常量
- // 启动IAP返回的登录页面
- status.startResolutionForResult(mView.getActivity(), 6666);
- } catch (IntentSender.SendIntentException exp) {
- }
- }
- } else if (status.getStatusCode() == OrderStatusCode.ORDER_ACCOUNT_AREA_NOT_SUPPORTED) {
- // 用户当前登录的华为帐号所在的服务地不在华为IAP支持结算的国家/地区中
- }
- } else {
- // 其他外部错误
- }
- }
- });
- }
- //补单
- @Override
- public void checkOrder(int pricetype) {
- Logger.e("补单:" + pricetype);
- // 构造一个OwnedPurchasesReq对象
- OwnedPurchasesReq ownedPurchasesReq = new OwnedPurchasesReq();
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- ownedPurchasesReq.setPriceType(pricetype);
- // 获取调用接口的Activity对象
- // 调用obtainOwnedPurchases接口获取所有已购但未发货的消耗型商品的购买信息
- Task<OwnedPurchasesResult> task = Iap.getIapClient(mView.getActivity()).obtainOwnedPurchases(ownedPurchasesReq);
- task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
- @Override
- public void onSuccess(OwnedPurchasesResult result) {
- // 获取接口请求成功的结果
- if (result != null && result.getInAppPurchaseDataList() != null) {
- for (int i = 0; i < result.getInAppPurchaseDataList().size(); i++) {
- String inAppPurchaseData = result.getInAppPurchaseDataList().get(i);
- String inAppSignature = result.getInAppSignature().get(i);
- Logger.e("inAppPurchaseData:" + inAppPurchaseData);
- if (inAppPurchaseData != null) {
- sendProduct(inAppPurchaseData);
- }
- // 使用应用的IAP公钥验证inAppPurchaseData的签名数据
- // 如果验签成功,确认每个商品的购买状态。确认商品已支付后,检查此前是否已发过货,未发货则进行发货操作。发货成功后执行消耗操作
- }
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- }
- @Override
- public void checkAutoPay() {
- // 构造一个OwnedPurchasesReq对象
- OwnedPurchasesReq ownedPurchasesReq = new OwnedPurchasesReq();
- // priceType: 2:订阅型商品
- ownedPurchasesReq.setPriceType(2);
- // 调用obtainOwnedPurchases接口
- Task<OwnedPurchasesResult> task = Iap.getIapClient(mView.getActivity()).obtainOwnedPurchases(ownedPurchasesReq);
- task.addOnSuccessListener(new OnSuccessListener<OwnedPurchasesResult>() {
- @Override
- public void onSuccess(OwnedPurchasesResult result) {
- // 获取接口请求结果
- if (result != null && result.getInAppPurchaseDataList() != null) {
- for (int i = 0; i < result.getInAppPurchaseDataList().size(); i++) {
- String inAppPurchaseData = result.getInAppPurchaseDataList().get(i);
- String inAppSignature = result.getInAppSignature().get(i);
- // 您需要使用您的应用的IAP公钥验证inAppPurchaseData的签名
- // 如果验签成功,请检查支付状态和订阅状态
- try {
- InAppPurchaseData inAppPurchaseDataBean = new InAppPurchaseData(inAppPurchaseData);
- int purchaseState = inAppPurchaseDataBean.getPurchaseState();
- boolean isSubValid = inAppPurchaseDataBean.isSubValid();
- /**
- *
- * true:表示商品已经收费且未过期,也没有发生退款;商品处于宽限期。您可以基于该标志为顾客提供服务。
- * false:未完成购买或者已经过期,或者购买后已经退款。
- *
- * */
- if (isSubValid) {
- //已购买,刷新用户信息
- // MainActivity.getIntences().loadJsMehtod("HuaWeiAutoPayResult('" + true + "')");
- } else {
- //未购买,刷新用户信息
- // MainActivity.getIntences().loadJsMehtod("HuaWeiAutoPayResult('" + false + "')");
- }
- EfunboxUtil.getYFVip(mView.getActivity(), new EfunboxInterfaces.getYFVipInterfaces() {
- @Override
- public void success(long time) {
- }
- @Override
- public void error() {
- }
- });
- } catch (JSONException e) {
- }
- }
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- }
- @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- if (requestCode == 6666) {
- if (data != null) {
- // 使用parseRespCodeFromIntent方法获取接口请求结果
- int returnCode = IapClientHelper.parseRespCodeFromIntent(data);
- if (returnCode == OrderStatusCode.ORDER_STATE_SUCCESS) {
- //支持支付
- // 使用parseCarrierIdFromIntent方法获取接口返回的运营商ID
- String carrierId = IapClientHelper.parseCarrierIdFromIntent(data);
- Logger.e("onActivityResult--carrierId:" + carrierId);
- if (payBean != null) {
- toPay(payBean);
- } else {
- CusToast.getInstance(mView.getActivity()).show("payBean==null", 3000);
- }
- }
- }
- } else if (requestCode == 9999) {
- //支付返回
- // 调用parsePurchaseResultInfoFromIntent方法解析支付结果数据
- PurchaseResultInfo purchaseResultInfo = Iap.getIapClient(mView.getActivity()).parsePurchaseResultInfoFromIntent(data);
- switch (purchaseResultInfo.getReturnCode()) {
- case OrderStatusCode.ORDER_STATE_CANCEL:
- // 用户取消
- // Toast.makeText(mActivity, "用户取消支付", Toast.LENGTH_SHORT).show();
- CusToast.getInstance(mView.getActivity()).show("取消支付", 3000);
- break;
- case OrderStatusCode.ORDER_STATE_FAILED:
- case OrderStatusCode.ORDER_STATE_DEFAULT_CODE:
- case OrderStatusCode.ORDER_PRODUCT_OWNED:
- // 检查是否存在未发货商品
- Logger.e("\"支付失败:\" + purchaseResultInfo.getReturnCode():" + purchaseResultInfo.getReturnCode());
- CusToast.getInstance(mView.getActivity()).show("支付失败:" + purchaseResultInfo.getReturnCode(), 3000);
- break;
- case OrderStatusCode.ORDER_STATE_SUCCESS:
- // 支付成功
- String inAppPurchaseData = purchaseResultInfo.getInAppPurchaseData();
- String inAppPurchaseDataSignature = purchaseResultInfo.getInAppDataSignature();
- Logger.e("支付成功:" + inAppPurchaseData);
- CusToast.getInstance(mView.getActivity()).show("支付成功", 3000);
- // 使用您应用的IAP公钥验证签名
- // 若验签成功,则进行发货
- // 若用户购买商品为消耗型商品,您需要在发货成功后调用consumeOwnedPurchase接口进行消耗
- if (Integer.valueOf(payBean.priceType) == 0) {
- //消耗型产品
- //发货
- // MainActivity.getIntences().loadJsMehtod("HuaWeiPayResult(" + true + ")");
- sendProduct(inAppPurchaseData);
- } else if (Integer.valueOf(payBean.priceType) == 1) {
- //非消耗型产品
- } else if (Integer.valueOf(payBean.priceType) == 2) {
- //订阅型产品
- checkAutoPay();
- }
- // finish();
- break;
- default:
- Logger.e("支付default:purchaseResultInfo.getReturnCode():" + purchaseResultInfo.getReturnCode());
- break;
- }
- }
- }
- public void toPay(HuaWeiPayBean bean) {
- if (bean == null) {
- CusToast.getInstance(mView.getActivity()).show("payBean==null", 3000);
- return;
- }
- // 构造一个PurchaseIntentReq对象
- PurchaseIntentReq req = new PurchaseIntentReq();
- // 通过createPurchaseIntent接口购买的商品必须是您在AppGallery Connect网站配置的商品
- req.setProductId(bean.productIds);
- // priceType: 0:消耗型商品; 1:非消耗型商品; 2:订阅型商品
- if (TextUtils.isEmpty(bean.priceType)) {
- bean.priceType = "0";
- }
- req.setPriceType(Integer.valueOf(bean.priceType));
- req.setDeveloperPayload(bean.orderId);
- // 获取调用接口的Activity对象
- // 调用createPurchaseIntent接口创建托管商品订单
- Task<PurchaseIntentResult> task = Iap.getIapClient(mView.getActivity()).createPurchaseIntent(req);
- task.addOnSuccessListener(new OnSuccessListener<PurchaseIntentResult>() {
- @Override
- public void onSuccess(PurchaseIntentResult result) {
- // 获取创建订单的结果
- Status status = result.getStatus();
- if (status.hasResolution()) {
- try {
- // 启动IAP返回的收银台页面
- status.startResolutionForResult(mView.getActivity(), 9999);
- } catch (IntentSender.SendIntentException exp) {
- }
- }
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- Logger.e("支付调用失败:" + status + "--returnCode=" + returnCode);
- } else {
- // 其他外部错误
- }
- CusToast.getInstance(mView.getActivity()).show("支付调用失败", 3000);
- }
- });
- }
- //发货
- public void sendProduct(String data) {
- InAppPurchaseData inAppPurchaseDataBean = null;
- try {
- inAppPurchaseDataBean = new InAppPurchaseData(data);
- int purchaseState = inAppPurchaseDataBean.getPurchaseState();
- int consumptionState = inAppPurchaseDataBean.getConsumptionState();
- if (purchaseState == 0 && consumptionState == 0) {
- //购买成功但是未消耗,开始发货
- //支付成功
- Logger.e("准备发货");
- String purchaseToken = inAppPurchaseDataBean.getPurchaseToken();
- ConsumeOwnedPurchaseReq req = new ConsumeOwnedPurchaseReq();
- req.setPurchaseToken(purchaseToken);
- Task<ConsumeOwnedPurchaseResult> task = Iap.getIapClient(mView.getActivity()).consumeOwnedPurchase(req);
- task.addOnSuccessListener(new OnSuccessListener<ConsumeOwnedPurchaseResult>() {
- @Override
- public void onSuccess(ConsumeOwnedPurchaseResult result) {
- // 获取接口请求结果
- Logger.e("发货成功");
- EfunboxUtil.getYFVip(mView.getActivity(), new EfunboxInterfaces.getYFVipInterfaces() {
- @Override
- public void success(long time) {
- }
- @Override
- public void error() {
- }
- });
- }
- }).addOnFailureListener(new OnFailureListener() {
- @Override
- public void onFailure(Exception e) {
- if (e instanceof IapApiException) {
- IapApiException apiException = (IapApiException) e;
- Status status = apiException.getStatus();
- int returnCode = apiException.getStatusCode();
- } else {
- // 其他外部错误
- }
- }
- });
- } else if (purchaseState == 0 && consumptionState == 1) {
- Logger.e("已购买并且已经发货了");
- EfunboxUtil.getYFVip(mView.getActivity(), new EfunboxInterfaces.getYFVipInterfaces() {
- @Override
- public void success(long time) {
- }
- @Override
- public void error() {
- }
- });
- } else {
- Logger.e("发货失败");
- Logger.e("purchaseState:" + purchaseState);
- Logger.e("consumptionState:" + consumptionState);
- }
- } catch (JSONException e) {
- e.printStackTrace();
- }
- }
- class PayItemHolder {
- FrameLayout mConstraintLayoutBg;
- TextView mTitle;
- TextView mOriginPrice;
- TextView mPayMoney;
- ImageView mRecommend;
- public PayItemHolder(View itemView) {
- mConstraintLayoutBg = itemView.findViewById(R.id.activity_pay_tmail_item_bg);
- mTitle = itemView.findViewById(R.id.activity_pay_tmail_item_title);
- mOriginPrice = itemView.findViewById(R.id.activity_pay_tmail_item_originprice);
- mPayMoney = itemView.findViewById(R.id.activity_pay_tmail_item_money);
- mRecommend = itemView.findViewById(R.id.activity_pay_tmail_item_recommend);
- }
- }
- class HuaWeiPayBean {
- public String productIds;
- public String priceType;
- public String orderId;
- }
- }
|