import com.alibaba.fastjson.JSON; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.dataformat.yaml.YAMLMapper; import com.huifu.bspay.sdk.opps.client.BasePayClient; import com.huifu.bspay.sdk.opps.core.BasePay; import com.huifu.bspay.sdk.opps.core.config.MerConfig; import java.nio.file.Files; import java.nio.file.Path; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.LinkedHashMap; import java.util.Map; /** * 读取斗拱商户的结算与取现配置(只读)。 * *

用「商户详细信息查询」而不是能力查询:后者对这个商户会返回 20002 数据权限认证失败, * 而详细信息查询能一次拿到 qry_settle_config_list 与 qry_cash_config_list。 * *

用法:java -cp "target/classes;<deps>;<tools>" SettlementProbe <huifu_id> */ public class SettlementProbe { public static void main(String[] args) throws Exception { String huifuId = args.length > 0 ? args[0] : "6666000226048687"; JsonNode huifu = new YAMLMapper().readTree(Files.newInputStream( Path.of("src", "main", "resources", "application.yml"))) .path("app").path("payment").path("huifu"); String environment = text(huifu, "environment", "prod"); String systemId = text(huifu, "system-id", ""); String productId = text(huifu, "product-id", ""); String privateKey = text(huifu, "private-key", ""); String platformPublicKey = text(huifu, "platform-public-key", ""); BasePay.debug = false; BasePay.prodMode = "prod".equalsIgnoreCase(environment) ? BasePay.MODE_PROD : BasePay.MODE_TEST; MerConfig config = new MerConfig(); config.setSysId(systemId.trim()); config.setProductId(productId.trim()); config.setRsaPrivateKey(privateKey.trim()); config.setRsaPublicKey(platformPublicKey.trim()); BasePay.initWithMerConfig(config); Map request = new LinkedHashMap<>(); request.put("req_seq_id", "PS" + System.currentTimeMillis()); request.put("req_date", LocalDate.now().format(DateTimeFormatter.BASIC_ISO_DATE)); request.put("huifu_id", huifuId.trim()); Map response = BasePayClient.request(request, "v2.merchant.basicdata.query", false); Map data = response.get("data") instanceof Map map ? (Map) map : response; System.out.println("================ 结算与取现配置 ================"); print(data, "mer_stat", "delay_flag", "forced_delay_flag", "online_refund", "platform_refund"); System.out.println(" qry_settle_config_list = " + data.get("qry_settle_config_list")); System.out.println(" qry_cash_config_list = " + data.get("qry_cash_config_list")); System.out.println(" qry_cash_card_info_list默认卡 = " + defaultCard(data)); System.out.println("=============================================="); } /** 结算卡信息含卡号与证件号,只打印是否默认卡与绑卡序列号。 */ @SuppressWarnings("unchecked") private static String defaultCard(Map data) { Object raw = data.get("qry_cash_card_info_list"); if (!(raw instanceof String json) || json.isBlank()) return String.valueOf(raw); try { Object parsed = JSON.parse(json); if (parsed instanceof java.util.List list) { for (Object item : list) { if (item instanceof Map card && "Y".equals(String.valueOf(card.get("is_settle_default")))) { return "token_no=" + card.get("token_no") + ", status=" + card.get("status") + ", bank=" + card.get("bank_name"); } } } } catch (Exception ignored) { return "解析失败"; } return "未找到默认结算卡"; } private static void print(Map data, String... fields) { for (String field : fields) { if (data.containsKey(field)) System.out.println(" " + field + " = " + data.get(field)); } } private static String text(JsonNode node, String field, String fallback) { String value = node.path(field).asText(""); if (value.isBlank()) return fallback; if (value.startsWith("${") && value.endsWith("}")) { String inner = value.substring(2, value.length() - 1); int separator = inner.indexOf(':'); value = separator >= 0 ? inner.substring(separator + 1) : ""; } return value.isBlank() ? fallback : value; } }