package com.ectrip.checkincar.net; import com.ectrip.checkincar.core.prefs.AppPrefs; import com.ectrip.checkincar.model.VerifyRequest; import com.ectrip.checkincar.model.VerifyResult; import java.util.concurrent.TimeUnit; import okhttp3.MediaType; import okhttp3.OkHttpClient; import okhttp3.Request; import okhttp3.RequestBody; import okhttp3.Response; /** * 真实核销后台:POST {baseUrl}/tdos/consumeOrder_/appedit.do * 参数 licensePlate(车牌经 Base64 编码后传输,后台解码还原)。 * 免登录接口,内部固定系统账号执行订单核销逻辑,核销成功同步更新车牌状态为已入场。 * 返回 AjaxData{success,info}。 */ public class HttpVerifyApi implements VerifyApi { private static final String PATH = "/tdos/consumeOrder_/appedit.do"; private static final MediaType FORM = MediaType.parse("application/x-www-form-urlencoded; charset=utf-8"); private final OkHttpClient client = new OkHttpClient.Builder() .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(8, TimeUnit.SECONDS) .writeTimeout(8, TimeUnit.SECONDS) .build(); @Override public VerifyResult verify(VerifyRequest request) throws Exception { String base = AppPrefs.getBaseUrl(); while (base.endsWith("/")) { base = base.substring(0, base.length() - 1); } String plate = request.plateNo == null ? "" : request.plateNo.trim(); // 车牌先 Base64 编码再传输,后台解码还原 String encodedPlate = android.util.Base64.encodeToString( plate.getBytes("UTF-8"), android.util.Base64.NO_WRAP); // 表单体:licensePlate=Base64(车牌) String formBody = "licensePlate=" + java.net.URLEncoder.encode(encodedPlate, "UTF-8"); Request httpRequest = new Request.Builder() .url(base + PATH) .post(RequestBody.create(FORM, formBody)) .build(); try (Response response = client.newCall(httpRequest).execute()) { String body = response.body() != null ? response.body().string() : ""; // 打印后台原始响应,便于排查「响应解析失败」类问题 System.out.println("HttpVerifyApi resp code=" + response.code() + " url=" + base + PATH + " bodyLen=" + body.length() + " body=" + (body.length() > 500 ? body.substring(0, 500) + "..." : body)); if (!response.isSuccessful()) { return VerifyResult.fail("后台返回 HTTP " + response.code() + ",报文:" + body); } VerifyResult result = VerifyResult.fromServerJson(body); // 后台不回车牌,回退用识别到的车牌展示 if (result.plateNo.isEmpty()) { result.plateNo = plate; } return result; } } }