解析所有发起购买的客户端ip地址

This commit is contained in:
2025-01-07 11:07:49 +08:00
parent e4a8bf80e9
commit 6a861305d6
19 changed files with 204 additions and 66 deletions

View File

@@ -23,6 +23,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@@ -54,21 +55,21 @@ public class AliPayServiceImpl implements AliPayService {
@Transactional(rollbackFor = Exception.class)
@Override
public String tradeCreate(Integer amount, String returnUrl) {
public String tradeCreate(Integer amount, String returnUrl, HttpServletRequest request) {
try {
//生成订单
log.info("生成订单");
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY.getType());
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY.getType(), request);
//调用支付宝接口
AlipayTradePagePayRequest request = new AlipayTradePagePayRequest();
AlipayTradePagePayRequest alipayRequest = new AlipayTradePagePayRequest();
//配置需要的公共请求参数
//支付完成后,支付宝发起异步通知的地址
request.setNotifyUrl(config.getProperty("alipay.notify-url"));
alipayRequest.setNotifyUrl(config.getProperty("alipay.notify-url"));
//支付完成后我们想让页面跳转回aida的页面配置returnUrl
// request.setReturnUrl(config.getProperty("alipay.return-url"));
request.setReturnUrl(returnUrl);
// alipayRequest.setReturnUrl(config.getProperty("alipay.return-url"));
alipayRequest.setReturnUrl(returnUrl);
//组装当前业务方法的请求参数
JSONObject bizContent = new JSONObject();
@@ -79,10 +80,10 @@ public class AliPayServiceImpl implements AliPayService {
bizContent.put("subject", "积分购买");
bizContent.put("product_code", "FAST_INSTANT_TRADE_PAY");
request.setBizContent(bizContent.toString());
alipayRequest.setBizContent(bizContent.toString());
//执行请求,调用支付宝接口
AlipayTradePagePayResponse response = alipayClient.pageExecute(request);
AlipayTradePagePayResponse response = alipayClient.pageExecute(alipayRequest);
if(response.isSuccess()){
log.info("调用成功,返回结果 ===> " + response.getBody());

View File

@@ -20,6 +20,7 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.HashMap;
@@ -64,7 +65,7 @@ public class AlipayHKServiceImpl implements AlipayHKService {
* 创建订单
*/
@Override
public String createOrder(Integer amount, String wallet){
public String createOrder(Integer amount, String wallet , HttpServletRequest request){
try{
HashMap<String, Object> param = new HashMap<>();
@@ -80,7 +81,7 @@ public class AlipayHKServiceImpl implements AlipayHKService {
log.info("alipay-hk 创建订单,参数信息: {}", param);
// 生成订单
log.info("创建订单");
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY_HK.getType());
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.ALIPAY_HK.getType(), request);
/*// 加密
AlipayHKRequestDTO alipayHKRequestDTO = alipayHKEncryptionUtil.AESCBCWithRSA(param, AlipayHKConstant.CREATE_ORDER);
// 请求Alipay服务端

View File

@@ -7,6 +7,7 @@ import com.ai.da.common.enums.OrderStatusEnum;
import com.ai.da.common.enums.ProductEnum;
import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.common.utils.OrderNoUtils;
import com.ai.da.common.utils.RequestInfoUtil;
import com.ai.da.mapper.primary.OrderInfoMapper;
import com.ai.da.mapper.primary.PaymentInfoMapper;
import com.ai.da.mapper.primary.ProductMapper;
@@ -25,11 +26,14 @@ import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.time.Duration;
import java.time.Instant;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.List;
import java.util.Map;
import java.util.Objects;
@Service
@Slf4j
@@ -42,7 +46,7 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
private PaymentInfoMapper paymentInfoMapper;
@Override
public OrderInfo createOrderByProductId(Integer amount, String paymentType) {
public OrderInfo createOrderByProductId(Integer amount, String paymentType, HttpServletRequest request) {
//查找已存在但未支付的订单
@@ -64,14 +68,28 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
// orderInfo.setProductId(amount);
// orderInfo.setTotalFee(Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount); // 元 HKD
orderInfo.setTotalFee(Float.parseFloat(CreditsEventsEnum.PRICE.getValue()) * amount); // 元 HKD
orderInfo.setOrderStatus(OrderStatusEnum.NOT_PAY.getType()); //未支付
orderInfo.setPaymentType(paymentType);
setIPLocation(paymentType, request, orderInfo);
baseMapper.insert(orderInfo);
return orderInfo;
}
public OrderInfo createOrderByProductId(Integer amount, String paymentType, ProductEnum product) {
private void setIPLocation(String paymentType, HttpServletRequest request, OrderInfo orderInfo) {
orderInfo.setOrderStatus(OrderStatusEnum.NOT_PAY.getType()); //未支付
orderInfo.setPaymentType(paymentType);
if (!Objects.isNull(request)){
String ipAddress = RequestInfoUtil.getIpAddress(request);
if (!StringUtil.isNullOrEmpty(ipAddress)) {
Map ipLocation = RequestInfoUtil.getIPLocation(ipAddress);
if (ipLocation != null && !ipLocation.get("status").equals("fail")) {
orderInfo.setCountry(ipLocation.get("country").toString());
orderInfo.setCity(ipLocation.get("city").toString());
orderInfo.setIpAddress(ipLocation.get("query").toString());
}
}
}
}
public OrderInfo createOrderByProductId(Integer amount, String paymentType, ProductEnum product, HttpServletRequest request) {
//获取商品信息
// Product product = productMapper.selectById(amount);
@@ -92,10 +110,8 @@ public class OrderInfoServiceImpl extends ServiceImpl<OrderInfoMapper, OrderInfo
// orderInfo.setProductId(amount);
// orderInfo.setTotalFee(Integer.parseInt(CreditsEventsEnum.PRICE.getValue()) * amount); // 元 HKD
orderInfo.setTotalFee((float) (product.getPrice() * amount)); // 元 HKD
orderInfo.setOrderStatus(OrderStatusEnum.NOT_PAY.getType()); //未支付
orderInfo.setPaymentType(paymentType);
setIPLocation(paymentType, request, orderInfo);
baseMapper.insert(orderInfo);
return orderInfo;
}

View File

@@ -84,17 +84,17 @@ public class PayPalCheckoutServiceImpl implements PayPalCheckoutService {
*/
@Override
@Transactional(rollbackFor = Exception.class)
public HashMap<String, String> createOrder(Integer amount, String returnUrl) throws SerializeException {
public HashMap<String, String> createOrder(Integer amount, String returnUrl, HttpServletRequest request) throws SerializeException {
// 生成订单
log.info("生成订单");
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.PAYPAL.getType());
OrderInfo orderInfo = orderInfoService.createOrderByProductId(amount, PayTypeEnum.PAYPAL.getType(), request);
OrdersCreateRequest request = new OrdersCreateRequest();
request.header("prefer", "return=representation");
request.requestBody(buildRequestBody(String.valueOf(orderInfo.getTotalFee()), returnUrl));
OrdersCreateRequest paypalRequest = new OrdersCreateRequest();
paypalRequest.header("prefer", "return=representation");
paypalRequest.requestBody(buildRequestBody(String.valueOf(orderInfo.getTotalFee()), returnUrl));
HttpResponse<Order> response = null;
try {
response = payPalClient.client(mode, clientId, clientSecret).execute(request);
response = payPalClient.client(mode, clientId, clientSecret).execute(paypalRequest);
} catch (Exception e) {
log.error("调用paypal订单创建失败失败原因 ===> {}", e.getMessage());
throw new BusinessException("Order creation failed");

View File

@@ -4,6 +4,7 @@ import com.ai.da.common.context.UserContext;
import com.ai.da.common.enums.PayTypeEnum;
import com.ai.da.common.response.PageBaseResponse;
import com.ai.da.mapper.primary.PaymentInfoMapper;
import com.ai.da.mapper.primary.entity.OrderInfo;
import com.ai.da.mapper.primary.entity.PaymentInfo;
import com.ai.da.model.dto.AlipayHKCallbackDTO;
import com.ai.da.model.dto.QueryPageByTimeDTO;
@@ -44,6 +45,9 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
@Resource
private StripeService stripeService;
@Resource
private OrderInfoService orderInfoService;
/**
* 记录支付日志:微信支付
* @param plainText
@@ -111,7 +115,13 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
Gson gson = new Gson();
String json = gson.toJson(params, HashMap.class);
paymentInfo.setContent(json);
// 获取订单信息
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
if (!Objects.isNull(orderByOrderNo)){
paymentInfo.setCountry(orderByOrderNo.getCountry());
paymentInfo.setCity(orderByOrderNo.getCity());
paymentInfo.setIpAddress(orderByOrderNo.getIpAddress());
}
baseMapper.insert(paymentInfo);
}
@@ -128,13 +138,19 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
paymentInfo.setPaymentType(PayTypeEnum.PAYPAL.getType());
paymentInfo.setTransactionId(order.id());
paymentInfo.setTradeState(order.status());
// todo 确认这里的数据单位是不是元
// 确认这里的数据单位是不是元
paymentInfo.setPayerTotal(totalAmountFloat);
Gson gson = new Gson();
String json = gson.toJson(order, Order.class);
paymentInfo.setContent(json);
// 获取订单信息
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(order.id());
if (!Objects.isNull(orderByOrderNo)){
paymentInfo.setCountry(orderByOrderNo.getCountry());
paymentInfo.setCity(orderByOrderNo.getCity());
paymentInfo.setIpAddress(orderByOrderNo.getIpAddress());
}
baseMapper.insert(paymentInfo);
}
@@ -164,7 +180,13 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
Gson gson = new Gson();
String json = gson.toJson(alipayHKCallbackDTO);
paymentInfo.setContent(json);
// 获取订单信息
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
if (!Objects.isNull(orderByOrderNo)){
paymentInfo.setCountry(orderByOrderNo.getCountry());
paymentInfo.setCity(orderByOrderNo.getCity());
paymentInfo.setIpAddress(orderByOrderNo.getIpAddress());
}
baseMapper.insert(paymentInfo);
}
@@ -186,7 +208,13 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
Gson gson = new Gson();
String json = gson.toJson(session);
paymentInfo.setContent(json);
// 获取订单信息
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderId);
if (!Objects.isNull(orderByOrderNo)){
paymentInfo.setCountry(orderByOrderNo.getCountry());
paymentInfo.setCity(orderByOrderNo.getCity());
paymentInfo.setIpAddress(orderByOrderNo.getIpAddress());
}
baseMapper.insert(paymentInfo);
}
@@ -228,7 +256,10 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
String type = invoice.getBillingReason().equals("subscription_create") ? "new" :
invoice.getBillingReason().equals("subscription_cycle") ? "renewal" : invoice.getBillingReason();
// 获取支付方式
Map<String, String> paymentMethod = stripeService.getPaymentMethodByInvoiceId(invoiceId);
// 获取订单信息
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
paymentInfo = new PaymentInfo();
paymentInfo.setOrderNo(orderNo);
@@ -246,7 +277,11 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
paymentInfo.setLast4(paymentMethod.get("last4"));
paymentInfo.setHostedInvoiceUrl(invoice.getHostedInvoiceUrl());
paymentInfo.setCreateTime(LocalDateTime.now());
if (!Objects.isNull(orderByOrderNo)){
paymentInfo.setCountry(orderByOrderNo.getCountry());
paymentInfo.setCity(orderByOrderNo.getCity());
paymentInfo.setIpAddress(orderByOrderNo.getIpAddress());
}
baseMapper.insert(paymentInfo);
}else {
paymentInfo.setTradeState(status);
@@ -298,9 +333,11 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
if (Objects.isNull(paymentInfo)){
Stripe.apiKey = privateKey;
String orderNo = charge.getDescription().replace("AiDA - ", "");
OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo);
Float divide = new BigDecimal(charge.getAmount()).divide(new BigDecimal(100), 2, RoundingMode.HALF_UP).floatValue();
paymentInfo = new PaymentInfo();
paymentInfo.setOrderNo(charge.getDescription().replace("AiDA - ", ""));
paymentInfo.setOrderNo(orderNo);
paymentInfo.setTransactionId(charge.getInvoice());
paymentInfo.setPaymentType(PayTypeEnum.STRIPE.getType());
paymentInfo.setTradeState(charge.getStatus());
@@ -309,6 +346,11 @@ public class PaymentInfoServiceImpl extends ServiceImpl<PaymentInfoMapper, Payme
paymentInfo.setPaymentMethod(paymentMethod);
paymentInfo.setLast4(last4);
paymentInfo.setCreateTime(LocalDateTime.now());
if (!Objects.isNull(orderByOrderNo)){
paymentInfo.setCountry(orderByOrderNo.getCountry());
paymentInfo.setCity(orderByOrderNo.getCity());
paymentInfo.setIpAddress(orderByOrderNo.getIpAddress());
}
baseMapper.insert(paymentInfo);
}else {
paymentInfo.setTradeState(charge.getStatus());