package com.talentcard.server.business.payment.huifu;
import static org.assertj.core.api.Assertions.assertThat;
import java.util.Map;
import com.alibaba.fastjson.JSON;
import org.junit.jupiter.api.Test;
/**
* 个人(小微)商户进件请求里几条容易漏、且漏了就一定被通道驳回的字段。
*
*
三条规则都是与业务确认过的口径,不是猜的:
*
*
* - {@code store_header_pic}(F22)是**必填**:三种小微经营类型都要传,只是图片内容要求不同——
* 线上商品/服务交易传店铺首页截图、流动经营/便民服务传经营现场照、门店场所传实体门头照。
* 不能因为"线上没有实体店"就整项不传。
* - 证件「长期有效」({@code *_validity_type=1})时**不填**截止日期,非长期必填。
* - {@code settle_config} 的 {@code fixed_ratio} / {@code constant_amt} 在 D1 下是条件必填,
* 平台不收这笔钱,填 0.00;完全不传会被判缺参数。
*
*/
class HuifuIndividualOnboardingRequiredFieldsTests {
@Test
void theStorePhotoIsAlwaysCarriedEvenForOnlineOnlyMicroMerchants() {
Map request = request(command("0", "20120110", "20320110"));
assertThat(request).containsEntry("store_header_pic", "F22-STORE");
assertThat(request).containsEntry("settle_card_front_pic", "F13-CARD");
}
@Test
void aLongTermCertificateOmitsBothDeadlines() {
Map request = request(command("1", "20120110", ""));
assertThat(request).containsEntry("legal_cert_validity_type", "1");
assertThat(request).doesNotContainKey("legal_cert_end_date");
assertThat(cardInfo(request)).doesNotContainKey("cert_end_date");
}
@Test
void aFixedTermCertificateCarriesBothDeadlines() {
Map request = request(command("0", "20120110", "20320110"));
assertThat(request).containsEntry("legal_cert_end_date", "20320110");
assertThat(cardInfo(request)).containsEntry("cert_validity_type", "0").containsEntry("cert_end_date", "20320110");
}
/** 结算周期是 D1,节假日结算手续费两项必须下发;平台不收,填 0.00。 */
@Test
void theSettlementConfigCarriesTheD1HolidayFeeFields() {
Map settle = JSON.parseObject(String.valueOf(request(command("0", "20120110", "20320110")).get("settle_config")), Map.class);
assertThat(settle)
.containsEntry("settle_cycle", "D1")
.containsEntry("fixed_ratio", "0.00")
.containsEntry("constant_amt", "0.00")
.containsEntry("min_amt", "0.00")
.containsEntry("remained_amt", "0.00");
}
/** 企业主体同一份 settle_config(个人进件复用它,见 HuifuIndividualOnboardingGateway)。 */
@Test
void theEnterpriseSettlementConfigCarriesTheSameHolidayFeeFields() {
Map settle = HuifuEnterpriseOnboardingGateway.settleConfig();
assertThat(settle).containsEntry("fixed_ratio", "0.00").containsEntry("constant_amt", "0.00");
}
private static HuifuPaymentProperties properties() {
HuifuPaymentProperties properties = new HuifuPaymentProperties();
properties.setEnabled(true);
properties.setSystemId("6666000220591054");
properties.setProductId("KAZX");
properties.setPrivateKey("x");
properties.setPlatformPublicKey("y");
properties.setMerchantWechatFeeRate("0.70");
properties.setMerchantOnlineBusinessType("H5311L");
properties.setMerchantAgreementUrl("https://example.com/agreement.htm");
properties.setOnboardingUpperHuifuId("6666000220591054");
return properties;
}
private static Map request(HuifuIndividualOnboardingCommand command) {
return HuifuIndividualOnboardingGateway.buildRequestForTest(properties(), command);
}
@SuppressWarnings("unchecked")
private static Map cardInfo(Map request) {
return JSON.parseObject(String.valueOf(request.get("card_info")), Map.class);
}
private static HuifuIndividualOnboardingCommand command(String validityType, String beginDate, String endDate) {
return new HuifuIndividualOnboardingCommand(
"MO-TEST-1", "阳野", "511602199803310019", validityType, beginDate, endDate, "15708261096",
"四川省广安市广安区兴安中街227号3栋1单元6楼2号", "1347747024@qq.com", "5812",
"510000", "510100", "510104", "F40-ID", "F41-ID",
"6217003680002760924", "510000", "511600", "01050000", "F13-CARD", "F22-STORE");
}
}