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;
}
}