| | |
| | | |
| | | import static org.assertj.core.api.Assertions.assertThat; |
| | | import static org.assertj.core.api.Assertions.assertThatThrownBy; |
| | | import static org.mockito.ArgumentMatchers.any; |
| | | import static org.mockito.Mockito.when; |
| | | |
| | | import java.math.BigDecimal; |
| | | import java.sql.Timestamp; |
| | |
| | | import java.time.LocalDateTime; |
| | | import java.util.Map; |
| | | import com.talentcard.server.business.merchant.auth.MerchantPrincipal; |
| | | import com.talentcard.server.business.payment.huifu.HuifuMiniProgramPaymentGateway; |
| | | import com.talentcard.server.business.portal.FreeBenefitPortalService; |
| | | import com.talentcard.server.business.portal.PendingOrderPaymentRequest; |
| | | import com.talentcard.server.business.portal.PendingOrderPortalService; |
| | |
| | | import org.springframework.boot.test.context.SpringBootTest; |
| | | import org.springframework.jdbc.core.JdbcTemplate; |
| | | import org.springframework.test.context.ActiveProfiles; |
| | | import org.springframework.test.context.bean.override.mockito.MockitoBean; |
| | | |
| | | @SpringBootTest |
| | | @ActiveProfiles("test") |
| | |
| | | |
| | | @Autowired |
| | | private FreeBenefitPortalService freeBenefitPortalService; |
| | | |
| | | @MockitoBean |
| | | private HuifuMiniProgramPaymentGateway paymentGateway; |
| | | |
| | | private Long merchantId; |
| | | private Long storeId; |
| | |
| | | void pendingOrderCanBeCancelledAfterPrepayIsCreated() { |
| | | String suffix = String.valueOf(System.nanoTime()); |
| | | String orderNo = "PREPAY-CANCEL-" + suffix; |
| | | // 取消前必须先问通道,所以订单要带上收款子商户,通道也要能答复这笔交易的状态。 |
| | | String huifuId = "H" + suffix.substring(Math.max(0, suffix.length() - 8)); |
| | | jdbc.update(""" |
| | | insert into benefit_order(order_no, talent_id, card_id, merchant_id, store_id, order_type, |
| | | order_amount, subsidy_amount, pay_amount, order_status, verify_status, deleted) |
| | | values (?, ?, ?, ?, ?, 'GROUP_BUY', 10000, 0, 10000, 0, 0, 0) |
| | | """, orderNo, talentId, cardId, merchantId, storeId); |
| | | order_amount, subsidy_amount, pay_amount, order_status, verify_status, deleted, |
| | | collect_huifu_id) |
| | | values (?, ?, ?, ?, ?, 'GROUP_BUY', 10000, 0, 10000, 0, 0, 0, ?) |
| | | """, orderNo, talentId, cardId, merchantId, storeId, huifuId); |
| | | Long orderId = jdbc.queryForObject("select max(id) from benefit_order", Long.class); |
| | | jdbc.update(""" |
| | | insert into payment_transaction(payment_no, provider, order_id, order_no, talent_id, merchant_id, |
| | | amount, status, idempotency_key) |
| | | values (?, 'HUIFU', ?, ?, ?, ?, 10000, 'PREPAY_CREATED', ?) |
| | | """, "PREPAY-CANCEL-PAY-" + suffix, orderId, orderNo, talentId, merchantId, "prepay-cancel-" + suffix); |
| | | provider_huifu_id, amount, status, idempotency_key) |
| | | values (?, 'HUIFU', ?, ?, ?, ?, ?, 10000, 'PREPAY_CREATED', ?) |
| | | """, "PREPAY-CANCEL-PAY-" + suffix, orderId, orderNo, talentId, merchantId, huifuId, "prepay-cancel-" + suffix); |
| | | // 通道回答「交易只登记过、从未开始支付」:这笔请求不可能收过钱,取消成立;关单确认成功之后, |
| | | // 本地流水才记为已关闭。 |
| | | when(paymentGateway.queryMiniProgramPayment(any())).thenReturn(Map.of("data", Map.of( |
| | | "trans_stat", "I", "resp_code", "00000000", "trans_amt", "100.00", "huifu_id", huifuId))); |
| | | when(paymentGateway.closeMiniProgramPayment(any())).thenReturn(Map.of("data", Map.of( |
| | | "trans_stat", "S", "resp_code", "00000000", "resp_desc", "交易成功", "huifu_id", huifuId))); |
| | | |
| | | pendingOrderPortalService.cancel(orderNo, talentId); |
| | | |