Commit eafa1f54 authored by zhang_z's avatar zhang_z

添加微信支付;

parent 63cad057
......@@ -16,8 +16,8 @@ class ErrorFilter<T> implements Function<Throwable, HttpMessage<T>> {
@Override
public HttpMessage<T> apply(@NonNull Throwable throwable) throws Exception {
LogUtils.e(throwable.getMessage());
if (throwable != null) LogUtils.e(throwable.getMessage());
//可根据Throwable具体区分,现在先统一变成服务器异常
return new HttpMessage<>(C.RETURN_CODE.SERVER_ERR,C.RETURN_INFO.SERVER_ERR_INFO);
return new HttpMessage<>(C.RETURN_CODE.SERVER_ERR, C.RETURN_INFO.SERVER_ERR_INFO);
}
}
\ No newline at end of file
......@@ -63,8 +63,8 @@ public class Jni {
//Client
OkHttpClient okHttpClient = new OkHttpClient.Builder()
.readTimeout(C.API_BUILDER.READ_TIMEOUT, TimeUnit.MILLISECONDS)
.connectTimeout(C.API_BUILDER.CONNECT_TIMEOUT, TimeUnit.MILLISECONDS)
.readTimeout(C.API_BUILDER.READ_TIMEOUT * 20, TimeUnit.MILLISECONDS)
.connectTimeout(C.API_BUILDER.CONNECT_TIMEOUT * 20, TimeUnit.MILLISECONDS)
.addInterceptor(headInterceptor)
.addInterceptor(logInterceptor)
.cookieJar(cookieJar)
......
package com.xingdata.zzdpos.api;
import com.alibaba.fastjson.JSON;
import com.xingdata.zzdpos.util.ConvertUtil;
import io.reactivex.Observable;
import io.reactivex.android.schedulers.AndroidSchedulers;
import io.reactivex.schedulers.Schedulers;
public class JniFactory {
public static class Settle {
public static Observable<Pay.Response> pay(String str) {
return Jni.getInstance().service.pay(str)
private static Pay.Request q;
public static Observable<String> pay(int payChannel, String payCode, Long orderAmt, String orderNo) {
q = new Pay.Request();
q.setPayChannelType(payChannel + "");
q.setOrderType("01");
q.setOrderAmt(ConvertUtil.longToString(orderAmt));
q.setChannelAuthCode(payCode);
q.setOrderNo(orderNo);
q.setOldOrderNo(orderNo);
return Jni.getInstance().service.pay(JSON.toJSONString(q))
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
public static Observable<String> query() {
q.setOrderType("02");
return Jni.getInstance().service.pay(JSON.toJSONString(q))
.onErrorReturn(new ErrorFilter<>())
.map(new ResultFilter<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
}
}
......@@ -8,5 +8,5 @@ import retrofit2.http.Query;
interface JniService {
@GET(C.URL.TEMP_PAY.pay)
Observable<HttpMessage<Pay.Response>> pay(@Query("para") String str);
Observable<HttpMessage<String>> pay(@Query("para") String str);
}
......@@ -10,13 +10,11 @@ import java.util.Locale;
public class Pay {
public static class Request {
public Request(int payChannelType) {
setOrderType("01");
setPayChannelType(payChannelType + "");
setDeviceType("02");
public Request() {
setDeviceType("01");
setMch_id("11");
setTer_id("00000011");
setOrderDateTime(TimeUtils.getNowString(new SimpleDateFormat("yyyymmddHHMMSS", Locale.getDefault())));
setOrderDateTime(TimeUtils.getNowString(new SimpleDateFormat("yyyyMMddHHmmss", Locale.getDefault())));
setCurrencyType("156");
setOrderName("测试");
setKey("Key");
......@@ -201,7 +199,7 @@ public class Pay {
}
}
public class Response {
public static class Response {
private int OrderType;
private String ResponseCode;
private String ResponseMsg;
......
......@@ -80,7 +80,9 @@ public class GroupCateView extends BaseGroupView<ViewGroupCateBinding> {
@Override
public void initView() {
super.initView();
if (mMs != null) cateId = mMs.getSpuCateId();
if (mMs != null && mMs.getSpuCateId() != null) {
cateId = mMs.getSpuCateId();
}
loadCla();
mViewBinding.nsType1.setOnItemSelectedListener(mOnItemSelectedListener);
......
......@@ -17,8 +17,9 @@ import com.xingdata.zzdpos.model.Vip;
import com.xingdata.zzdpos.ui.dialog.LoadingDialog;
import com.xingdata.zzdpos.ui.main.MainActivity;
import com.xingdata.zzdpos.ui.scan.ScanFragment;
import com.xingdata.zzdpos.ui.settle.fragment.CashPayFragment;
import com.xingdata.zzdpos.ui.settle.dialog.PasswordDialog;
import com.xingdata.zzdpos.ui.settle.dialog.PayingDialog;
import com.xingdata.zzdpos.ui.settle.fragment.CashPayFragment;
import com.xingdata.zzdpos.ui.settle.fragment.PayResultFragment;
import com.xingdata.zzdpos.ui.settle.fragment.SettleFragment;
import com.xingdata.zzdpos.ui.settle.fragment.TicketFragment;
......@@ -39,6 +40,9 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
private PayResultFragment mPayResultFragment = new PayResultFragment();
private LoadingDialog mLoadingDialog = new LoadingDialog();
private PayingDialog mPayingDialog = new PayingDialog();
private ScanFragment mScanFragment = new ScanFragment();
@Override
public int getLayoutId() {
......@@ -132,10 +136,15 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
case C.PAY_CHANNEL.CARD:
mPasswordDialog.setSaleorder(saleorder).show(this);
break;
case C.PAY_CHANNEL.BANK:
case C.PAY_CHANNEL.ALI:
showMsg("暂时无法使用");
break;
case C.PAY_CHANNEL.WECHAT:
ScanFragment mScanFragment = new ScanFragment();
mScanFragment.setOnScanCompletedListener(barcode -> mPresenter.payInAli(barcode));
mScanFragment.setOnScanCompletedListener(barcode -> {
this.pop();
mPresenter.payInWechat(barcode);
});
this.start(mScanFragment);
break;
}
......@@ -143,7 +152,6 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
@Override
public void changeLockState(boolean isLock) {
}
@Override
......@@ -161,6 +169,7 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
this.start(mPayResultFragment.setResult(true).setSaleorder(saleorder));
this.showTitleBarByTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.tvTitle.setText(R.string.settle_pay_result_title);
mPayingDialog.dismiss();
}
@Override
......@@ -168,8 +177,15 @@ public class SettleActivity extends BaseActivity<SettlePresenter, ActivitySettle
this.start(mPayResultFragment.setResult(false).setSaleorder(saleorder));
this.showTitleBarByTitleMode(C.TITLE_MODE.TEXT);
mViewBinding.tvTitle.setText(R.string.settle_pay_result_title);
mPayingDialog.dismiss();
}
@Override
public void showPayingDialog(int payType, com.xingdata.zzdpos.api.Pay.Response response) {
mPayingDialog.setType(payType).setResponse(response).show(this);
}
@Override
public void backToSettleFragment() {
this.popTo(mSettleFragment.getClass(), false);
......
......@@ -126,6 +126,11 @@ interface SettleContract {
*/
void showPayFailFragment(Throwable throwable, Saleorder saleorder);
/**
* 显示支付中页面
*/
void showPayingDialog(int payType, com.xingdata.zzdpos.api.Pay.Response response);
/**
* 返回结算主页面
*/
......@@ -248,7 +253,12 @@ interface SettleContract {
/**
* 赊账结算页面 - 赊账
*/
public abstract void payInTally();
public abstract void payInTally(String password);
/**
* 支付中页面 - 查看支付状态
*/
public abstract void checkPayState();
/**
* 支付结果页面 - 完成订单
......@@ -260,7 +270,6 @@ interface SettleContract {
*/
public abstract void clickRetry();
/**
* 退出会员查询页面
*/
......
......@@ -7,7 +7,6 @@ import com.xingdata.api.print.ZX_PrintPOS;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.api.ApiFactory;
import com.xingdata.zzdpos.api.JniFactory;
import com.xingdata.zzdpos.api.Pay;
import com.xingdata.zzdpos.db.DBFactory;
import com.xingdata.zzdpos.model.HandoverInfo;
import com.xingdata.zzdpos.model.Ms;
......@@ -17,7 +16,6 @@ import com.xingdata.zzdpos.model.Ticket;
import com.xingdata.zzdpos.model.Vip;
import com.xingdata.zzdpos.ui.main.MainActivity;
import com.xingdata.zzdpos.ui.main.MainPresenter;
import com.xingdata.zzdpos.util.ConvertUtil;
import java.util.ArrayList;
import java.util.List;
......@@ -221,35 +219,63 @@ public class SettlePresenter extends SettleContract.Presenter {
@Override
public void payInCash(Long inputAmt, Long changeAmt) {
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.CASH))));
mView.showLoadingDialog();
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.CASH)).doFinally(() -> mView.dismissLoadingDialog())));
}
@Override
public void payInAli(String payCode) {
Pay.Request q = new Pay.Request(C.PAY_CHANNEL.ALI);
q.setOrderAmt(ConvertUtil.longToString(mSaleorder.getOrderPayAmt()));
q.setChannelAuthCode(payCode);
subscribePay(commitOrder()
.flatMap(s -> {
q.setOrderNo(s);
q.setOldOrderNo(s);
return JniFactory.Settle.pay(JSON.toJSONString(q));
}).flatMap(response -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(q.getOrderNo(), C.PAY_CHANNEL.ALI))));
mView.showLoadingDialog();
commitOrder()
.flatMap(orderNo -> {
return JniFactory.Settle.pay(C.PAY_CHANNEL.ALI, payCode, mSaleorder.getOrderPayAmt(), orderNo);
})
.doFinally(() -> mView.dismissLoadingDialog())
.subscribe(response -> {
com.xingdata.zzdpos.api.Pay.Response r1 = JSON.parseObject(response.replace("\\", ""), com.xingdata.zzdpos.api.Pay.Response.class);
switch (r1.getResponseCode()) {
case "0000":
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.ALI)).doFinally(() -> mView.dismissLoadingDialog())));
break;
case "0098":
mView.showPayingDialog(C.PAY_CHANNEL.ALI, r1);
break;
default:
mView.showPayFailFragment(null, mSaleorder);
break;
}
}, throwable -> {
mView.showPayFailFragment(throwable, mSaleorder);
});
// .flatMap(response -> {
// return ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(response.getOrderNo(), C.PAY_CHANNEL.ALI));
// });
}
@Override
public void payInWechat(String payCode) {
Pay.Request q = new Pay.Request(C.PAY_CHANNEL.WECHAT);
q.setOrderAmt(ConvertUtil.longToString(mSaleorder.getOrderPayAmt()));
q.setChannelAuthCode(payCode);
subscribePay(commitOrder()
.flatMap(s -> {
q.setOrderNo(s);
q.setOldOrderNo(s);
return JniFactory.Settle.pay(JSON.toJSONString(q));
mView.showLoadingDialog();
commitOrder()
.flatMap(orderNo -> {
return JniFactory.Settle.pay(C.PAY_CHANNEL.WECHAT, payCode, mSaleorder.getOrderPayAmt(), orderNo);
})
.flatMap(response -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(q.getOrderNo(), C.PAY_CHANNEL.WECHAT))));
.doFinally(() -> mView.dismissLoadingDialog())
.subscribe(response -> {
com.xingdata.zzdpos.api.Pay.Response r1 = JSON.parseObject(response.replace("\\", ""), com.xingdata.zzdpos.api.Pay.Response.class);
switch (r1.getResponseCode()) {
case "0000":
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.WECHAT)).doFinally(() -> mView.dismissLoadingDialog())));
break;
case "0098":
mView.showPayingDialog(C.PAY_CHANNEL.WECHAT, r1);
break;
default:
mView.showPayFailFragment(null, mSaleorder);
break;
}
}, throwable -> {
mView.showPayFailFragment(throwable, mSaleorder);
});
}
@Override
......@@ -261,14 +287,47 @@ public class SettlePresenter extends SettleContract.Presenter {
ApiFactory.Recard.checkPwd(mVip.getVipId(), String.valueOf(cardNo), password).subscribe(
b -> {
mView.dismissPasswordDialog();
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.CARD, String.valueOf(cardNo)))));
mView.showLoadingDialog();
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.CARD, String.valueOf(cardNo))).doFinally(() -> mView.dismissLoadingDialog())));
},
throwable -> mView.showMsg("密码错误")
);
}
@Override
public void payInTally(String password) {
ApiFactory.Recard.checkPwd(mVip.getVipId(), String.valueOf(0L), password).subscribe(
b -> {
mView.dismissPasswordDialog();
mView.showLoadingDialog();
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.TALLY)).doFinally(() -> mView.dismissLoadingDialog())));
},
throwable -> mView.showMsg("密码错误")
);
}
@Override
public void payInTally() {
public void checkPayState() {
mView.showLoadingDialog();
JniFactory.Settle.query()
.doFinally(() -> mView.dismissLoadingDialog())
.subscribe(s -> {
com.xingdata.zzdpos.api.Pay.Response r1 = JSON.parseObject(s.replace("\\", ""), com.xingdata.zzdpos.api.Pay.Response.class);
switch (r1.getResponseCode()) {
case "0000":
subscribePay(commitOrder().flatMap(orderNo -> ApiFactory.Saleorder.addOrderPayMis(mSaleorder.pay(orderNo, C.PAY_CHANNEL.ALI)).doFinally(() -> mView.dismissLoadingDialog())));
break;
case "0098":
mView.showMsg("交易处理中");
break;
default:
mView.showPayFailFragment(null, mSaleorder);
break;
}
},
throwable -> {
mView.showPayFailFragment(throwable, mSaleorder);
});
}
@Override
......
......@@ -129,7 +129,15 @@ public class PasswordDialog extends BaseSheetDialog<SettlePresenter, DialogPassw
}
if (strPassword.length() < 6) return;
mPresenter.payInCard(0L, strPassword.toString());
switch (mPayType) {
case C.PAY_CHANNEL.CARD:
mPresenter.payInCard(0L, strPassword.toString());
break;
case C.PAY_CHANNEL.TALLY:
mPresenter.payInTally(strPassword.toString());
break;
}
}
/**
......
package com.xingdata.zzdpos.ui.settle.dialog;
import android.content.DialogInterface;
import com.xingdata.zzdpos.C;
import com.xingdata.zzdpos.R;
import com.xingdata.zzdpos.api.Pay;
import com.xingdata.zzdpos.base.BaseDialog;
import com.xingdata.zzdpos.databinding.DialogSettlePayingBinding;
import com.xingdata.zzdpos.ui.settle.SettlePresenter;
public class PayingDialog extends BaseDialog<SettlePresenter, DialogSettlePayingBinding> {
private int mType;
private Pay.Response mResponse;
@Override
protected boolean isEasy() {
return true;
}
@Override
public int getLayoutId() {
return R.layout.dialog_settle_paying;
}
@Override
public void initView() {
mViewBinding.tvCheck.setOnClickListener(view -> mPresenter.checkPayState());
switch (mType) {
case C.PAY_CHANNEL.ALI:
mViewBinding.ivLogo.setImageResource(R.mipmap.pay_alipay);
break;
case C.PAY_CHANNEL.WECHAT:
mViewBinding.ivLogo.setImageResource(R.mipmap.pay_wechat);
break;
}
}
@Override
public void onDismiss(DialogInterface dialog) {
super.onDismiss(dialog);
}
public PayingDialog setType(int type) {
this.mType = type;
return this;
}
public PayingDialog setResponse(Pay.Response response) {
this.mResponse = response;
return this;
}
}
......@@ -94,6 +94,7 @@ public class SettleFragment extends BaseFragment<SettlePresenter, FragmentSettle
case C.SETTLE_MODE.PAYMENT:
mViewBinding.llStore.setVisibility(View.GONE);
mPresenter.initPaymentInfo();
BottomSheetBehavior.from(mViewBinding.llSheet).setState(BottomSheetBehavior.STATE_EXPANDED);
break;
case C.SETTLE_MODE.STORE:
mViewBinding.llStore.setVisibility(View.VISIBLE);
......
......@@ -28,8 +28,8 @@ public final class SystemUtil {
* @return 设备型号
*/
public static String getDeviceModel() {
return DeviceUtils.getModel();
// return "AECRC10";
// return DeviceUtils.getModel();
return "AECRC10";
}
......@@ -57,8 +57,8 @@ public final class SystemUtil {
e.printStackTrace();
}
}
return deviceSN;
// return "548496";
// return deviceSN;
return "548496";
}
/**
......
......@@ -6,17 +6,19 @@
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="@color/lyt_main_bg"
android:background="@color/gray_zhouyu"
android:orientation="vertical">
<TextView
android:id="@+id/tv_title"
style="@style/dialog_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginBottom="@dimen/all_padding" />
android:layout_height="wrap_content" />
<View
android:layout_width="match_parent"
android:layout_height="@dimen/all_line_width"
android:background="@color/gray_kongming" />
<ViewStub
android:id="@+id/vs_center"
......
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@color/white_caocao"
android:gravity="center_vertical"
android:orientation="horizontal"
android:paddingBottom="@dimen/all_margin_big"
android:paddingTop="@dimen/all_margin_big">
<ImageView
android:id="@+id/iv_logo"
android:layout_width="36dp"
android:layout_height="36dp"
android:layout_marginStart="@dimen/all_margin"
android:src="@mipmap/pay_alipay" />
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="@dimen/all_margin_big_big"
android:layout_marginStart="@dimen/all_margin"
android:text="支付中…"
android:textColor="@color/black_baozheng"
android:textSize="@dimen/all_sub_title_size"
android:textStyle="bold" />
<TextView
android:id="@+id/tv_check"
android:layout_width="@dimen/button2_width"
android:layout_height="@dimen/button2_height"
android:layout_marginEnd="@dimen/all_margin"
android:background="@drawable/shape_red_round_rectangle_more_round"
android:foreground="?android:attr/actionBarItemBackground"
android:gravity="center"
android:text="支付状态"
android:textColor="@color/white_caocao"
android:textSize="@dimen/all_text_size" />
</LinearLayout>
</layout>
\ No newline at end of file
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