瀏覽代碼

GKash支付

ccc 3 月之前
父節點
當前提交
9da9cc507a
共有 25 個文件被更改,包括 1874 次插入1 次删除
  1. 12 0
      BaseLibrary/src/main/java/com/hboxs/base_library/constant/Global.java
  2. 4 0
      BaseLibrary/src/main/java/com/hboxs/base_library/constant/Name.java
  3. 13 0
      BaseLibrary/src/main/java/com/hboxs/base_library/http/request/Http.java
  4. 44 0
      BaseLibrary/src/main/java/com/hboxs/base_library/util/RSASignUtil.java
  5. 二進制
      BaseLibrary/src/main/res/drawable-mdpi/icon_gkash.png
  6. 1 0
      app/src/main/AndroidManifest.xml
  7. 1 0
      app/src/main/java/com/bgy/autosale/Constant.java
  8. 77 0
      app/src/main/java/com/bgy/autosale/RemoteSupportService.java
  9. 3 0
      app/src/main/java/com/bgy/autosale/payutil/MQService.java
  10. 15 0
      app/src/main/java/com/bgy/autosale/payutil/PaymentMessage.java
  11. 500 0
      app/src/main/java/com/bgy/autosale/payutil/dialog/GkashPayDialog.java
  12. 307 0
      app/src/main/java/com/bgy/autosale/payutil/dialog/HttpCreditCardDialog.java
  13. 16 0
      app/src/main/java/com/bgy/autosale/payutil/dialog/ShoppingTrolleyDialogChoosePay.java
  14. 59 0
      app/src/main/java/com/bgy/autosale/payutil/gkash/GkashApi.java
  15. 36 0
      app/src/main/java/com/bgy/autosale/payutil/gkash/GkashCardBean.java
  16. 124 0
      app/src/main/java/com/bgy/autosale/payutil/gkash/LordGkashBean.java
  17. 126 0
      app/src/main/java/com/bgy/autosale/payutil/gkash/OrderGkashInquiryBean.java
  18. 255 0
      app/src/main/java/com/bgy/autosale/ui/consumer/IceCreamFragment.java
  19. 78 0
      app/src/main/java/com/bgy/autosale/ui/operator/OtherParamActivity.java
  20. 14 0
      app/src/main/java/com/bgy/autosale/ui/operator/fragments/OtherSettingFragment.java
  21. 1 0
      app/src/main/java/com/bgy/autosale/ui/operator/fragments/SwitchFragment.java
  22. 162 0
      app/src/main/res/layout/activity_system_other_param.xml
  23. 23 0
      app/src/main/res/layout/dialog_shopping_trolley_choose_pay.xml
  24. 2 0
      app/src/main/res/values/strings.xml
  25. 1 1
      config.gradle

+ 12 - 0
BaseLibrary/src/main/java/com/hboxs/base_library/constant/Global.java

@@ -244,5 +244,17 @@ public abstract class Global {
     public static int MDBCreditCardSuccessNumber=0;
 
     public static int UpDateNamePriceSuccess=0;
+
+//        public static String GkashCID = "M161-U-41308" ;//二维码测试账户
+//    public static String GkashsignatureKey = "VPLRE9FOTOCEHHB" ;//二维码测试账户
+//    public static String GkashterminalID = "M161-TD-51368" ;//二维码测试账户
+//    public static String Gkashpaymentid = "95";//二维码测试账户
+//    public static String GkashCID = "M161-U-40819";//刷卡测试账户
+//    public static String GkashsignatureKey = "Z7wQfm9r2SegZcU";//刷卡测试账户
+//    public static String GkashterminalID = "M161-TD-51276";//刷卡测试账户
+    public static String GkashCID = "M102-U-52306" ;//马来西亚 步总账户
+    public static String GkashsignatureKey = "aeudD7Ec2I88OvP" ;//马来西亚 步总账户
+    public static String GkashterminalID = "M102-TD-63202" ;//马来西亚 步总账户
+    public static String Gkashpaymentid = "46119" ;//马来西亚 步总账户
 }
 

+ 4 - 0
BaseLibrary/src/main/java/com/hboxs/base_library/constant/Name.java

@@ -353,5 +353,9 @@ public interface Name {
     String VOICE_MEAL_PICKUP_PROMPTS = "VOICE_MEAL_PICKUP_PROMPTS";//语音取餐提示
     String CASH_PAY = "CASH_PAY";//现金支付的显示状态
 
+    String GkashCID="GkashCID";
+    String GkashsignatureKey="GkashsignatureKey";
+    String GkashterminalID="GkashterminalID";
+
 }
 

+ 13 - 0
BaseLibrary/src/main/java/com/hboxs/base_library/http/request/Http.java

