HttpVerifyApi.java 2.88 KB
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;
        }
    }
}