From 6a861305d648716c77ac3ddadf0b867d3324e97f Mon Sep 17 00:00:00 2001 From: xupei Date: Tue, 7 Jan 2025 11:07:49 +0800 Subject: [PATCH 1/2] =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E8=B4=AD=E4=B9=B0=E7=9A=84=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AFip=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/common/enums/CreditsEventsEnum.java | 6 +- .../ai/da/common/utils/RequestInfoUtil.java | 65 ++++++++++++++++++- .../ai/da/controller/AliPayController.java | 5 +- .../ai/da/controller/AlipayHKController.java | 5 +- .../controller/PayPalCheckoutController.java | 4 +- .../ai/da/controller/StripeController.java | 13 ++-- .../da/mapper/primary/entity/OrderInfo.java | 6 ++ .../da/mapper/primary/entity/PaymentInfo.java | 6 ++ .../java/com/ai/da/service/AliPayService.java | 3 +- .../com/ai/da/service/AlipayHKService.java | 4 +- .../com/ai/da/service/OrderInfoService.java | 5 +- .../ai/da/service/PayPalCheckoutService.java | 2 +- .../java/com/ai/da/service/StripeService.java | 4 +- .../ai/da/service/impl/AliPayServiceImpl.java | 17 ++--- .../da/service/impl/AlipayHKServiceImpl.java | 5 +- .../da/service/impl/OrderInfoServiceImpl.java | 32 ++++++--- .../impl/PayPalCheckoutServiceImpl.java | 12 ++-- .../service/impl/PaymentInfoServiceImpl.java | 56 ++++++++++++++-- src/main/resources/payment.properties | 20 +++--- 19 files changed, 204 insertions(+), 66 deletions(-) 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 Date: Tue, 7 Jan 2025 11:09:22 +0800 Subject: [PATCH 2/2] =?UTF-8?q?=E8=A7=A3=E6=9E=90=E6=89=80=E6=9C=89?= =?UTF-8?q?=E5=8F=91=E8=B5=B7=E8=B4=AD=E4=B9=B0=E7=9A=84=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AFip=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../ai/da/service/impl/StripeServiceImpl.java | 127 +++--------------- 1 file changed, 17 insertions(+), 110 deletions(-) diff --git a/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java b/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java index a1c15a47..f4699890 100644 --- a/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java +++ b/src/main/java/com/ai/da/service/impl/StripeServiceImpl.java @@ -5,7 +5,6 @@ import com.ai.da.common.constant.CommonConstant; import com.ai.da.common.context.UserContext; import com.ai.da.common.enums.*; import com.ai.da.common.utils.DateUtil; -import com.ai.da.common.utils.RequestInfoUtil; import com.ai.da.common.utils.SendEmailUtil; import com.ai.da.mapper.primary.AccountMapper; import com.ai.da.mapper.primary.PaymentInfoMapper; @@ -18,7 +17,6 @@ import com.ai.da.model.dto.ProductPurchaseDTO; import com.ai.da.model.dto.SubscriptionEmailParamsDTO; import com.ai.da.service.*; import com.alibaba.fastjson.JSON; -import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.google.gson.Gson; @@ -38,12 +36,8 @@ import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; -import java.io.BufferedReader; -import java.io.InputStreamReader; import java.math.BigDecimal; import java.math.RoundingMode; -import java.net.HttpURLConnection; -import java.net.URL; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneOffset; @@ -85,7 +79,7 @@ public class StripeServiceImpl implements StripeService { @Override @Transactional(rollbackFor = Exception.class) - public String pay(ProductPurchaseDTO productPurchaseDTO) { + public String pay(ProductPurchaseDTO productPurchaseDTO, HttpServletRequest request) { Stripe.apiKey = privateKey; ProductEnum productEnum; @@ -102,9 +96,9 @@ public class StripeServiceImpl implements StripeService { case "Year": productEnum = ProductEnum.AnnualSubscription; break; - case "Day": + /*case "Day": productEnum = ProductEnum.DailySubscription; - break; + break;*/ default: throw new BusinessException("unknown subscription type"); } @@ -113,7 +107,8 @@ public class StripeServiceImpl implements StripeService { throw new BusinessException("unknown product type"); } log.info("生成订单"); - OrderInfo orderInfo = orderInfoService.createOrderByProductId(productPurchaseDTO.getQuantity(), PayTypeEnum.STRIPE.getType(), productEnum); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(productPurchaseDTO.getQuantity(), + PayTypeEnum.STRIPE.getType(), productEnum, request); String payType; if (productPurchaseDTO.getAutoRenewal()){ payType = "recurring"; @@ -356,7 +351,6 @@ public class StripeServiceImpl implements StripeService { // 发送续订失败邮件 response = sendRenewalFailEmail(invoice.getId(), null, paymentInfo.getOrderNo()); } - } }else if (stripeObject instanceof Charge) { Charge charge = (Charge) stripeObject; @@ -1005,12 +999,11 @@ public class StripeServiceImpl implements StripeService { } } - // todo 新建一个订阅 使用不会成功的付款方式 - + // 新建一个订阅 使用不会成功的付款方式(仅供测试使用) public String createSubscriptionTemp(String name, String email){ Stripe.apiKey = privateKey; try { - OrderInfo orderInfo = orderInfoService.createOrderByProductId(1, PayTypeEnum.STRIPE.getType(), ProductEnum.DailySubscription); + OrderInfo orderInfo = orderInfoService.createOrderByProductId(1, PayTypeEnum.STRIPE.getType(), ProductEnum.DailySubscription, null); // String customerId = getCustomer(name, email); String paymentMethodCode = "pm_card_mastercard"; @@ -1030,8 +1023,7 @@ public class StripeServiceImpl implements StripeService { .setInvoiceSettings( CustomerUpdateParams.InvoiceSettings.builder() .setDefaultPaymentMethod(paymentMethod.getId()) - .build() - ) + .build()) .build(); updatedCustomer.update(params); @@ -1041,8 +1033,7 @@ public class StripeServiceImpl implements StripeService { .addItem( SubscriptionCreateParams.Item.builder() .setPrice("price_1QFXkf02n1TEydyNtA4TQ3Yz") // 替换为实际的价格 ID - .build() - ) + .build()) .setDescription("AiDA - " + orderInfo.getOrderNo()) .build(); Subscription subscription = Subscription.create(subscriptionParams); @@ -1151,96 +1142,12 @@ public class StripeServiceImpl implements StripeService { } } - public String getIp2(HttpServletRequest request) { - /*String ip = request.getHeader("X-Forwarded-For"); - String ipAddress = ""; - if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){ - //多次反向代理后会有多个ip值,第一个ip才是真实ip - int index = ip.indexOf(","); - if(index != -1){ - ipAddress = ip.substring(0,index); - }else{ - ipAddress = ip; - } - } - ip = request.getHeader("X-Real-IP"); - if(StringUtils.isNotEmpty(ip) && !"unKnown".equalsIgnoreCase(ip)){ - ipAddress = ip; - } - if (!StringUtil.isNullOrEmpty(ipAddress)) { - getIPLocation(ipAddress); - }*/ - String ipAddress = RequestInfoUtil.getIpAddress(request); - if (!StringUtil.isNullOrEmpty(ipAddress)) { - return getIPLocation(ipAddress); - } - - return request.getRemoteAddr(); - } - - /* 免费 API 服务可能有请求频率限制,如果你需要处理大量 IP 地址,可能需要考虑使用付费服务或购买 IP 地理位置数据库。此外,始终要遵守 API 提供商的使用条款和隐私政策。*/ - - public String 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 JSON.toJSONString(map); - } catch (Exception e) { - e.printStackTrace(); - } - return null; - } - - public static void main(String[] args) { - 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; - System.out.println("Output from Server .... \n"); - StringBuilder outputBuilder = new StringBuilder(); - 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); - } catch (Exception e) { - e.printStackTrace(); - } - } +// public String getIp(HttpServletRequest request) { +// String ipAddress = RequestInfoUtil.getIpAddress(request); +// if (!StringUtil.isNullOrEmpty(ipAddress)) { +// return getIPLocation(ipAddress); +// } +// +// return request.getRemoteAddr(); +// } }