@@ -263,6 +263,13 @@ public class Http {
                 .baseUrl("https://api.wlzepoint.com")//测试环境
                 .build();
 
+        gkashPayRetrofit = new Retrofit.Builder()
+                .client(builder.build())
+                .addConverterFactory(ScalarsConverterFactory.create())
+                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
+                .baseUrl("https://api.gkash.my/")
+//                .baseUrl("https://api-staging.pay.asia/")
+                .build();
 //        tonglianRetrofit = new Retrofit.Builder()
 //                .client(builder.build())
 //                .addConverterFactory(ScalarsConverterFactory.create())
@@ -337,6 +344,8 @@ public class Http {
 
     private Retrofit tonglianRetrofit;//通联
 
+    private Retrofit gkashPayRetrofit;//马来西亚
+
 
     public <T> T createJapanApi(Class<T> cls) {
         return japanRetrofit.create(cls);
@@ -416,4 +425,8 @@ public class Http {
     public <T> T createTonglianRetrofitApi(Class<T> cls) {
         return tonglianRetrofit.create(cls);
     }
+
+    public <T> T createGkashPayApi(Class<T> cls) {
+        return gkashPayRetrofit.create(cls);
+    }
 }

+ 44 - 0
BaseLibrary/src/main/java/com/hboxs/base_library/util/RSASignUtil.java

@@ -12,6 +12,7 @@ import android.util.Log;
 import java.io.UnsupportedEncodingException;
 import java.security.InvalidKeyException;
 import java.security.KeyFactory;
+import java.security.MessageDigest;
 import java.security.NoSuchAlgorithmException;
 import java.security.PrivateKey;
 import java.security.PublicKey;
@@ -154,6 +155,49 @@ public class RSASignUtil {
 
     }
 
+    public static String signature(String s1,String s2){
+        String data=s1+";"+s2;
+        StringBuilder hexString = new StringBuilder();
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA-512");
+            byte[] hashBytes = digest.digest(data.getBytes());
+            for (byte b : hashBytes) {
+                String hex = Integer.toHexString(0xff & b);
+                if (hex.length() == 1) {
+                    hexString.append('0');
+                }
+                hexString.append(hex);
+            }
+            Log.d(TAG, "signature: "+hexString.toString().toUpperCase());
+        } catch (NoSuchAlgorithmException e) {
+            throw new RuntimeException(e); // 处理异常
+        }
+        return hexString.toString().toUpperCase();
+    }
+
+    public static String signature(String s1,String s2,String s3,String s4,String s5){
+        String data=s1+";"+s2+";"+s3+";"+s4+";"+s5;
+        Log.d(TAG, "signature1: "+data);
+        StringBuilder hexString = new StringBuilder();
+        try {
+            MessageDigest digest = MessageDigest.getInstance("SHA-512");
+            byte[] hashBytes = digest.digest(data.getBytes("UTF-8"));
+            for (byte b : hashBytes) {
+                String hex = Integer.toHexString(0xff & b);
+                if (hex.length() == 1) {
+                    hexString.append('0');
+                }
+                hexString.append(hex);
+            }
+            Log.d(TAG, "signature2: "+hexString.toString().toUpperCase());
+        } catch (NoSuchAlgorithmException e) {
+            e.printStackTrace();
+        } catch (UnsupportedEncodingException e) {
+            throw new RuntimeException(e);
+        }
+        return hexString.toString().toUpperCase();
+    }
+
     public static void main(String[] args) {
 
         String plain_text= new RSASignUtil().process();

二進制
BaseLibrary/src/main/res/drawable-mdpi/icon_gkash.png


+ 1 - 0
app/src/main/AndroidManifest.xml

@@ -70,6 +70,7 @@
         <activity android:name=".ui.operator.TimeSettingActivity" />
         <activity android:name=".ui.operator.SwitchSettingActivity" />
         <activity android:name=".ui.operator.LanguageActivity" />
+        <activity android:name=".ui.operator.OtherParamActivity" />
 
         <activity
             android:name=".ui.operator.DeviceManagerActivity"

+ 1 - 0
app/src/main/java/com/bgy/autosale/Constant.java

@@ -33,6 +33,7 @@ public class Constant {
     public static final int PAY_NAYAX_PAY_MIX = 7;
     public static final int PAY_POS_DEVICE_PAY_MIX = 8;
     public static final int PAY_ONLINE_AND_PRICE_MODEL = 9;
+    public static final int GKash = 10;
 
     public static String versionName = "V1.0.0";
 

+ 77 - 0
app/src/main/java/com/bgy/autosale/RemoteSupportService.java

@@ -25,6 +25,8 @@ import com.bgy.autosale.payutil.AddAlarmRecordBean;
 import com.bgy.autosale.payutil.HeartbeatBean;
 import com.bgy.autosale.payutil.MQService;
 import com.bgy.autosale.payutil.PaymentMessage;
+import com.bgy.autosale.payutil.gkash.GkashApi;
+import com.bgy.autosale.payutil.gkash.OrderGkashInquiryBean;
 import com.bgy.autosale.ui.MainActivity;
 import com.bgy.autosale.ui.operator.LockActivity;
 import com.bgy.autosale.utils.ShellUtils;
@@ -198,9 +200,84 @@ public class RemoteSupportService extends Service implements SendCallback {
 //                myServicePresenter.zeDianTranxQuery(messageEvent.getData(), 0);
                 Log.d(TAG, "event: start_order_zedian_sweep1");
                 break;
+            case "start_order_inquiry_gkash":
+                QueryGkashpaymentorder(messageEvent.getObjData(), 0);
+                break;
         }
     }
+    @SuppressLint("checkResult")
+    public void QueryGkashpaymentorder(Object sn, int gkashIndex) {
+        HashMap<String, String> map = (HashMap<String, String>) sn;
+        HashMap<String, String> params = new HashMap<>();
+        params.put("version", "1.3.0");
+        params.put("CID", Hawk.get(Name.GkashCID, Global.GkashCID));
+        params.put("cartid",map.get("cartid"));
+        params.put("currency", "MYR");
+        params.put("amount", map.get("price"));
+        params.put("signature", map.get("signature"));
+        Log.d(TAG, "QueryGkashpaymentorder: "+params);
+        GkashApi.api.orderInquiry(params).subscribeOn(Schedulers.io())
+                .repeatWhen(new Function<Observable<Object>, ObservableSource<?>>() {
+                    @Override
+                    public ObservableSource<?> apply(Observable<Object> objectObservable) throws Exception {
+                        return objectObservable.flatMap(new Function<Object, ObservableSource<?>>() {
+                            @Override
+                            public ObservableSource<?> apply(Object o) throws Exception {
+                                Log.d(TAG, "payIsSuc 1111apply: " + BaseConstant.CANCEL_POLL);
+                                if (!BaseConstant.CANCEL_POLL) {//如果为true,不执行,如果为false,执行。
+                                    BaseConstant.CANCEL_POLL = false;
+                                    // 此处选择发送onError事件以结束轮询,因为可触发下游观察者的onError()方法回调
+                                    return Observable.error(new Throwable("轮询结束"));
+                                }
+                                // 若轮询次数<4次,则发送1Next事件以继续轮询
+                                // 注:此处加入了delay操作符,作用 = 延迟一段时间发送(此处设置 = 2s),以实现轮询间间隔设置
+                                return Observable.just(1).delay(5000, TimeUnit.MILLISECONDS);
+                            }
+                        });
+                    }
+                })
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new Consumer<String>() {
+                    @Override
+                    public void accept(String payIsSuccessBean) throws Exception {
+                        Gson gson = new Gson();
+                        OrderGkashInquiryBean americaNihaoPayMerchantBean = gson.fromJson(payIsSuccessBean, OrderGkashInquiryBean.class);
+                        Log.d(TAG, "americaNihaoPayMerchantBean10: "+americaNihaoPayMerchantBean);
+                        if (!"88 - Transferred".equals(americaNihaoPayMerchantBean.getStatus())) {
+                            Log.d(TAG, "payIsSucaccept2: payIsSuccessBean");
+                            return;
+                        }
+                        //支付成功,停止轮询,改变全局变量的状态
+                        if (BaseConstant.CANCEL_POLL) {//为true
+                            Log.d(TAG, "payIsSucaccept3: payIsSuccessBean");
+                            BaseConstant.CANCEL_POLL = false;
+                            getDefault().post(new ApiMessageEvent("pay_success", "1"));
+                        }
+                    }
+                }, new Consumer<Throwable>() {
+                    @Override
+                    public void accept(Throwable throwable) throws Exception {
+                        Log.d(TAG, "payIsSuc Querypaymentorder2: ");
 
+//                        Thread.sleep(5000);
+//                        if (happyValleyIndex < 2) {
+//                            getPayIsSuccess(sn, happyValleyIndex + 1);
+//                        }
+                        Log.d(TAG, "payIsSuc accept: " + throwable.getMessage());
+                        if ("轮询结束".equals(throwable.getMessage())) {
+                            return;
+                        }
+                        if (TextUtils.isEmpty(throwable.getMessage())) {
+                            //如果为空或者没有数值就什么都不做。
+                            return;
+                        }
+                        Thread.sleep(5000);
+                        if (gkashIndex < 2) {
+                            QueryGkashpaymentorder(sn, gkashIndex + 1);
+                        }
+                    }
+                });
+    }
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void event(ApiMessageEvent messageEvent) {

+ 3 - 0
app/src/main/java/com/bgy/autosale/payutil/MQService.java

@@ -385,6 +385,9 @@ public class MQService extends Service implements SendCallback,Callback<Result>
                 } else if (name.equals("J03")) {
                     id=IceCreamDeviceConstants.ORDER_SAUCE_3;
                 }
+                if (param1==0){
+                    param1=3;
+                }
                 Log.d(TAG, "smokeJam: "+id+":"+param1);
                 CommunicationHelper.getInstance().sendControl(id, param1, 0, 0, this);
                 break;

+ 15 - 0
app/src/main/java/com/bgy/autosale/payutil/PaymentMessage.java

@@ -7,11 +7,18 @@ public class PaymentMessage {
 
     private String data;
 
+    private Object objData;
+
     public PaymentMessage(String name, String data){
         this.name=name;
         this.data=data;
     }
 
+    public PaymentMessage(String name, Object objData){
+        this.name=name;
+        this.objData=objData;
+    }
+
     public String getName() {
         return name;
     }
@@ -28,4 +35,12 @@ public class PaymentMessage {
         this.data = data;
     }
 
+    public Object getObjData() {
+        return objData;
+    }
+
+    public void setObjData(Object objData) {
+        this.objData = objData;
+    }
+
 }

+ 500 - 0
app/src/main/java/com/bgy/autosale/payutil/dialog/GkashPayDialog.java

@@ -0,0 +1,500 @@
+package com.bgy.autosale.payutil.dialog;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
+import android.os.Environment;
+import android.os.Handler;
+import android.os.Message;
+import android.text.TextUtils;
+import android.util.Base64;
+import android.util.Log;
+import android.view.View;
+import android.webkit.WebView;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bgy.autosale.R;
+import com.bgy.autosale.payutil.PaymentMessage;
+import com.bgy.autosale.payutil.TimerUtil;
+import com.bgy.autosale.payutil.ZXingUtils;
+import com.bumptech.glide.Glide;
+import com.bumptech.glide.load.engine.DiskCacheStrategy;
+import com.bumptech.glide.request.RequestOptions;
+import com.hboxs.base_library.base.BaseApplication;
+import com.hboxs.base_library.callback.DialogClickListener;
+import com.hboxs.base_library.constant.BaseConstant;
+import com.hboxs.base_library.constant.Name;
+import com.hboxs.base_library.event.ApiMessageEvent;
+import com.hboxs.base_library.util.GlideUtil;
+import com.hboxs.base_library.util.LogUtil;
+import com.hboxs.base_library.util.LogUtils;
+import com.hboxs.base_library.util.SharedPreferencesUtils;
+import com.hboxs.base_library.widget.BaseDialog;
+import com.hboxs.base_library.widget.BaseDialogNoDatabinding;
+import com.orhanobut.logger.Logger;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.io.BufferedOutputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Timer;
+import java.util.TimerTask;
+
+
+/**
+ * @author whw
+ * @time 2019/3/22
+ * @Description 扫码弹窗
+ */
+public class GkashPayDialog extends BaseDialogNoDatabinding implements View.OnClickListener {
+
+    private String TAG = this.getClass().getSimpleName();
+    private ImageView ivScan;
+    private ImageView ivQrCode;
+    private WebView wvQrCode;
+    private TextView tvScanNow;
+    private TextView tvScanTip;
+    private RelativeLayout rlTime;
+    private TextView tvTime;
+    private TextView tvSecond;
+    private TextView tvGuanbi;
+    private Button btnCancel;
+    private int count;
+
+
+    private static int time = 90;
+    private boolean isLoop = true;
+    private Thread thread;
+    private MyHandler mHandler;
+
+    private String data;
+    private int frpCode;
+    private String msn;
+    private String price;
+    private TextView tvLoading;
+    private RelativeLayout rlHkAlipay;
+    private HashMap<String,String> hashMap;
+
+    public void setListener(DialogClickListener listener) {
+        this.listener = listener;
+    }
+
+    private DialogClickListener listener;
+
+    public GkashPayDialog(Context context, Activity activity) {
+        super(context, activity);
+    }
+
+    //設置訂單編號的數據
+    public void setCodeData(String data, String sn,String cartid,String price,String signature) {
+            hashMap=new HashMap<>();
+            hashMap.put("cartid",cartid);
+            hashMap.put("price",price);
+            hashMap.put("signature",signature);
+        Bitmap bitmap = ZXingUtils.createQRImage(data, 600, 600);
+//        this.msn = sn;
+        ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos);
+        byte[] bytes = baos.toByteArray();
+        //禁止缓存
+        RequestOptions options = new RequestOptions()
+                .diskCacheStrategy(DiskCacheStrategy.NONE)
+                .skipMemoryCache(true);
+
+
+        Glide.with(getContext())
+                .load(bytes)
+                .apply(options)
+                .into(ivQrCode);
+    }
+
+
+    @Override
+    protected void initView() {
+
+        mHandler = new MyHandler(this, mActivity);
+        ivScan = findViewById(R.id.iv_scan);
+        ivQrCode = findViewById(R.id.iv_qr_code);
+        wvQrCode = findViewById(R.id.wv_qr_code);
+        tvScanNow = findViewById(R.id.tv_scan_now);
+        tvScanTip = findViewById(R.id.tv_scan_tip);
+        rlTime = findViewById(R.id.rl_time);
+        tvTime = findViewById(R.id.tv_time);
+        tvSecond = findViewById(R.id.tv_second);
+        tvGuanbi = findViewById(R.id.tv_guanbi);
+        btnCancel = findViewById(R.id.btn_cancel);
+        tvLoading = findViewById(R.id.tv_loading);
+        rlHkAlipay = findViewById(R.id.rl_hk_alipay);
+        btnCancel.setOnClickListener(this);
+        ivQrCode.setOnClickListener(this);
+        wvQrCode.setOnClickListener(this);
+        isLoop = true;
+        Logger.d("倒计时initview1:" + isLoop);
+        GlideUtil.get().loadPic(R.drawable.alilpay, ivScan);
+    }
+
+    @Override
+    public void show() {
+        count = 0;
+        LogUtils.logWrite("支付对话框显示了。");
+        super.show();
+        EventBus.getDefault().register(this);
+        time = 90;
+        tvTime.setText(String.valueOf(time));
+//        isLoop = true;
+//        thread = new Thread(new MyThread());
+//        thread.start();
+        startTimeCountDown();
+        listener.onClickListener(130);
+        Logger.d("倒计时show:");
+    }
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+        LogUtils.logWrite("支付取消了");
+        stopTimeDown();
+        EventBus.getDefault().unregister(this);
+        // stopTimeDown();
+        isLoop = false;
+        thread = null;
+        if (listener != null) {
+            listener.onClickListener(125);
+        }
+        Logger.d("倒计时dismiss:");
+        // stopTimeDown();有可能不被执行
+
+    }
+
+    @Override
+    protected int getLayout() {
+        return R.layout.dialog_scan;
+    }
+
+    @Override
+    protected int getAnimType() {
+        return BaseDialog.ANIM_CENTER_IN_OUT;
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_cancel:
+                //二維碼消失的時候開啓定時任務
+//                startGetTime(msn);
+                dismiss();
+                break;
+            case R.id.iv_qr_code:
+                listener.onClickListener(-1);
+                break;
+        }
+    }
+
+//    class MyThread implements Runnable {
+//
+//        @Override
+//        public void run() {
+//            Logger.d("倒计时run1:" + isLoop);
+//            while (isLoop) {
+//                try {
+//                    Thread.sleep(1000);//每隔1s执行一次
+//                    Logger.d("倒计时run2:" + isLoop);
+//                    Message message = new Message();
+//                    message.what = 1;
+//                    mHandler.sendMessage(message);
+//                    time--;
+//                    LogUtil.d(TAG, "thread: 倒计时:" + time);
+//                } catch (InterruptedException e) {
+//                    e.printStackTrace();
+//                }
+//
+//            }
+//        }
+//    }
+
+    /**
+     * 是否为base64数据
+     *
+     * @param imgurl 图片地址
+     * @return
+     */
+    public boolean isBase64Img(String imgurl) {
+        if (!TextUtils.isEmpty(imgurl) &&
+                (imgurl.startsWith("data:image/png;base64,")
+                        || imgurl.startsWith("data:image/*;base64,")
+                        || imgurl.startsWith("data:image/jpg;base64,"))
+        ) {
+
+            return true;
+        }
+        return false;
+
+    }
+
+    /**
+     * base64转换成图片
+     *
+     * @param string
+     * @return
+     */
+    public Bitmap stringToBitmap(String string) {
+        Bitmap bitmap = null;
+        try {
+            byte[] bitmapArray = Base64.decode(string.split(",")[1], Base64.DEFAULT);
+            bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return bitmap;
+    }
+
+
+    private boolean readDataFromAssets(String gifName) {
+        if (!isExternalStorageWritable()) {
+            return false;
+        }
+
+        InputStream inputStream = null;
+        FileOutputStream fos = null;
+        BufferedOutputStream bos = null;
+
+        File dir = BaseApplication.getContext().getExternalFilesDir("gif");
+        Log.e(TAG, "readDataFromAssets: dir = " + dir.getAbsolutePath());
+
+        if (!dir.exists()) {
+            dir.mkdirs();
+        }
+
+        try {
+            inputStream = BaseApplication.getContext().getAssets().open(gifName);
+
+            File file = new File(dir, gifName);
+            if (file.exists()) {
+                file.delete();
+            }
+            file.createNewFile();
+
+            fos = new FileOutputStream(file);
+            bos = new BufferedOutputStream(fos);
+
+            byte[] bytes = new byte[1024];
+            while (inputStream.read(bytes) > 0) {
+                bos.write(bytes, 0, bytes.length);
+            }
+
+//
+//            inputStream.close();
+//            bos.close();
+//            fos.close();
+            Logger.d("文件地址为:" + file.getAbsolutePath());
+            GlideUtil.get().loadPic(file.getAbsolutePath(), ivScan);
+
+        } catch (IOException e) {
+            e.printStackTrace();
+            return false;
+        } finally {
+            try {
+                if (inputStream != null) {
+                    inputStream.close();
+                }
+                if (bos != null) {
+                    bos.close();
+                }
+                if (fos != null) {
+                    fos.close();
+                }
+            } catch (IOException e) {
+                e.printStackTrace();
+            }
+        }
+
+        return true;
+    }
+
+    /* Checks if external storage is available for read and write */
+    public boolean isExternalStorageWritable() {
+        String state = Environment.getExternalStorageState();
+        if (Environment.MEDIA_MOUNTED.equals(state)) {
+            return true;
+        }
+        Log.e(TAG, "isExternalStorageWritable: " + state);
+        return false;
+    }
+
+    /**
+     * 设置二维码类型
+     *
+     * @param frpCode
+     */
+    public void setGifType(int frpCode) {
+        this.frpCode = frpCode;
+        int param = (int) SharedPreferencesUtils.getParam(Name.LANGUAGE_TYPE, 1);
+        if (frpCode == 1) {
+            //微信
+
+            if (param == 1) {
+                //中文
+                readDataFromAssets("wechat.gif");
+            } else {
+                readDataFromAssets("wechat_E.gif");
+            }
+
+        } else if (frpCode == 5) {
+            GlideUtil.get().loadPic(R.drawable.payme, ivScan);
+        } else if (frpCode == 6) {
+            GlideUtil.get().loadPic(R.drawable.yunshanfu, ivScan);
+        } else if (frpCode == 7) {
+            GlideUtil.get().loadPic(R.drawable.zhuanshukuai, ivScan);
+        } else {
+            //支付宝
+            if (param == 1) {
+                readDataFromAssets("alilpay.gif");
+            } else {
+                readDataFromAssets("alilpay_E.gif");
+            }
+
+        }
+
+    }
+
+    public void stopTimerDown() {
+        LogUtil.d(TAG, "stopTimerDown: 停止倒计时");
+//        time=60;
+//        isLoop=false;
+//        thread=null;
+    }
+
+
+    private Timer countDownTimer;
+    private TimerTask timerTask;
+
+    public void startTimeCountDown() {
+        time = 90;
+        stopTimeDown();
+//        isTimeFinishRun = true;
+        LogUtil.d(TAG, " 开始倒计时 ");
+        countDownTimer = new Timer();
+        timerTask = new TimerTask() {
+            @Override
+            public void run() {
+                Logger.d("倒计时run2:" + isLoop);
+                Message message = new Message();
+                message.what = 1;
+                message.obj = msn;
+                LogUtil.d("msn", msn);
+                mHandler.sendMessage(message);
+                time--;
+                LogUtil.d(TAG, "thread: 倒计时:" + time);
+            }
+        };
+        countDownTimer.schedule(timerTask, 0, 1000);
+    }
+
+    @Override
+    public void stopTimeDown() {
+        mHandler.removeCallbacksAndMessages(null);
+        TimerUtil.stopTimerAndTimerTask(countDownTimer, timerTask);
+        time = 90;
+    }
+
+    @Override
+    protected void onStop() {
+        stopTimeDown();
+        super.onStop();
+
+    }
+
+    static class MyHandler extends Handler {
+
+        private final Activity activity1;
+        WeakReference<Dialog> mWeakReference;
+
+        public MyHandler(Dialog activity, Activity activity1) {
+            this.activity1 = activity1;
+            mWeakReference = new WeakReference<Dialog>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            GkashPayDialog dialog = (GkashPayDialog) mWeakReference.get();
+            switch (msg.what) {
+                case 1:
+                    if (dialog != null) {
+                        if (time <= -1) {
+                            //二維碼消失的時候開啓定時任務
+                            dialog.isLoop = false;
+                            try {
+                                LogUtil.d("activity1", "handleMessage: " + activity1);
+                                if (activity1 != null) {
+                                    if (!activity1.isFinishing()) {
+                                        dialog.dismiss();
+//                                        dialog.startOrderInquiry(String.valueOf(msg.obj));
+                                    } else {
+                                        dialog.stopTimerDown();
+                                    }
+                                } else {
+                                    dialog.stopTimerDown();
+                                }
+                                //二維碼消失的時候開啓定時任務
+                                //dialog.startGetTime(String.valueOf(msg.obj));
+                            } catch (IllegalArgumentException e) {
+                                //    dialog = null;
+                            }
+                            return;
+                        } else if (time == 80) {
+                            BaseConstant.CANCEL_POLL = true;
+                        } else if (time <= 75 && time >= 60) {
+                            if (dialog.count <= 0) {
+                                Log.d("time", "payIsSuccessBean count : " + dialog.count);
+                                dialog.count++;
+                                dialog.startOrderInquiry(String.valueOf(msg.obj));
+                            }
+                        }
+                        dialog.tvTime.setText(String.valueOf(time));
+//                    time--;
+                    }
+                    break;
+            }
+        }
+    }
+
+    //在二維碼界面收到支付成功。
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(ApiMessageEvent messageEvent) {
+        switch (messageEvent.getName()) {
+            case "pay_success":
+                //LogUtil.d("支付成功", "第三部:發送支付成功信息");
+                //EventBus.getDefault().post(new ApiMessageEvent("scan_pay_success", null));
+                break;
+        }
+    }
+
+    /**
+     * 查詢訂單是否支付
+     * 1.二維碼自動消失,或者點擊了二維碼取消。那麽執行訂單查詢方法
+     * 2.查詢到如果是pay_success,那麽發送scan_pay_success信息讓機器開始做糖,其他不管。
+     * 3.如果是機器故障,那麽也會在幾分鐘后開始退款。
+     */
+    //定時任務,用於判斷是否需要上次數據
+    @SuppressLint("LongLogTag")
+    public void startOrderInquiry(String sn) {
+        //發送驗證是否付錢了
+        Log.d(TAG, "QueryGkashpaymentorder1: "+hashMap);
+        EventBus.getDefault().post(new PaymentMessage("start_order_inquiry_gkash", hashMap));
+    }
+}

