diff --git a/app/src/main/java/com/unibuy/smartdevice/controller/DevNFCPayController.java b/app/src/main/java/com/unibuy/smartdevice/controller/DevNFCPayController.java index d47afb2..6649823 100644 --- a/app/src/main/java/com/unibuy/smartdevice/controller/DevNFCPayController.java +++ b/app/src/main/java/com/unibuy/smartdevice/controller/DevNFCPayController.java @@ -151,30 +151,17 @@ public class DevNFCPayController extends HandlerMainScheduler { getLogs().info("電文接收:" + readData); MyApp.getInstance().getReportFlowInfoData().setFlowRequestInfo(readData); - while (isRun() && MyApp.getInstance().isShowDialog()) { // ✅ 增加狀態檢查 - byte[] buffer = comPort2.readListen(30, 200); + // 【修復 付款成功卻不出貨】交易結果(含 responseCode)就在這段 404 byte 電文裡, + // 直接解析本段即可。先前版本誤改成再用 readListen 等「第二段」電文才解析, + // 但刷卡機只送這一段,第二段永遠等不到 → 倒數逾時 → RESPONSE 從未送出 → 不出貨。 + HashMap readMap = devNFCPay.read(readData); + String code = readMap.get("code"); + getLogs().info("交易完成,回傳代碼: " + code); - if (buffer.length > 0) { - getLogs().debug("NFC 收到資料: " + PortTools.showHex(buffer)); - String rxData = new String(buffer, StandardCharsets.UTF_8); - - if (rxData.contains(String.valueOf((char) 0x03))) { // ETX - HashMap response = devNFCPay.read(rxData); - String code = response.get("code"); - - if (isRun() && !isShuttingDown && MyApp.getInstance().isShowDialog()) { // ✅ 最後回報前的檢查 - getHandlerMain().start(getClass().getSimpleName(), Option.RESPONSE.getOption(), code); - } else { - getLogs().info("🚫 控制器已停止或對話框已關閉,捨棄 NFC 回傳結果"); - } - break; - } - } - - if (!isRun() || isShuttingDown || !MyApp.getInstance().isShowDialog()) { - getLogs().info("NFC 讀取中斷: 控制器關閉或對話框消失"); - break; - } + if (isRun() && !isShuttingDown && MyApp.getInstance().isShowDialog()) { // ✅ 回報前的生命週期檢查 + getHandlerMain().start(getClass().getSimpleName(), Option.RESPONSE.getOption(), code); + } else { + getLogs().info("🚫 控制器已停止或對話框已關閉,捨棄 NFC 回傳結果"); } } catch (LogsParseException | LogsIOException e) { getLogs().warning(e);