package cn.mutils.app.pay; import com.tencent.mm.sdk.constants.Build; import com.tencent.mm.sdk.modelpay.PayReq; import com.tencent.mm.sdk.openapi.IWXAPI; import com.tencent.mm.sdk.openapi.WXAPIFactory; import cn.mutils.app.App; import cn.mutils.app.io.AppBroadcast; import cn.mutils.core.ILockable; import cn.mutils.core.err.ErrorCodeException; import cn.mutils.core.task.IStoppableManager; /** * WeChat pay task */ @SuppressWarnings({"unused", "ConstantConditions"}) public class WXPayTask extends AppPayTask implements ILockable { protected String mAppId; protected String mPartnerId; protected String mPrepayId; protected String mNonceStr; protected String mTimeStamp; protected String mPackageValue; protected String mSign; protected String mExtData; @Override public boolean isLocked() { return true; } @Override public void setLocked(boolean locked) { } public String getAppId() { return mAppId; } public void setAppId(String value) { mAppId = value; } public String getPartnerId() { return mPartnerId; } public void setPartnerId(String value) { mPartnerId = value; } public String getPrepayId() { return mPrepayId; } public void setPrepayId(String value) { mPrepayId = value; } public String getNonceStr() { return mNonceStr; } public void setNonceStr(String value) { mNonceStr = value; } public String getTimeStamp() { return mTimeStamp; } public void setTimeStamp(String value) { mTimeStamp = value; } public String getPackageValue() { return mPackageValue; } public void setPackageValue(String value) { mPackageValue = value; } public String getSign() { return mSign; } public void setSign(String value) { mSign = value; } public String getExtData() { return mExtData; } public void setExtData(String value) { mExtData = value; } @Override protected void onStart() { if (App.getWechatAppId() == null) { dispatchException(); return; } IWXAPI api = WXAPIFactory.createWXAPI(mContext, mAppId); if (api == null) { dispatchException(); return; } if (!api.isWXAppInstalled()) { dispatchException(); return; } if (api.getWXAppSupportAPI() < Build.PAY_SUPPORTED_SDK_INT) { dispatchException(); return; } api.registerApp(mAppId); PayReq req = new PayReq(); req.appId = mAppId; req.partnerId = mPartnerId; req.prepayId = mPrepayId; req.nonceStr = mNonceStr; req.timeStamp = mTimeStamp; req.packageValue = mPackageValue; req.sign = mSign; if (mExtData != null) { req.extData = mExtData; } api.sendReq(req); WXPayBroadcast broadcast = new WXPayBroadcast(mContext); broadcast.setOnReceiveListener(new WXPayBroadcastReceiverListener()); if (mContext instanceof IStoppableManager) { ((IStoppableManager) mContext).bind(this); } broadcast.start(); } protected void dispatchException() { for (AppPayListener listener : getListeners(AppPayListener.class)) { listener.onError(this, new Exception()); } stop(); } class WXPayBroadcastReceiverListener implements AppBroadcast.OnReceiveListener<WXPayBroadcast.WXPayExtra> { @Override public void onReceive(AppBroadcast<WXPayBroadcast.WXPayExtra> broadcast, WXPayBroadcast.WXPayExtra extra) { broadcast.stop(); if (extra.errCode == 0) { for (AppPayListener listener : getListeners(AppPayListener.class)) { listener.onComplete(WXPayTask.this); } } else { for (AppPayListener listener : getListeners(AppPayListener.class)) { ErrorCodeException e = new ErrorCodeException(extra.errCode, extra.errStr); listener.onError(WXPayTask.this, e); } } stop(); } } }