+ 307 - 0
app/src/main/java/com/bgy/autosale/payutil/dialog/HttpCreditCardDialog.java

@@ -0,0 +1,307 @@
+package com.bgy.autosale.payutil.dialog;
+
+import android.annotation.SuppressLint;
+import android.app.Activity;
+import android.app.Dialog;
+import android.content.Context;
+import android.os.Handler;
+import android.os.Message;
+import android.util.Log;
+import android.view.KeyEvent;
+import android.view.View;
+import android.widget.Button;
+import android.widget.ImageView;
+import android.widget.LinearLayout;
+import android.widget.RelativeLayout;
+import android.widget.TextView;
+
+import com.bgy.autosale.R;
+import com.bgy.autosale.payutil.PaymentMessage;
+import com.bgy.autosale.payutil.TimerUtil;
+import com.hboxs.base_library.callback.DialogClickListener;
+import com.hboxs.base_library.constant.BaseConstant;
+import com.hboxs.base_library.constant.Name;
+import com.hboxs.base_library.event.ApiMessageEvent;
+import com.hboxs.base_library.util.LogUtil;
+import com.hboxs.base_library.widget.BaseDialogNoDatabinding;
+import com.orhanobut.hawk.Hawk;
+import com.orhanobut.logger.Logger;
+
+import org.greenrobot.eventbus.EventBus;
+import org.greenrobot.eventbus.Subscribe;
+import org.greenrobot.eventbus.ThreadMode;
+
+import java.lang.ref.WeakReference;
+import java.util.HashMap;
+import java.util.Timer;
+import java.util.TimerTask;
+
+// 信用卡的逻辑
+public class HttpCreditCardDialog extends BaseDialogNoDatabinding implements View.OnClickListener {
+
+    private String TAG = this.getClass().getSimpleName();
+    private ImageView ivQrCode;
+    private TextView tvTime;
+    private boolean isLoop = true;
+    private DialogClickListener listener;
+    private TextView scanNow;
+    private TextView scanTip1;
+    private TextView scanTip2;
+    private RelativeLayout rlTime;
+    private MyHandler mHandler;
+    private static int WMDB_TIME_PAYMENT = Integer.valueOf(Hawk.get(Name.WMDB_TIME_PAYMENT, "65"));
+    private static int time = 90;
+    private Button btnCancel;
+    private LinearLayout llClose;
+    private HashMap<String,String> hashMap;
+    private int count;
+
+
+    public DialogClickListener getListener() {
+        return listener;
+    }
+
+    public HttpCreditCardDialog(Context context, Activity activity) {
+        super(context, activity);
+    }
+
+    public void setParams(String cartid,String price,String signature) {
+        hashMap=new HashMap<>();
+        hashMap.put("cartid",cartid);
+        hashMap.put("price",price);
+        hashMap.put("signature",signature);
+    }
+
+
+    @Override
+    protected void initView() {
+        mHandler = new MyHandler(this, mActivity);
+        tvTime = findViewById(R.id.tv_time);
+        rlTime = findViewById(R.id.rl_time);
+        ivQrCode = findViewById(R.id.iv_qr_code);
+        scanNow = findViewById(R.id.tv_scan_now);
+        scanTip1 = findViewById(R.id.tv_scan_tip1);
+        scanTip2 = findViewById(R.id.tv_scan_tip2);
+        llClose = findViewById(R.id.ll_close);
+        isLoop = true;
+        ivQrCode.setOnClickListener(this);
+        btnCancel = findViewById(R.id.btn_cancel);
+        btnCancel.setOnClickListener(this);
+        llClose.setOnClickListener(this);
+        Log.d(TAG, "setContent1: ");
+        if (!Hawk.get(Name.CANCLE_GONE, true)) {
+            Log.d(TAG, "setContent2: ");
+            btnCancel.setVisibility(View.GONE);
+            llClose.setVisibility(View.VISIBLE);
+        }
+        if (!Hawk.get(Name.RETURN_KEY, true)) {
+            llClose.setVisibility(View.GONE);
+        }
+    }
+
+    @Override
+    protected int getLayout() {
+        Log.d(TAG, "getLinitViewCANCLE_GONE1ayout: ");
+        return R.layout.dialog_mdbcredit_card;
+    }
+
+    @Override
+    protected int getAnimType() {
+        return 0;
+    }
+
+    public void setListener(DialogClickListener listener) {
+        this.listener = listener;
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.iv_qr_code:
+                listener.onClickListener(R.id.iv_qr_code);
+                break;
+            case R.id.btn_cancel:
+            case R.id.ll_close:
+                listener.onClickListener(R.id.btn_cancel);
+                break;
+        }
+    }
+
+    @Override
+    public boolean onKeyDown(int keyCode, KeyEvent event) {
+        if (keyCode == KeyEvent.KEYCODE_BACK) {
+            LogUtil.d(TAG, "onClickListener: finish 5555");
+            listener.onClickListener(R.id.btn_cancel);
+            return true;
+        }
+        return super.onKeyDown(keyCode, event);
+    }
+
+
+    /**
+     * 对话框显示
+     */
+    @Override
+    public void show() {
+        count=0;
+        super.show();
+        time = 90;
+        tvTime.setText(String.valueOf(time));
+        //startTimeDown(time);
+        EventBus.getDefault().register(this);
+        Logger.d("倒计时show:");
+    }
+
+    private Timer countDownTimer;
+    private TimerTask timerTask;
+
+    /**
+     * 开始倒计时
+     */
+    public void startTimeDown() {
+        time = 90;
+        TimerUtil.stopTimerAndTimerTask(countDownTimer, timerTask);
+        LogUtil.d(TAG, "startFinishTimer: 开始倒计时 ");
+        countDownTimer = new Timer();
+        timerTask = new TimerTask() {
+            @Override
+            public void run() {
+                Logger.d("倒计时run2:" + isLoop);
+                Message message = new Message();
+                message.what = 1;
+                mHandler.sendMessage(message);
+                time--;
+                LogUtil.d(TAG, "thread: 倒计时:" + time);
+            }
+        };
+        countDownTimer.schedule(timerTask, 0, 1000);
+
+    }
+//
+//    public void showTime(int time) {
+//        startTimeDown(time);
+//        rlTime.setVisibility(View.VISIBLE);
+//    }
+
+    public void stopTimerDown() {
+        time = COUNT_DOWN;
+        TimerUtil.stopTimerAndTimerTask(countDownTimer, timerTask);
+        mHandler.removeCallbacksAndMessages(null);
+    }
+
+
+    @Override
+    public void dismiss() {
+        super.dismiss();
+        isLoop = false;
+//        listener.onClickListener(125);
+        stopTimerDown();
+        EventBus.getDefault().unregister(this);
+        Logger.d("倒计时dismiss:");
+    }
+
+    public void setContent(String context1, String context2, String context3) {
+        String s = Hawk.get(Name.CREDIT_CARD_PAYMENT_TEXT_DESCRIPTION, "");
+        Log.d(TAG, "setContent: " + s);
+        if ("".equals(s)) {
+            if (Hawk.get(Name.KOREA, false)) {
+                scanTip1.setVisibility(View.GONE);
+                scanNow.setText("카드를 결제해 주세요");
+                scanTip2.setVisibility(View.GONE);
+                Log.d(TAG, "setContent2: ");
+            } else {
+                scanNow.setText(context1);
+                scanTip1.setText(context2);
+                scanTip2.setText(context3);
+                Log.d(TAG, "setContent1: ");
+            }
+        } else {
+            scanNow.setText(s);
+            Log.d(TAG, "setContent3: ");
+        }
+
+        Log.d(TAG, "setContent: ");
+        Log.d(TAG, "setContent: " + Hawk.get(Name.CANCLE_GONE, false));
+
+    }
+
+    @Subscribe(threadMode = ThreadMode.MAIN)
+    public void event(ApiMessageEvent messageEvent) {
+        switch (messageEvent.getName()) {
+            case "pay_success":
+                listener.onClickListener(130);
+                break;
+        }
+    }
+
+    private static final int COUNT_DOWN = WMDB_TIME_PAYMENT;
+
+    static class MyHandler extends Handler {
+
+        private final Activity activity1;
+        WeakReference<Dialog> mWeakReference;
+
+        public MyHandler(Dialog activity, Activity activity1) {
+            this.activity1 = activity1;
+            mWeakReference = new WeakReference<Dialog>(activity);
+        }
+
+        @Override
+        public void handleMessage(Message msg) {
+            super.handleMessage(msg);
+            HttpCreditCardDialog dialog = (HttpCreditCardDialog) mWeakReference.get();
+            switch (msg.what) {
+                case 1:
+                    if (dialog != null) {
+                        if (time <= -1) {
+                            //二維碼消失的時候開啓定時任務
+                            dialog.isLoop = false;
+                            try {
+                                LogUtil.d("activity1", "handleMessage: " + activity1);
+                                if (activity1 != null) {
+                                    if (!activity1.isFinishing()) {
+                                        dialog.listener.onClickListener(125);
+//                                        dialog.dismiss();
+//                                        dialog.startOrderInquiry(String.valueOf(msg.obj));
+                                    } else {
+                                        dialog.stopTimerDown();
+                                    }
+                                } else {
+                                    dialog.stopTimerDown();
+                                }
+                                //二維碼消失的時候開啓定時任務
+                                //dialog.startGetTime(String.valueOf(msg.obj));
+                            } catch (IllegalArgumentException e) {
+                                //    dialog = null;
+                            }
+                            return;
+                        } else if (time == 80) {
+                            BaseConstant.CANCEL_POLL = true;
+                        } else if (time <= 75 && time >= 60) {
+                            if (dialog.count <= 0) {
+                                Log.d("time", "payIsSuccessBean count : " + dialog.count);
+                                dialog.count++;
+                                dialog.startOrderInquiry(String.valueOf(msg.obj));
+                            }
+                        }
+                        dialog.tvTime.setText(String.valueOf(time));
+//                    time--;
+                    }
+                    break;
+            }
+        }
+    }
+
+
+    public void setImageView(int resId) {
+        ivQrCode.setImageResource(resId);
+    }
+
+    //定時任務,用於判斷是否需要上次數據
+    @SuppressLint("LongLogTag")
+    public void startOrderInquiry(String sn) {
+        //發送驗證是否付錢了
+        Log.d(TAG, "QueryGkashpaymentorder1: "+hashMap);
+        EventBus.getDefault().post(new PaymentMessage("start_order_inquiry_gkash", hashMap));
+    }
+}

