|
@@ -381,6 +381,98 @@ public class FacetofaceService {
|
|
|
.last("LIMIT 100"));
|
|
.last("LIMIT 100"));
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ // ==================== 交易收款 ====================
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 生成当面付收款二维码 — 调用 alipay.trade.precreate
|
|
|
|
|
+ */
|
|
|
|
|
+ public F2fTradeVO precreateTrade(F2fTradePrecreateDTO dto) {
|
|
|
|
|
+ FacetofaceOrderEntity order = getSuccessOrder(dto.getEnterpriseId());
|
|
|
|
|
+
|
|
|
|
|
+ String outTradeNo = "F2F" + System.currentTimeMillis() + String.format("%04d", (int) (Math.random() * 10000));
|
|
|
|
|
+ try {
|
|
|
|
|
+ AlipayTradePrecreateModel model = new AlipayTradePrecreateModel();
|
|
|
|
|
+ model.setOutTradeNo(outTradeNo);
|
|
|
|
|
+ model.setTotalAmount(dto.getTotalAmount());
|
|
|
|
|
+ model.setSubject(StrUtil.isNotBlank(dto.getSubject()) ? dto.getSubject() : "当面付收款");
|
|
|
|
|
+
|
|
|
|
|
+ AlipayTradePrecreateRequest request = new AlipayTradePrecreateRequest();
|
|
|
|
|
+ request.setBizModel(model);
|
|
|
|
|
+ request.setNotifyUrl(alipayClientFactory.getPaymentConfig().getNotifyUrl());
|
|
|
|
|
+ request.putOtherTextParam("app_auth_token", order.getAppAuthToken());
|
|
|
|
|
+
|
|
|
|
|
+ AlipayTradePrecreateResponse response = alipayClientFactory.getClient(dto.getEnterpriseId(), ServiceProviderBizType.FACETOFACE_NOTIFY.getValue()).execute(request);
|
|
|
|
|
+
|
|
|
|
|
+ if (!response.isSuccess()) {
|
|
|
|
|
+ throw new BusinessException(400, "生成收款码失败: " +
|
|
|
|
|
+ (response.getSubMsg() != null ? response.getSubMsg() : response.getMsg()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ log.info("当面付收款码生成成功: out_trade_no={}, qr_code={}", outTradeNo, response.getQrCode());
|
|
|
|
|
+
|
|
|
|
|
+ F2fTradeVO vo = new F2fTradeVO();
|
|
|
|
|
+ vo.setOutTradeNo(outTradeNo);
|
|
|
|
|
+ vo.setQrCode(response.getQrCode());
|
|
|
|
|
+ return vo;
|
|
|
|
|
+
|
|
|
|
|
+ } catch (AlipayApiException ex) {
|
|
|
|
|
+ throw new BusinessException(400, "生成收款码失败: " + ex.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /** 查询交易状态 — 调用 alipay.trade.query */
|
|
|
|
|
+ public F2fTradeVO queryTrade(F2fTradeQueryDTO dto) {
|
|
|
|
|
+ FacetofaceOrderEntity order = getSuccessOrder(dto.getEnterpriseId());
|
|
|
|
|
+
|
|
|
|
|
+ try {
|
|
|
|
|
+ AlipayTradeQueryModel model = new AlipayTradeQueryModel();
|
|
|
|
|
+ model.setOutTradeNo(dto.getOutTradeNo());
|
|
|
|
|
+
|
|
|
|
|
+ AlipayTradeQueryRequest request = new AlipayTradeQueryRequest();
|
|
|
|
|
+ request.setBizModel(model);
|
|
|
|
|
+ request.putOtherTextParam("app_auth_token", order.getAppAuthToken());
|
|
|
|
|
+
|
|
|
|
|
+ AlipayTradeQueryResponse response = alipayClientFactory.getClient(dto.getEnterpriseId(), ServiceProviderBizType.FACETOFACE_NOTIFY.getValue()).execute(request);
|
|
|
|
|
+
|
|
|
|
|
+ if (!response.isSuccess()) {
|
|
|
|
|
+ throw new BusinessException(400, "查询交易状态失败: " +
|
|
|
|
|
+ (response.getSubMsg() != null ? response.getSubMsg() : response.getMsg()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ F2fTradeVO vo = new F2fTradeVO();
|
|
|
|
|
+ vo.setOutTradeNo(dto.getOutTradeNo());
|
|
|
|
|
+ vo.setTradeNo(response.getTradeNo());
|
|
|
|
|
+ vo.setTotalAmount(response.getTotalAmount());
|
|
|
|
|
+ vo.setTradeStatus(response.getTradeStatus());
|
|
|
|
|
+ vo.setBuyerId(response.getBuyerUserId());
|
|
|
|
|
+ vo.setBuyerLogonId(response.getBuyerLogonId());
|
|
|
|
|
+ if (response.getSendPayDate() != null) {
|
|
|
|
|
+ vo.setGmtPayment(response.getSendPayDate().toString());
|
|
|
|
|
+ }
|
|
|
|
|
+ return vo;
|
|
|
|
|
+
|
|
|
|
|
+ } catch (AlipayApiException ex) {
|
|
|
|
|
+ throw new BusinessException(400, "查询交易状态失败: " + ex.getMessage());
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /** 获取企业对应的已开通当面付订单 */
|
|
|
|
|
+ private FacetofaceOrderEntity getSuccessOrder(String enterpriseId) {
|
|
|
|
|
+ FacetofaceOrderEntity order = mapper.selectOne(
|
|
|
|
|
+ new LambdaQueryWrapper<FacetofaceOrderEntity>()
|
|
|
|
|
+ .eq(FacetofaceOrderEntity::getEnterpriseId, enterpriseId)
|
|
|
|
|
+ .eq(FacetofaceOrderEntity::getOrderStatus, FacetofaceOrderStatus.SUCCESS.getValue())
|
|
|
|
|
+ .orderByDesc(FacetofaceOrderEntity::getId)
|
|
|
|
|
+ .last("LIMIT 1"));
|
|
|
|
|
+ if (order == null) {
|
|
|
|
|
+ throw new BusinessException(400, "该企业尚未开通当面付或开通未成功");
|
|
|
|
|
+ }
|
|
|
|
|
+ if (StrUtil.isBlank(order.getAppAuthToken())) {
|
|
|
|
|
+ throw new BusinessException(400, "该企业的当面付授权令牌缺失,请重新开通");
|
|
|
|
|
+ }
|
|
|
|
|
+ return order;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
// ========== private ==========
|
|
// ========== private ==========
|
|
|
|
|
|
|
|
private FacetofaceOrderEntity requireOrder(Long id) {
|
|
private FacetofaceOrderEntity requireOrder(Long id) {
|