diff --git a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java index 532934b0..2141aff7 100644 --- a/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java +++ b/src/main/java/com/ai/da/common/enums/CreditsEventsEnum.java @@ -7,10 +7,12 @@ import lombok.Getter; @Getter public enum CreditsEventsEnum { - PRICE("price","6"), +// PRICE("price","6"), + PRICE("price","1"),// for test // PRICE("price","0.1"), - BUY_CREDITS("Buy Credits","60"), +// BUY_CREDITS("Buy Credits","60"), + BUY_CREDITS("Buy Credits","10"),// for test REFUND("Refund","60"), // BUY_CREDITS("Buy Credits","10"), diff --git a/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java b/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java index 5f87110e..afa6497a 100644 --- a/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java +++ b/src/main/java/com/ai/da/common/utils/RequestInfoUtil.java @@ -1,7 +1,16 @@ package com.ai.da.common.utils; -import javax.servlet.http.HttpServletRequest; +import com.alibaba.fastjson.JSONObject; +import lombok.extern.slf4j.Slf4j; +import javax.servlet.http.HttpServletRequest; +import java.io.BufferedReader; +import java.io.InputStreamReader; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.Map; + +@Slf4j public class RequestInfoUtil { /** @@ -45,4 +54,58 @@ public class RequestInfoUtil { return ip; } + /** + * 免费 API 服务可能有请求频率限制,如果你需要处理大量 IP 地址,可能需要考虑使用付费服务或购买 IP 地理位置数据库。此外,始终要遵守 API 提供商的使用条款和隐私政策 + * @param ip + * @return + * { + * "query": "24.48.0.1", + * "status": "success", + * "country": "Canada", + * "countryCode": "CA", + * "region": "QC", + * "regionName": "Quebec", + * "city": "Montreal", + * "zip": "H1L", + * "lat": 45.6026, + * "lon": -73.5167, + * "timezone": "America/Toronto", + * "isp": "Le Groupe Videotron Ltee", + * "org": "Videotron Ltee", + * "as": "AS5769 Videotron Ltee" + * } + */ + public static Map getIPLocation(String ip) { +// String ip = "117.143.125.1"; // 替换为你想查询的 IP 地址 +// String ip = "194.5.48.180"; // 替换为你想查询的 IP 地址 + String apiURL = "http://ip-api.com/json/" + ip; + + try { + URL url = new URL(apiURL); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + conn.setRequestMethod("GET"); + conn.setRequestProperty("Accept", "application/json"); + + if (conn.getResponseCode() != 200) { + throw new RuntimeException("Failed : HTTP error code : " + conn.getResponseCode()); + } + + BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream())); + String output; + StringBuilder outputBuilder = new StringBuilder(); + System.out.println("Output from Server .... \n"); + while ((output = br.readLine()) != null) { + outputBuilder.append(output); + System.out.println(output); + } + conn.disconnect(); + Map map = JSONObject.parseObject(outputBuilder.toString(), Map.class); + log.info("map: {}", map); + return map; + } catch (Exception e) { + e.printStackTrace(); + } + return null; + } + } diff --git a/src/main/java/com/ai/da/controller/AliPayController.java b/src/main/java/com/ai/da/controller/AliPayController.java index b3a9c65b..90452b37 100644 --- a/src/main/java/com/ai/da/controller/AliPayController.java +++ b/src/main/java/com/ai/da/controller/AliPayController.java @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; import java.util.Map; @CrossOrigin @@ -22,11 +23,11 @@ public class AliPayController { @ApiOperation("统一收单下单并支付页面接口的调用") @PostMapping("/trade/page/pay/{amount}") - public Response tradePagePay(@PathVariable Integer amount, @RequestParam String returnUrl){ + public Response tradePagePay(@PathVariable Integer amount, @RequestParam String returnUrl, HttpServletRequest request){ log.info("统一收单下单并支付页面接口的调用"); //支付宝开放平台接受 request 请求对象后 // 会为开发者生成一个html 形式的 form表单,包含自动提交的脚本 - String formStr = aliPayService.tradeCreate(amount, returnUrl); + String formStr = aliPayService.tradeCreate(amount, returnUrl, request); //我们将form表单字符串返回给前端程序,之后前端将会调用自动提交脚本,进行表单的提交 //此时,表单会自动提交到action属性所指向的支付宝开放平台中,从而为用户展示一个支付页面 return Response.success(formStr); diff --git a/src/main/java/com/ai/da/controller/AlipayHKController.java b/src/main/java/com/ai/da/controller/AlipayHKController.java index 006c00b9..734a9d62 100644 --- a/src/main/java/com/ai/da/controller/AlipayHKController.java +++ b/src/main/java/com/ai/da/controller/AlipayHKController.java @@ -8,6 +8,7 @@ import lombok.extern.slf4j.Slf4j; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; @CrossOrigin @RestController @@ -21,8 +22,8 @@ public class AlipayHKController { @ApiOperation(value = "创建订单") @PostMapping(value = "/createOrder/{wallet}/{amount}") - public Response createOrder(@PathVariable Integer amount, @PathVariable String wallet) { - String order = alipayHKService.createOrder(amount, wallet); + public Response createOrder(@PathVariable Integer amount, @PathVariable String wallet, HttpServletRequest request) { + String order = alipayHKService.createOrder(amount, wallet, request); return Response.success(order); } diff --git a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java index 203da0e7..87648940 100644 --- a/src/main/java/com/ai/da/controller/PayPalCheckoutController.java +++ b/src/main/java/com/ai/da/controller/PayPalCheckoutController.java @@ -27,8 +27,8 @@ public class PayPalCheckoutController { @ApiOperation(value = "创建订单") @PostMapping(value = "/trade/{amount}") - public Response> createOrder(@PathVariable Integer amount, @RequestParam String returnUrl) throws SerializeException { - HashMap approvalUrl = payPalCheckoutService.createOrder(amount,returnUrl); + public Response> createOrder(@PathVariable Integer amount, @RequestParam String returnUrl, HttpServletRequest request) throws SerializeException { + HashMap approvalUrl = payPalCheckoutService.createOrder(amount, returnUrl, request); return Response.success(approvalUrl); } diff --git a/src/main/java/com/ai/da/controller/StripeController.java b/src/main/java/com/ai/da/controller/StripeController.java index 42ff382c..2cbbbf1f 100644 --- a/src/main/java/com/ai/da/controller/StripeController.java +++ b/src/main/java/com/ai/da/controller/StripeController.java @@ -33,8 +33,8 @@ public class StripeController { @ApiOperation("创建支付链接") @PostMapping("/createOrder") - public Response pay(@Valid @RequestBody ProductPurchaseDTO productPurchaseDTO) { - return Response.success(stripeService.pay(productPurchaseDTO)); + public Response pay(@Valid @RequestBody ProductPurchaseDTO productPurchaseDTO, HttpServletRequest request) { + return Response.success(stripeService.pay(productPurchaseDTO, request)); } @ApiOperation("支付通知") @@ -75,7 +75,7 @@ public class StripeController { stripeService.cancelSubscription(subscriptionId, reason); return Response.success("success"); } - @ApiOperation("临时 取消订阅") + /*@ApiOperation("临时 取消订阅") @GetMapping("/cancelSubscriptionTemp") public Response cancelSubscriptionTemp(@RequestParam String subscriptionId) { stripeService.cancelSubscriptionTemp(subscriptionId); @@ -110,12 +110,7 @@ public class StripeController { @GetMapping("/detachCustomerAllPaymentMethod") public Response detachCustomerAllPaymentMethod(@RequestParam String name, @RequestParam String email) { return Response.success(stripeService.detachCustomerAllPaymentMethod(name, email)); - } + }*/ - @ApiOperation("临时 获取ip") - @GetMapping("/getIp2") - public Response getIp2(HttpServletRequest request) { - return Response.success(stripeService.getIp2(request)); - } } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java index 04a9d894..15ae0cee 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/OrderInfo.java @@ -29,4 +29,10 @@ public class OrderInfo extends BaseEntity{ private byte isFirstSubscription = 0; private byte isCommissionCalculated = 0; + + private String ipAddress; + + private String country; + + private String city; } diff --git a/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java index d3533078..0c273d87 100644 --- a/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java +++ b/src/main/java/com/ai/da/mapper/primary/entity/PaymentInfo.java @@ -33,4 +33,10 @@ public class PaymentInfo extends BaseEntity{ // 发票托管页面 private String hostedInvoiceUrl; + + private String ipAddress; + + private String country; + + private String city; } diff --git a/src/main/java/com/ai/da/service/AliPayService.java b/src/main/java/com/ai/da/service/AliPayService.java index 66dd334d..300505bc 100644 --- a/src/main/java/com/ai/da/service/AliPayService.java +++ b/src/main/java/com/ai/da/service/AliPayService.java @@ -1,9 +1,10 @@ package com.ai.da.service; +import javax.servlet.http.HttpServletRequest; import java.util.Map; public interface AliPayService { - String tradeCreate(Integer amount,String returnUrl); + String tradeCreate(Integer amount,String returnUrl, HttpServletRequest request); String tradeNotify(Map params); diff --git a/src/main/java/com/ai/da/service/AlipayHKService.java b/src/main/java/com/ai/da/service/AlipayHKService.java index 13495fe2..51272bb1 100644 --- a/src/main/java/com/ai/da/service/AlipayHKService.java +++ b/src/main/java/com/ai/da/service/AlipayHKService.java @@ -2,9 +2,11 @@ package com.ai.da.service; import com.ai.da.model.dto.AlipayHKCallbackDTO; +import javax.servlet.http.HttpServletRequest; + public interface AlipayHKService { - String createOrder(Integer amount, String wallet); + String createOrder(Integer amount, String wallet, HttpServletRequest request); String callback(String paramString); diff --git a/src/main/java/com/ai/da/service/OrderInfoService.java b/src/main/java/com/ai/da/service/OrderInfoService.java index a420fe70..19264239 100644 --- a/src/main/java/com/ai/da/service/OrderInfoService.java +++ b/src/main/java/com/ai/da/service/OrderInfoService.java @@ -8,13 +8,14 @@ import com.ai.da.mapper.primary.entity.OrderInfo; import com.ai.da.model.dto.QueryPageByTimeDTO; import com.baomidou.mybatisplus.extension.service.IService; +import javax.servlet.http.HttpServletRequest; import java.util.List; public interface OrderInfoService extends IService { - OrderInfo createOrderByProductId(Integer productId, String paymentType); + OrderInfo createOrderByProductId(Integer productId, String paymentType, HttpServletRequest request); - OrderInfo createOrderByProductId(Integer amount, String paymentType, ProductEnum product); + OrderInfo createOrderByProductId(Integer amount, String paymentType, ProductEnum product, HttpServletRequest request); void saveCodeUrl(String orderNo, String codeUrl); diff --git a/src/main/java/com/ai/da/service/PayPalCheckoutService.java b/src/main/java/com/ai/da/service/PayPalCheckoutService.java index d9da17e4..ccf60e92 100644 --- a/src/main/java/com/ai/da/service/PayPalCheckoutService.java +++ b/src/main/java/com/ai/da/service/PayPalCheckoutService.java @@ -12,7 +12,7 @@ import java.util.Map; public interface PayPalCheckoutService { - HashMap createOrder(Integer amount,String returnUrl) throws SerializeException; + HashMap createOrder(Integer amount,String returnUrl, HttpServletRequest request) throws SerializeException; // String callback(@SuppressWarnings("rawtypes") Map map); diff --git a/src/main/java/com/ai/da/service/StripeService.java b/src/main/java/com/ai/da/service/StripeService.java index 4a2e78e1..008b615c 100644 --- a/src/main/java/com/ai/da/service/StripeService.java +++ b/src/main/java/com/ai/da/service/StripeService.java @@ -10,7 +10,7 @@ import java.util.Map; public interface StripeService { - String pay(ProductPurchaseDTO productPurchaseDTO); + String pay(ProductPurchaseDTO productPurchaseDTO, HttpServletRequest request); Boolean notify(HttpServletRequest request); @@ -48,5 +48,5 @@ public interface StripeService { String detachCustomerAllPaymentMethod(String name, String email); - String getIp2(HttpServletRequest request); +// Map getIp(HttpServletRequest request); } diff --git a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java index 04fc8993..a8bdf410 100644 --- a/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AliPayServiceImpl.java @@ -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()); diff --git a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java index 910129ef..fd01eae3 100644 --- a/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/AlipayHKServiceImpl.java @@ -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 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服务端 diff --git a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java index ae12e612..6c63b002 100644 --- a/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/OrderInfoServiceImpl.java @@ -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 createOrder(Integer amount, String returnUrl) throws SerializeException { + public HashMap 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 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"); diff --git a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java index 4e4d11b2..2d0f3e5c 100644 --- a/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/PaymentInfoServiceImpl.java @@ -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 paymentMethod = stripeService.getPaymentMethodByInvoiceId(invoiceId); + // 获取订单信息 + OrderInfo orderByOrderNo = orderInfoService.getOrderByOrderNo(orderNo); paymentInfo = new PaymentInfo(); paymentInfo.setOrderNo(orderNo); @@ -246,7 +277,11 @@ public class PaymentInfoServiceImpl extends ServiceImpl