+ 16 - 0
app/src/main/java/com/bgy/autosale/payutil/dialog/ShoppingTrolleyDialogChoosePay.java

@@ -73,6 +73,11 @@ public class ShoppingTrolleyDialogChoosePay extends FrameLayout implements View.
         } else if (App.app.payChannel == Constant.PAY_ONLINE_AND_PRICE_MODEL) {
             view.findViewById(R.id.iv_qr_code).setOnClickListener(this);
             view.findViewById(R.id.iv_qr_code).setVisibility(VISIBLE);
+        }else if (App.app.payChannel ==  Constant.GKash){
+            view.findViewById(R.id.iv_mlxy_gkash).setOnClickListener(this);
+            view.findViewById(R.id.iv_mlxy_gkash).setVisibility(VISIBLE);
+            view.findViewById(R.id.iv_mlxy_gkash_card).setOnClickListener(this);
+            view.findViewById(R.id.iv_mlxy_gkash_card).setVisibility(VISIBLE);
         }
         if (showCash){
             view.findViewById(R.id.iv_qianbi).setVisibility(VISIBLE);
@@ -166,6 +171,17 @@ public class ShoppingTrolleyDialogChoosePay extends FrameLayout implements View.
                     listener.onClickListener(R.id.btn_discounts_code);
                 }
                 break;
