package com.tourguide.common.huifu; import com.alibaba.fastjson.JSONObject; import com.tourguide.common.huifu.biz.DouGongPayUtil; import com.tourguide.common.huifu.properties.HuiFuProperties; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.util.Base64; import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; class HuifuCallbackVerifierTest { private String privateKey; private HuifuCallbackVerifier verifier; @BeforeEach void setUp() throws Exception { KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); generator.initialize(2048); KeyPair keyPair = generator.generateKeyPair(); privateKey = Base64.getEncoder().encodeToString(keyPair.getPrivate().getEncoded()); HuiFuProperties properties = new HuiFuProperties(); properties.setRsaPublicKey(Base64.getEncoder().encodeToString(keyPair.getPublic().getEncoded())); verifier = new HuifuCallbackVerifier(properties); } @Test void shouldVerifyAndParseSignedCallback() { String respData = "{\"req_seq_id\":\"DG001\",\"trans_stat\":\"S\",\"trans_amt\":\"36.00\"}"; String sign = DouGongPayUtil.sign(respData, privateKey); JSONObject result = verifier.verify(sign, respData); assertThat(result.getString("req_seq_id")).isEqualTo("DG001"); assertThat(result.getString("trans_stat")).isEqualTo("S"); } @Test void shouldRejectTamperedCallback() { String respData = "{\"req_seq_id\":\"DG001\",\"trans_amt\":\"36.00\"}"; String sign = DouGongPayUtil.sign(respData, privateKey); assertThatThrownBy(() -> verifier.verify(sign, "{\"req_seq_id\":\"DG001\",\"trans_amt\":\"3600.00\"}")) .isInstanceOf(IllegalArgumentException.class) .hasMessage("汇付回调验签失败"); } }