+            case R.id.iv_mlxy_gkash:
+                if (listener != null) {
+                    listener.onClickListener(R.id.iv_mlxy_gkash);
+                }
+                break;
+            case R.id.iv_mlxy_gkash_card:
+                if (listener != null) {
+                    listener.onClickListener(R.id.iv_mlxy_gkash_card);
+                }
+                break;
+
             default:
                 break;
         }

+ 59 - 0
app/src/main/java/com/bgy/autosale/payutil/gkash/GkashApi.java

@@ -0,0 +1,59 @@
+package com.bgy.autosale.payutil.gkash;
+
+import com.hboxs.base_library.http.request.Http;
+
+import java.util.Map;
+
+import io.reactivex.Observable;
+import okhttp3.RequestBody;
+import okhttp3.ResponseBody;
+import retrofit2.http.Body;
+import retrofit2.http.FieldMap;
+import retrofit2.http.FormUrlEncoded;
+import retrofit2.http.Headers;
+import retrofit2.http.POST;
+
+/**
+ * @author whw
+ * @time 2019/4/9
+ * @Description 澳门 客戶主掃接口
+ */
+public interface GkashApi {
+
+    GkashApi api= Http.get().createGkashPayApi(GkashApi.class);
+
+    /**
+     * 主扫
+     * @param params
+     * @return
+     */
+    @FormUrlEncoded
+    @POST("api/payment/submit")
+    Observable<String> lordEsau(@FieldMap Map<String, String> params);
+
+    /**
+     * 刷卡
+     * @return
+     */
+    @POST("apim/merchant/SoftposPay")
+    @Headers({"Content-Type:application/json;charset=UTF-8"})
+    Observable<ResponseBody> swipeCard(@Body RequestBody requestBody);
+    /**
+     * 刷卡取消
+     * @return
+     */
+    @POST("apim/merchant/SoftPOSCancel")
+    @Headers({"Content-Type:application/json;charset=UTF-8"})
+    Observable<ResponseBody> swipeCardCancel(@Body RequestBody requestBody);
+
+    /**
+     * 訂單查詢
+     * @param params
+     * @return
+     */
+    @FormUrlEncoded
+    @POST("api/payment/query")
+    Observable<String> orderInquiry(@FieldMap Map<String, String> params);
+
+
+}

+ 36 - 0
app/src/main/java/com/bgy/autosale/payutil/gkash/GkashCardBean.java

@@ -0,0 +1,36 @@
+package com.bgy.autosale.payutil.gkash;
+
+import java.io.Serializable;
+
+/**
+ * Gkash回来的报文
+ */
+public class GkashCardBean implements Serializable {
+
+    private String message;
+    private String referenceNo;
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public String getReferenceNo() {
+        return referenceNo;
+    }
+
+    public void setReferenceNo(String referenceNo) {
+        this.referenceNo = referenceNo;
+    }
+
+    @Override
+    public String toString() {
+        return "GkashCardBean{" +
+                "message='" + message + '\'' +
+                ", referenceNo='" + referenceNo + '\'' +
+                '}';
+    }
+}

+ 124 - 0
app/src/main/java/com/bgy/autosale/payutil/gkash/LordGkashBean.java

@@ -0,0 +1,124 @@
+package com.bgy.autosale.payutil.gkash;
+
+import java.io.Serializable;
+
+public class LordGkashBean  implements Serializable {
+    //状态码
+    private String status;
+    //二维码链接
+    private String description;
+    //终端号
+    private String CID;
+    //
+    private String POID;
+    //订单号
+    private String cartid;
+    //金额
+    private String amount;
+    //货币
+    private String currency;
+    //支付方式
+    private String PaymentType;
+    //
+    private String epkey;
+    //签名
+    private String signature;
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getCID() {
+        return CID;
+    }
+
+    public void setCID(String CID) {
+        this.CID = CID;
+    }
+
+    public String getPOID() {
+        return POID;
+    }
+
+    public void setPOID(String POID) {
+        this.POID = POID;
+    }
+
+    public String getCartid() {
+        return cartid;
+    }
+
+    public void setCartid(String cartid) {
+        this.cartid = cartid;
+    }
+
+    public String getAmount() {
+        return amount;
+    }
+
+    public void setAmount(String amount) {
+        this.amount = amount;
+    }
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public String getPaymentType() {
+        return PaymentType;
+    }
+
+    public void setPaymentType(String paymentType) {
+        PaymentType = paymentType;
+    }
+
+    public String getEpkey() {
+        return epkey;
+    }
+
+    public void setEpkey(String epkey) {
+        this.epkey = epkey;
+    }
+
+    public String getSignature() {
+        return signature;
+    }
+
+    public void setSignature(String signature) {
+        this.signature = signature;
+    }
+
+    @Override
+    public String toString() {
+        return "LordGkashBean{" +
+                "status='" + status + '\'' +
+                ", description='" + description + '\'' +
+                ", CID='" + CID + '\'' +
+                ", POID='" + POID + '\'' +
+                ", cartid='" + cartid + '\'' +
+                ", amount='" + amount + '\'' +
+                ", currency='" + currency + '\'' +
+                ", PaymentType='" + PaymentType + '\'' +
+                ", epkey='" + epkey + '\'' +
+                ", signature='" + signature + '\'' +
+                '}';
+    }
+
+
+}

+ 126 - 0
app/src/main/java/com/bgy/autosale/payutil/gkash/OrderGkashInquiryBean.java

@@ -0,0 +1,126 @@
+package com.bgy.autosale.payutil.gkash;
+
+import java.io.Serializable;
+
+public class OrderGkashInquiryBean implements Serializable {
+    private String CID;
+    private String POID;
+    private String cartid;
+    //支付方式
+    private String PaymentType;
+    //货币单位
+    private String currency;
+    //价格
+    private String amount;
+    //订单状态
+    private String status;
+    private String description;
+    private String refundstatus;
+    private String refundamount;
+    private String refunddate;
+
+    public String getCID() {
+        return CID;
+    }
+
+    public void setCID(String CID) {
+        this.CID = CID;
+    }
+
+    public String getPOID() {
+        return POID;
+    }
+
+    public void setPOID(String POID) {
+        this.POID = POID;
+    }
+
+    public String getCartid() {
+        return cartid;
+    }
+
+    public void setCartid(String cartid) {
+        this.cartid = cartid;
+    }
+
+    public String getPaymentType() {
+        return PaymentType;
+    }
+
+    public void setPaymentType(String paymentType) {
+        PaymentType = paymentType;
+    }
+
+    public String getCurrency() {
+        return currency;
+    }
+
+    public void setCurrency(String currency) {
+        this.currency = currency;
+    }
+
+    public String getAmount() {
+        return amount;
+    }
+
+    public void setAmount(String amount) {
+        this.amount = amount;
+    }
+
+    public String getStatus() {
+        return status;
+    }
+
+    public void setStatus(String status) {
+        this.status = status;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+
+    public void setDescription(String description) {
+        this.description = description;
+    }
+
+    public String getRefundstatus() {
+        return refundstatus;
+    }
+
+    public void setRefundstatus(String refundstatus) {
+        this.refundstatus = refundstatus;
+    }
+
+    public String getRefundamount() {
+        return refundamount;
+    }
+
+    public void setRefundamount(String refundamount) {
+        this.refundamount = refundamount;
+    }
+
+    public String getRefunddate() {
+        return refunddate;
+    }
+
+    public void setRefunddate(String refunddate) {
+        this.refunddate = refunddate;
+    }
+
+    @Override
+    public String toString() {
+        return "OrderGkashInquiryBean{" +
+                "CID='" + CID + '\'' +
+                ", POID='" + POID + '\'' +
+                ", cartid='" + cartid + '\'' +
+                ", PaymentType='" + PaymentType + '\'' +
+                ", currency='" + currency + '\'' +
+                ", amount='" + amount + '\'' +
+                ", status='" + status + '\'' +
+                ", description='" + description + '\'' +
+                ", refundstatus='" + refundstatus + '\'' +
+                ", refundamount='" + refundamount + '\'' +
+                ", refunddate='" + refunddate + '\'' +
+                '}';
+    }
+}

+ 255 - 0
app/src/main/java/com/bgy/autosale/ui/consumer/IceCreamFragment.java

@@ -68,7 +68,12 @@ import com.bgy.autosale.payutil.PayMixDialog;
 import com.bgy.autosale.payutil.PaySuccessConstant;
 import com.bgy.autosale.payutil.ScanDialog;
 import com.bgy.autosale.payutil.ShoppingCartBean;
+import com.bgy.autosale.payutil.dialog.GkashPayDialog;
+import com.bgy.autosale.payutil.dialog.HttpCreditCardDialog;
 import com.bgy.autosale.payutil.dialog.ShoppingTrolleyDialogChoosePay;
+import com.bgy.autosale.payutil.gkash.GkashApi;
+import com.bgy.autosale.payutil.gkash.GkashCardBean;
+import com.bgy.autosale.payutil.gkash.LordGkashBean;
 import com.bgy.autosale.ui.MainActivity;
 import com.bgy.autosale.ui.adapters.ShopCartAdapter;
 import com.bgy.autosale.ui.base.BaseAutoExitFragment;
@@ -110,8 +115,10 @@ import com.hboxs.base_library.http.exception.BaseException;
 import com.hboxs.base_library.http.exception.ExceptionFactory;
 import com.hboxs.base_library.http.observer.HttpResultNotActivityObserver;
 import com.hboxs.base_library.http.observer.HttpResultObserver;
+import com.hboxs.base_library.http.response.HttpJapanResultHandler;
 import com.hboxs.base_library.http.response.HttpResult;
 import com.hboxs.base_library.http.response.HttpResultHandler;
+import com.hboxs.base_library.http.response.HttpStringResultHandler;
 import com.hboxs.base_library.util.DialogUtil;
 import com.hboxs.base_library.util.DrawableSelectorUtils;
 import com.hboxs.base_library.util.FileUtil;
@@ -119,6 +126,7 @@ import com.hboxs.base_library.util.LanguageUtil;
 import com.hboxs.base_library.util.LogUtil;
 import com.hboxs.base_library.util.LogUtils;
 import com.hboxs.base_library.util.PreventSpeedClickUtil;
+import com.hboxs.base_library.util.RSASignUtil;
 import com.hboxs.base_library.util.ReturnTomainScreenUtil;
 import com.hboxs.base_library.util.SharedPreferencesUtils;
 import com.hboxs.base_library.util.UiUtil;
@@ -131,6 +139,7 @@ import org.greenrobot.eventbus.EventBus;
 import org.greenrobot.eventbus.Subscribe;
 import org.greenrobot.eventbus.ThreadMode;
 
+import java.io.IOException;
 import java.math.BigDecimal;
 import java.math.RoundingMode;
 import java.text.DecimalFormat;
@@ -159,6 +168,7 @@ import io.reactivex.observers.DisposableObserver;
 import io.reactivex.schedulers.Schedulers;
 import okhttp3.MediaType;
 import okhttp3.RequestBody;
+import okhttp3.ResponseBody;
 import top.keepempty.sph.library.SerialPortHelper;
 import top.keepempty.sph.library.SphCmdEntity;
 import top.keepempty.sph.library.SphResultCallback;
@@ -734,6 +744,9 @@ public class IceCreamFragment extends BaseAutoExitFragment implements View.OnCli
         } else if (App.app.payChannel == Constant.PAY_POS_DEVICE_PAY_MIX || manualReason != null) {
             dismissLoading();
             showDialogChoosePay();
+        } else if (App.app.payChannel == Constant.GKash || manualReason != null) {
+            dismissLoading();
+            showDialogChoosePay();
         }
     }
 
@@ -781,6 +794,14 @@ public class IceCreamFragment extends BaseAutoExitFragment implements View.OnCli
                     case R.id.btn_discounts_code:
                         handlePaymentSelection(0, R.id.btn_discounts_code, null);
                         break;
+                    case R.id.iv_mlxy_gkash:
+                        showLoading();
+                        handlePaymentSelection(5, R.id.iv_mlxy_gkash, ()->getGkashQrcode(String.valueOf(pri), currentDish.name));
+                        break;
+                    case R.id.iv_mlxy_gkash_card:
+                        showLoading();
+                        handlePaymentSelection(4, R.id.iv_mlxy_gkash_card, ()->getGkashCard(String.valueOf(pri), currentDish.name));
+                        break;
                 }
             }
         });
@@ -1546,6 +1567,15 @@ public class IceCreamFragment extends BaseAutoExitFragment implements View.OnCli
                     scanDialog.dismiss();
                     scanDialog.stopTimeDown();
                 }
+                if (gkashPayDialog != null) {
+                    gkashPayDialog.dismiss();
+                    gkashPayDialog.stopTimeDown();
+                }
+                if (httpCreditCardDialog != null) {
+                    httpCreditCardDialog.dismiss();
+                    httpCreditCardDialog.stopTimeDown();
+                }
+
                 if (ispaySuccess) {
                     ispaySuccess = false;
                     showDialogPaySuccess(R.string.pay_success, R.drawable.icon_zhifu_pay);
@@ -2738,4 +2768,229 @@ public class IceCreamFragment extends BaseAutoExitFragment implements View.OnCli
                 }
         );
     }
+
+    private String gkashCid=Hawk.get(Name.GkashCID, Global.GkashCID);
+    private String gkashKey=Hawk.get(Name.GkashsignatureKey, Global.GkashsignatureKey);
+    private String gkashTid=Hawk.get(Name.GkashterminalID, Global.GkashterminalID);
+    //马来西亚Gkash主扫
+    public void getGkashQrcode(String price, String productName) {
+        StringBuilder productdesc= new StringBuilder();
+        for (int i = 0; i < orderHelper.getOrderList().size(); i++) {
+            Log.d(TAG, "onClick: 冰淇淋组合:" + orderHelper.getOrderList().get(i).selectTag);
+            Log.d(TAG, "单个商品需要制作的杯数:" + orderHelper.getOrderList().get(i).buyCount);
+            productdesc.append(orderHelper.getOrderList().get(i).selectTag).append("*").append(orderHelper.getOrderList().get(i).buyCount).append(";");
+        }
+        Log.d(TAG, "getGkashQrcode: "+productdesc);
+        Map<String, String> params1 = new HashMap<>();
+        params1.put("version", "1.5.5");
+        params1.put("v_amount", price);
+        params1.put("CID", gkashCid);
+        params1.put("v_currency", "MYR");
+        String payGkashOrderNo = UUID.randomUUID().toString().replace("-", "").toUpperCase();
+        params1.put("v_cartid", payGkashOrderNo);
+        double priceValue = Double.parseDouble(price);
+        String price1Value = String.format("%03d", (int) (priceValue * 100));
+        String signatureKey = gkashKey.toUpperCase();
+        String signature = RSASignUtil.signature(signatureKey, gkashCid, payGkashOrderNo, price1Value, "MYR");
+        params1.put("signature", signature);
+        params1.put("v_productdesc", String.valueOf(productdesc));
+        params1.put("paymentid", Global.Gkashpaymentid);
+        params1.put("terminalID", gkashTid);
+        Log.d(TAG, "getGkashQrcode:price1Value: " + price + ":" + price1Value);
+        Log.d(TAG, "getGkashQrcode: " + params1);
+        addSubscription(GkashApi.api.lordEsau(params1).compose(HttpStringResultHandler.<String>transformer()),
+                new HttpResultObserver<String>(mView, BaseApplication.getContext()) {
+                    @Override
+                    public void onNext(String data) {
+                        Log.d(TAG, "getGkashQrcode onNext: " + data);
+                        Gson gson = new Gson();
+                        LordGkashBean lordGkashBean = gson.fromJson(data, LordGkashBean.class);
+                        Log.d(TAG, "getGkashQrcode onNext:lordGkashBean " + lordGkashBean);
+                        PaySuccessConstant.sn = lordGkashBean.getCartid();
+                        if ("11 - Pending".equals(lordGkashBean.getStatus())) {
+                            getGkashCodeSuccess(lordGkashBean.getDescription().replace("DecodedQRText:", ""), lordGkashBean.getCartid(), payGkashOrderNo, price, signature);
+                            //存儲訂單編號。
+                            Global.mapOrderReference.put(lordGkashBean.getCartid(), lordGkashBean.getCartid());
+                        } else {
+                            nihaoPayFail(lordGkashBean.getDescription());
+                        }
+                    }
+
+                    @Override
+                    public void onError(Throwable t) {
+                        super.onError(t);
+                        t.printStackTrace();
+                        Log.d(TAG, "getGkashQrcode onError: " + t.getMessage());
+                        nihaoPayFail(t.getMessage());
+                    }
+                });
+    }
+
+    //马来西亚Gkash刷卡
+    public void getGkashCard(String price, String productName) {
+        Map<String, Object> params1 = new HashMap<>();
+        params1.put("Amount", price);
+        params1.put("Currency", "MYR");
+        String payGkashOrderNo = UUID.randomUUID().toString().replace("-", "").toUpperCase();
+        params1.put("ReferenceNo", payGkashOrderNo);
+        params1.put("TerminalId", gkashTid);
+        double priceValue = Double.parseDouble(price);
+        String price1Value = String.format("%03d", (int) (priceValue * 100));
+        String signature = RSASignUtil.signature(gkashKey, price1Value, "MYR", payGkashOrderNo, gkashTid);
+        String signature1 = RSASignUtil.signature(gkashKey.toUpperCase(),gkashCid, payGkashOrderNo, price1Value, "MYR");
+        params1.put("signature", signature);
+        params1.put("PaymentType", 1);
+        Log.d(TAG, "getGkashCard: " + params1);
+        String body = new Gson().toJson(params1);
+        addSubscription(GkashApi.api.swipeCard(getRequestBody(body)).compose(HttpJapanResultHandler.<ResponseBody>transformer()),
+                new HttpResultObserver<ResponseBody>(mView, BaseApplication.getContext()) {
+                    @Override
+                    public void onNext(ResponseBody data) {
+                        Log.d(TAG, "getGkashCard onNext: " + data);
+                        Gson gson = new Gson();
+                        try {
+                            GkashCardBean gkashCardBean = gson.fromJson(data.string(), GkashCardBean.class);
+                            Log.d(TAG, "getGkashCardBean onNext: " + gkashCardBean);
+                            Log.d(TAG, "americaNihaoPayMerchantBean11: "+gkashCardBean);
+                            if ("Request successful".equals(gkashCardBean.getMessage()) && payGkashOrderNo.equals(gkashCardBean.getReferenceNo())) {
+                                sendGkashCardSuccess(payGkashOrderNo, price, signature1);
+                            }
+                        } catch (IOException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+
+                    @Override
+                    public void onError(Throwable t) {
+                        super.onError(t);
+                        t.printStackTrace();
+                        Log.d(TAG, "getGkashCard onError: " + t.getMessage());
+                        nihaoPayFail(t.getMessage());
+                    }
+                });
+    }
+
+    private int gkashCancelInt = 0;
+
+    //马来西亚Gkash刷卡取消
+    public void sendGkashCardCancel(String TerminalId) {
+        Map<String, Object> params1 = new HashMap<>();
+        params1.put("TerminalId", gkashTid);
+        String signature = RSASignUtil.signature(gkashKey, gkashTid);
+        params1.put("signature", signature);
+        Log.d(TAG, "sendGkashCardCancel: " + params1);
+        String body = new Gson().toJson(params1);
+        addSubscription(GkashApi.api.swipeCardCancel(getRequestBody(body)).compose(HttpJapanResultHandler.<ResponseBody>transformer()),
+                new HttpResultObserver<ResponseBody>(mView, BaseApplication.getContext()) {
+                    @Override
+                    public void onNext(ResponseBody data) {
+                        Log.d(TAG, "sendGkashCardCancel onNext1: " + data);
+                        Gson gson = new Gson();
+                        try {
+                            GkashCardBean gkashCardBean = gson.fromJson(data.string(), GkashCardBean.class);
+                            Log.d(TAG, "sendGkashCardCancel onNext: " + gkashCardBean);
+                            if ("Request successful".equals(gkashCardBean.getMessage())) {
+                                nihaoPayFail(gkashCardBean.getMessage());
+                            }
+                            gkashCancelInt = 0;
+                        } catch (IOException e) {
+                            throw new RuntimeException(e);
+                        }
+                    }
+
+                    @Override
+                    public void onError(Throwable t) {
+                        super.onError(t);
+                        t.printStackTrace();
+                        if (gkashCancelInt < 3) {
+                            new Handler().postDelayed(new Runnable() {
+                                @Override
+                                public void run() {
+                                    gkashCancelInt++;
+                                    sendGkashCardCancel(TerminalId);
+                                }
+                            }, 3000);
+                        }
+                        Log.d(TAG, "sendGkashCardCancel onError: " + t.getMessage());
+                    }
+                });
+    }
+
+    private RequestBody getRequestBody(String body) {
+        return RequestBody.create(MediaType.parse("Content-Type:application/json"), body);
+    }
+
+    private HttpCreditCardDialog httpCreditCardDialog;
+
+    public void sendGkashCardSuccess(String TerminalId,String price,String signature)  {
+        dismissLoading();
+        httpCreditCardDialog = new HttpCreditCardDialog(getContext(), getActivity());
+        httpCreditCardDialog.setListener(new DialogClickListener() {
+            public void onClickListener(int type) {
+                switch (type) {
+                    case 125:
+//                        if (dialogChoosePay != null) {
+//                            dialogChoosePay.startTimeDown(60);
+//                        }
+//                        if (shoppingTrolleyDialogChoosePay != null) {
+//                            shoppingTrolleyDialogChoosePay.startTimeDown(60);
+//                        }
+                        showLoading();
+                        sendGkashCardCancel(TerminalId);
+                        break;
+                    case 130:
+                        break;
+                    case R.id.btn_cancel:
+                        showLoading();
+                        sendGkashCardCancel(TerminalId);
+                        break;
+                }
+            }
+        });
+        httpCreditCardDialog.startTimeDown();
+        httpCreditCardDialog.setParams(TerminalId,price,signature) ;
+        httpCreditCardDialog.setImageView(R.drawable.icon_xinyongka_pay);
+        httpCreditCardDialog.show();
+    }
+    private void closeGkashCardDialog(){
+        if (httpCreditCardDialog!=null){
+            httpCreditCardDialog.dismiss();
+        }
+    }
+
+    private GkashPayDialog gkashPayDialog;
+
+    public void getGkashCodeSuccess(String rd_Pic, String sn,String cartid,String price,String signature) {
+//        stopFinishTimer();
+        showGkashDialogScan(rd_Pic,sn,cartid,price,signature);
+    }
+
+    public void showGkashDialogScan(String rd_Pic, String sn,String cartid,String price,String signature) {
+        gkashPayDialog = new GkashPayDialog(getContext(), getActivity());
+        gkashPayDialog.setListener(type -> {
+            switch (type) {
+                case 125:
+                    BaseConstant.CANCEL_POLL = false;
+                    break;
+                case 130:
+                    break;
+            }
+
+        });
+        gkashPayDialog.setGifType(1);
+        gkashPayDialog.setCodeData(rd_Pic, sn,cartid,price,signature);
+        gkashPayDialog.show();
+        /**
+         * 二維碼出現的時候開啓定時任務。
+         * 1.使用傳遞過來的訂單編號開啓一個定時任務。
+         */
+        //scanDialog.startGetTime(sn);
+        loadingDialog.dismiss();
+    }
+
+    public void nihaoPayFail(String message) {
+        dismissLoading();
+        com.hboxs.base_library.util.ToastUtil.showToast(message);
+        closeGkashCardDialog();
+    }
 }

+ 78 - 0
app/src/main/java/com/bgy/autosale/ui/operator/OtherParamActivity.java

@@ -0,0 +1,78 @@
+package com.bgy.autosale.ui.operator;
+
+import android.os.Build;
+import android.os.Bundle;
+import android.support.annotation.Nullable;
+import android.support.v7.widget.AppCompatEditText;
+import android.view.View;
+import android.widget.EditText;
+import android.widget.LinearLayout;
+import android.widget.TextView;
+
+import com.bgy.autosale.App;
+import com.bgy.autosale.Constant;
+import com.bgy.autosale.R;
+import com.bgy.autosale.ui.base.BaseScanGunActivity;
+import com.hboxs.base_library.constant.Global;
+import com.hboxs.base_library.constant.Name;
+import com.hboxs.base_library.util.UiUtil;
+import com.orhanobut.hawk.Hawk;
+
+/**
+ * Created by cjx on 2020-09-08
+ * 说明:
+ */
+public class OtherParamActivity extends BaseScanGunActivity implements View.OnClickListener {
+
+    private static final String TAG = "SnSettingActivity";
+
+    private LinearLayout llGkashParam;
+    private TextView gkashParamSave;
+    private AppCompatEditText etGkashCid, etGkashKey, etGkashTid;
+
+
+    @Override
+    protected void onCreate(@Nullable Bundle savedInstanceState) {
+        super.onCreate(savedInstanceState);
+        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
+            getWindow().getDecorView().setLayoutDirection(View.LAYOUT_DIRECTION_LTR);
+        }
+        setContentView(R.layout.activity_system_other_param);
+        findViewById(R.id.setting_back).setOnClickListener(this);
+
+        llGkashParam = findViewById(R.id.ll_gkash_param);
+        if (App.app.payChannel == Constant.GKash) {
+            llGkashParam.setVisibility(View.VISIBLE);
+        }
+        gkashParamSave = findViewById(R.id.gkash_param_save);
+        gkashParamSave.setOnClickListener(this);
+        etGkashCid = findViewById(R.id.et_gkash_cid);
+        etGkashKey = findViewById(R.id.et_gkash_key);
+        etGkashTid = findViewById(R.id.et_gkash_tid);
+        etGkashCid.setText(Hawk.get(Name.GkashCID, Global.GkashCID));
+        etGkashKey.setText(Hawk.get(Name.GkashsignatureKey, Global.GkashsignatureKey));
+        etGkashTid.setText(Hawk.get(Name.GkashterminalID, Global.GkashterminalID));
+
+    }
+
+    @Override
+    public void onClick(View v) {
+        int id = v.getId();
+        if (id == R.id.setting_back) {
+            finish();
+        } else if (id == R.id.gkash_param_save) {
+            String GkashCid = etGkashCid.getText().toString().trim();
+            String GkashKey = etGkashKey.getText().toString().trim();
+            String GkashTid = etGkashTid.getText().toString().trim();
+            Hawk.put(Name.GkashCID, GkashCid);
+            Hawk.put(Name.GkashsignatureKey, GkashKey);
+            Hawk.put(Name.GkashterminalID, GkashTid);
+            showToast(getString(R.string.modified_success));
+        }
+    }
+
+    @Override
+    protected void onDestroy() {
+        super.onDestroy();
+    }
+}

+ 14 - 0
app/src/main/java/com/bgy/autosale/ui/operator/fragments/OtherSettingFragment.java

@@ -20,6 +20,7 @@ import com.bgy.autosale.Constant;
 import com.bgy.autosale.R;
 import com.bgy.autosale.ui.base.BaseFragment;
 import com.bgy.autosale.ui.operator.LocalAlarmClockActivity;
+import com.bgy.autosale.ui.operator.OtherParamActivity;
 import com.bgy.autosale.ui.operator.SwitchSettingActivity;
 import com.bgy.autosale.ui.operator.TextSettingActivity;
 import com.bgy.autosale.ui.operator.TimeSettingActivity;
@@ -41,6 +42,7 @@ public class OtherSettingFragment extends BaseFragment {
     private final int ALARM_CLOCK = 1;
     private final int TIME_SET = 2;
     private final int SWITCH_SET = 3;
+    private final int OTHER_PARAM_SET = 4;
 
     @Override
     public int getViewId() {
@@ -63,6 +65,7 @@ public class OtherSettingFragment extends BaseFragment {
         list.add(initSetMsg());
         list.add(initTimeSet());
         list.add(initFunctionSwitchSet());
+        list.add(initParamSet());
         RecyclerView recyclerView = view.findViewById(R.id.recycler_view);
         recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
         OtherAdapter adapter = new OtherAdapter(list, getContext());
@@ -100,6 +103,13 @@ public class OtherSettingFragment extends BaseFragment {
         itemBean.buttonEnable = true;
         return itemBean;
     }
+    private OtherBean initParamSet() {
+        OtherBean itemBean = new OtherBean(OTHER_PARAM_SET);
+        itemBean.title = getString(R.string.other_param_setting);
+        itemBean.button = R.string.button_update;
+        itemBean.buttonEnable = true;
+        return itemBean;
+    }
 
     private static long lastClickTime = 0;
 
@@ -187,6 +197,10 @@ public class OtherSettingFragment extends BaseFragment {
                     break;
                 case SWITCH_SET:
                     gotoActivity(SwitchSettingActivity.class);
+                    break;
+                case OTHER_PARAM_SET:
+                    gotoActivity(OtherParamActivity.class);
+                    break;
             }
         }
 

+ 1 - 0
app/src/main/java/com/bgy/autosale/ui/operator/fragments/SwitchFragment.java

@@ -420,6 +420,7 @@ public class SwitchFragment extends BaseFragment implements RadioGroup.OnChecked
             list.add(new SwitchBean(R.string.setting_pay_pos_pay_mix, Constant.PAY_CHANNEL, Constant.PAY_POS_DEVICE_PAY_MIX));
             list.add(new SwitchBean(R.string.nayax_pay, Constant.PAY_CHANNEL, Constant.PAY_NAYAX_PAY));
             list.add(new SwitchBean(R.string.nayax_pay_mix, Constant.PAY_CHANNEL, Constant.PAY_NAYAX_PAY_MIX));
+            list.add(new SwitchBean(R.string.gkash_pay, Constant.PAY_CHANNEL, Constant.GKash));
         }
         return list;
     }

+ 162 - 0
app/src/main/res/layout/activity_system_other_param.xml

@@ -0,0 +1,162 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    xmlns:tools="http://schemas.android.com/tools"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:focusable="true"
+    android:focusableInTouchMode="true">
+
+    <RelativeLayout
+        android:layout_width="match_parent"
+        android:layout_height="match_parent">
+
+        <android.support.v7.widget.AppCompatImageView
+            android:id="@+id/setting_back"
+            android:layout_width="@dimen/dp_35"
+            android:layout_height="@dimen/dp_35"
+            android:layout_marginStart="@dimen/dp_26"
+            android:layout_marginTop="@dimen/dp_26"
+            app:layout_constraintBottom_toBottomOf="parent"
+            app:layout_constraintStart_toStartOf="parent"
+            app:srcCompat="@drawable/vector_btn_back" />
+    </RelativeLayout>
+
+    <LinearLayout
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content"
+        android:orientation="vertical"
+        tools:ignore="MissingConstraints">
+        <LinearLayout
+            android:id="@+id/ll_gkash_param"
+            android:visibility="gone"
+            android:layout_gravity="center"
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content">
+    <LinearLayout
+        android:layout_marginTop="20dp"
+        android:orientation="vertical"
+        android:visibility="visible"
+        android:layout_width="wrap_content"
+        android:layout_height="wrap_content">
+        <TextView
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:text="Gkash Param"
+            android:textStyle="bold"
+            android:layout_gravity="center"
+            android:textColor="#576478"
+            android:textSize="@dimen/sp_15" />
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginTop="@dimen/dp_10"
+            android:orientation="horizontal">
+
+
+            <TextView
+                android:layout_width="@dimen/dp_120"
+                android:layout_height="wrap_content"
+                android:gravity="right"
+                android:layout_gravity="center"
+                android:text="CID: "
+                android:textColor="@color/colorPrimaryDark"
+                android:textSize="@dimen/sp_12"
+                android:textStyle="bold"
+                tools:ignore="MissingConstraints" />
+
+            <android.support.v7.widget.AppCompatEditText
+                android:id="@+id/et_gkash_cid"
+                android:layout_width="@dimen/dp_200"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:singleLine="true"
+                android:textColor="@color/colorPrimaryDark"
+                android:textSize="@dimen/sp_15"
+                android:textStyle="bold"
+                tools:ignore="MissingConstraints" />
+
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginTop="@dimen/dp_10"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="@dimen/dp_120"
+                android:layout_height="wrap_content"
+                android:gravity="right"
+                android:layout_gravity="center"
+                android:text="signatureKey: "
+                android:textColor="@color/colorPrimaryDark"
+                android:textSize="@dimen/sp_12"
+                android:textStyle="bold"
+                tools:ignore="MissingConstraints" />
+
+            <android.support.v7.widget.AppCompatEditText
+                android:id="@+id/et_gkash_key"
+                android:layout_width="@dimen/dp_200"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:singleLine="true"
+                android:textColor="@color/colorPrimaryDark"
+                android:textSize="@dimen/sp_14"
+                android:textStyle="bold"
+                tools:ignore="MissingConstraints" />
+
+        </LinearLayout>
+
+        <LinearLayout
+            android:layout_width="wrap_content"
+            android:layout_height="wrap_content"
+            android:layout_gravity="center"
+            android:layout_marginTop="@dimen/dp_10"
+            android:orientation="horizontal">
+
+            <TextView
+                android:layout_width="@dimen/dp_120"
+                android:layout_height="wrap_content"
+                android:gravity="right"
+                android:layout_gravity="center"
+                android:text="terminalID: "
+                android:textColor="@color/colorPrimaryDark"
+                android:textSize="@dimen/sp_12"
+                android:textStyle="bold"
+                tools:ignore="MissingConstraints" />
+
+            <android.support.v7.widget.AppCompatEditText
+                android:id="@+id/et_gkash_tid"
+                android:layout_width="@dimen/dp_200"
+                android:layout_height="wrap_content"
+                android:gravity="center"
+                android:singleLine="true"
+                android:textColor="@color/colorPrimaryDark"
+                android:textSize="@dimen/sp_14"
+                android:textStyle="bold"
+                tools:ignore="MissingConstraints" />
+
+        </LinearLayout>
+
+    </LinearLayout>
+            <TextView
+                android:id="@+id/gkash_param_save"
+                android:layout_width="@dimen/dp_70"
+                android:layout_height="@dimen/dp_40"
+                android:background="@drawable/bg_config_confirm"
+                android:layout_gravity="center"
+                android:layout_marginLeft="20dp"
+                android:layout_marginTop="@dimen/dp_50"
+                android:gravity="center"
+                android:text="@string/confirm_revision"
+                android:textColor="#FE5DBB"
+                android:textSize="@dimen/sp_12" />
+        </LinearLayout>
+
+    </LinearLayout>
+
+</android.support.constraint.ConstraintLayout>

+ 23 - 0
app/src/main/res/layout/dialog_shopping_trolley_choose_pay.xml

@@ -94,6 +94,29 @@
                     android:src="@drawable/quibinary"
                     android:visibility="gone" />
 
+                <ImageView
+                    android:id="@+id/iv_mlxy_gkash"
+                    android:layout_width="@dimen/dp_50"
+                    android:layout_height="@dimen/dp_60"
+                    android:layout_marginLeft="@dimen/dp_8"
+                    android:layout_marginTop="@dimen/dp_16"
+                    android:background="@drawable/shape_et_price"
+                    android:paddingHorizontal="@dimen/dp_5"
+                    android:src="@drawable/icon_gkash"
+                    android:visibility="gone"/>
+
+                <ImageView
+                    android:id="@+id/iv_mlxy_gkash_card"
+                    android:layout_width="@dimen/dp_50"
+                    android:layout_height="@dimen/dp_60"
+                    android:layout_marginLeft="@dimen/dp_8"
+                    android:layout_marginTop="@dimen/dp_16"
+                    android:layout_toEndOf="@id/iv_mlxy_gkash"
+                    android:background="@drawable/shape_et_price"
+                    android:paddingHorizontal="@dimen/dp_5"
+                    android:src="@drawable/icon_xinyongka_pay"
+                    android:visibility="gone"/>
+
             </LinearLayout>
 
             <LinearLayout

+ 2 - 0
app/src/main/res/values/strings.xml

@@ -501,6 +501,8 @@
     <string name="ic_icon_text">冰淇淋图标文字更改</string>
     <string name="credit_card_text_description">信用卡文本描述</string>
     <string name="function_switch_setting">功能设置开关</string>
+    <string name="gkash_pay">Gkash</string>
+    <string name="other_param_setting">其他参数设置</string>
 
 </resources>
 <!--中文-->

+ 1 - 1
config.gradle

@@ -5,7 +5,7 @@ ext {
             "minSdkVersion"                : 21,
             "targetSdkVersion"             : 28,
             "versionCode"                  : 110,
-            "versionName"                  : "1.0.70",//版本号修改
+            "versionName"                  : "1.0.72",//版本号修改
 
             "androidSupport"               : "28.0.0",
             "constraint-layout"            : "1.1.3",