Преглед на файлове

增加台币港币支付

zwhui преди 2 години
родител
ревизия
72fffda760
променени са 21 файла, в които са добавени 201 реда и са изтрити 16 реда
  1. 9 0
      netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java
  2. 10 0
      netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java
  3. 8 0
      netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java
  4. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java
  5. 3 0
      netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java
  6. 10 0
      netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java
  7. 9 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java
  8. 12 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java
  9. 12 0
      netflix-dao/src/main/java/com/cyksj/model/views/GoodsHomePageView.java
  10. 6 0
      netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java
  11. 7 0
      netflix-dao/src/main/java/com/cyksj/model/views/UserRecommendGoodsFrontView.java
  12. 8 1
      netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java
  13. 1 0
      netflix-service/src/main/java/com/cyksj/redis/RedisService.java
  14. 4 8
      netflix-service/src/main/java/com/cyksj/service/cryptomus/CryptomusService.java
  15. 1 0
      netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java
  16. 26 3
      netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java
  17. 6 3
      netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java
  18. 11 1
      netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java
  19. 7 0
      netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java
  20. 20 0
      netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java
  21. 28 0
      netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/GoodsDonSku.java

@@ -85,6 +85,15 @@ public class GoodsDonSku extends BaseEntity {
      */
     private BigDecimal price;
 
+    /**
+     * 台币
+     */
+    private BigDecimal twPrice;
+    /**
+     * 港币
+     */
+    private BigDecimal hkPrice;
+
     /**
      * 是否开启实物车票时长权益
      */

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/entity/OrderDon.java

@@ -51,6 +51,16 @@ public class OrderDon extends BaseEntity implements Serializable {
     /** 金额 */
     private BigDecimal money ;
 
+    /**
+     * 货币单位
+     */
+    private String currency;
+
+    /**
+     * 汇率
+     */
+    private BigDecimal rate;
+
     /**
      * 海外支付金额
      */

+ 8 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/request/ReqGoodsSkuInsert.java

@@ -55,6 +55,14 @@ public class ReqGoodsSkuInsert {
         private String tags;
 
         private BigDecimal price;
+        /**
+         * 台币
+         */
+        private BigDecimal twPrice;
+        /**
+         * 港币
+         */
+        private BigDecimal hkPrice;
 
         /**
          * 数量

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonBackView.java

@@ -93,6 +93,9 @@ public class OrderDonBackView {
 	@DbField("o.money")
 	private BigDecimal money;
 
+	@DbField("o.currency")
+	private String currency;
+
 	@DbField("o.balance")
 	private BigDecimal balance;
 

+ 3 - 0
netflix-dao/src/main/java/com/cyksj/model/manage/views/OrderDonView.java

@@ -76,6 +76,9 @@ public class OrderDonView {
     @DbField("o.money")
     private BigDecimal money;
 
+    @DbField("o.currency")
+    private String currency;
+
     @DbField("o.refund_money")
     @JsonIgnore
     private BigDecimal refundMoney;

+ 10 - 0
netflix-dao/src/main/java/com/cyksj/model/request/OrderPayRequest.java

@@ -36,6 +36,16 @@ public class OrderPayRequest {
     @NotNull(message = "请输入金额")
     private BigDecimal donMoney;
 
+    /**
+     * 货币单位
+     */
+    private String currency;
+
+    /**
+     * 汇率
+     */
+    private BigDecimal rate;
+
     /**
      * 推荐人id
      */

+ 9 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsDonSkuFrontView.java

@@ -73,6 +73,15 @@ public class GoodsDonSkuFrontView {
 	 */
 	private BigDecimal price;
 
+	/**
+	 * 台币
+	 */
+	private BigDecimal twPrice;
+	/**
+	 * 港币
+	 */
+	private BigDecimal hkPrice;
+
 	/**
 	 * 月数
 	 */

+ 12 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsFrontListView.java

@@ -76,6 +76,18 @@ public class GoodsFrontListView {
 	@DbField("g.min_price")
 	private BigDecimal price;
 
+	/**
+	 * 台币最低价格
+	 */
+	@DbIgnore
+	private BigDecimal twPrice;
+
+	/**
+	 * 港币最低价格
+	 */
+	@DbIgnore
+	private BigDecimal hkPrice;
+
 	/**
 	 * 最低规格月份
 	 */

+ 12 - 0
netflix-dao/src/main/java/com/cyksj/model/views/GoodsHomePageView.java

@@ -101,4 +101,16 @@ public class GoodsHomePageView {
 	 */
 	@DbIgnore
 	private String notifyMsg;
+
+	/**
+	 * 台币
+	 */
+	@DbIgnore
+	private BigDecimal twPrice;
+	/**
+	 * 港币
+	 */
+	@DbIgnore
+	private BigDecimal hkPrice;
+
 }

+ 6 - 0
netflix-dao/src/main/java/com/cyksj/model/views/RenewalView.java

@@ -44,6 +44,12 @@ public class RenewalView {
     @DbField("sku.price")
     private BigDecimal price;
 
+    @DbField("sku.tw_price")
+    private BigDecimal twPrice;
+
+    @DbField("sku.hk_price")
+    private BigDecimal hkPrice;
+
     @DbField("sku.spec_val")
     private String specVal;
 

+ 7 - 0
netflix-dao/src/main/java/com/cyksj/model/views/UserRecommendGoodsFrontView.java

@@ -1,5 +1,6 @@
 package com.cyksj.model.views;
 
+import com.ejlchina.searcher.bean.DbIgnore;
 import com.ejlchina.searcher.bean.SearchBean;
 import lombok.Getter;
 import lombok.Setter;
@@ -34,4 +35,10 @@ public class UserRecommendGoodsFrontView {
 	private Integer days;
 
 	private BigDecimal price;
+
+	@DbIgnore
+	private BigDecimal twPrice;
+
+	@DbIgnore
+	private BigDecimal hkPrice;
 }

+ 8 - 1
netflix-service/src/main/java/com/cyksj/common/EnvCommonService.java

@@ -26,6 +26,7 @@ public class EnvCommonService {
 
 	private static String port;
 
+	private static String api;
 	@Value(value = "${spring.profiles.active}")
 	private String env;
 
@@ -33,10 +34,16 @@ public class EnvCommonService {
 	private String domain;
 
 	public String getHost() {
-		port = EnvCommonService.active_prd.equals(getEnv()) ? "8081" : "8083";
+		port = getPort();
 		return domain;
 	}
+	public String getPort() {
+		return port = EnvCommonService.active_prd.equals(getEnv()) ? "8081" : "8083";
+	}
 
+	public String getApi() {
+		return api = EnvCommonService.active_prd.equals(getEnv()) ? "api" : "api2";
+	}
 	public String getDomain() {
 		return this.getHost().substring(0, this.getHost().indexOf(port));
 	}

+ 1 - 0
netflix-service/src/main/java/com/cyksj/redis/RedisService.java

@@ -631,6 +631,7 @@ public class RedisService {
         ORDER_COMMENT_KEY("order_comment_key:", "订单评价", 10l),
         USER_BIND_ACCOUNT_INFO_KEY("user_bind_account_info_key:", "用户绑定其他账号key", 10l),
         TASK_RECEIVED_KEY("task_received_key:%s:%s", "领取任务奖励key", 10l),
+        EXCHANGE_RATE_KEY("exchange_rate_key","当日汇率",60 * 60 * 4L),
         ;
 
         private String name;

+ 4 - 8
netflix-service/src/main/java/com/cyksj/service/cryptomus/CryptomusService.java

@@ -3,10 +3,7 @@ package com.cyksj.service.cryptomus;
 import cn.hutool.core.codec.Base64;
 import cn.hutool.crypto.digest.MD5;
 import cn.hutool.http.HttpRequest;
-import cn.hutool.json.JSONUtil;
-import com.alibaba.fastjson.JSONObject;
 import com.cyksj.common.exception.BusinessRuntimeException;
-import com.cyksj.common.util.Codec;
 import com.cyksj.common.util.Jsons;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.model.entity.OrderDon;
@@ -17,18 +14,16 @@ import com.cyksj.model.response.CryptomusPayRep;
 import com.cyksj.model.response.CryptomusRefundRep;
 import com.cyksj.model.response.CryptomusReturnRep;
 import com.cyksj.service.order.OrderDonService;
-import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.node.ObjectNode;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.bouncycastle.crypto.digests.MD5Digest;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import java.math.BigDecimal;
 import java.math.RoundingMode;
-import java.util.*;
+import java.util.Date;
 
 /**
  * @author zwhui
@@ -61,7 +56,8 @@ public class CryptomusService {
             throw new BusinessRuntimeException(GatewayApiCode.METADATA_SYSTEM_ERROR.getCode(),"The donation has been paid");
         }
         CryptomusPayReq cryptomusPay = new CryptomusPayReq();
-        cryptomusPay.setAmount(String.valueOf(orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_DOWN)));
+        BigDecimal money = orderDon.getMoney().divide(orderDon.getRate(),0,RoundingMode.HALF_UP);
+        cryptomusPay.setAmount(String.valueOf(money.divide(new BigDecimal(100), 2, RoundingMode.HALF_DOWN)));
         cryptomusPay.setCurrency("USD");
         cryptomusPay.setLifetime(1800);
         cryptomusPay.setOrder_id(orderId.toString());
@@ -70,7 +66,7 @@ public class CryptomusService {
         cryptomusPay.setIs_payment_multiple(true);
         String json = Jsons.toJson(cryptomusPay);
         String result = HttpRequest.post("https://api.cryptomus.com/v1/payment").header("merchant", shopId).header("sign", MD5.create().digestHex(Base64.encode(json) + shopKey)).body(json).execute().body();
-
+        log.info("加密货币支付 result:{}",result);
         return Jsons.parseObject(result, CryptomusPayRep.class).getResult().getUrl();
     }
 

+ 1 - 0
netflix-service/src/main/java/com/cyksj/service/mange/impl/CmsOrderDonServiceImpl.java

@@ -601,6 +601,7 @@ public class CmsOrderDonServiceImpl extends ServiceImpl<OrderDonMapper,OrderDon>
             if (OrderDon.Type.BALANCE != orderDon.getType() && refundMoney.compareTo(money) > 0) {
                 throw BusinessRuntimeException.getInstance("退款余额大于订单支付金额");
             }
+            refundMoney = refundMoney.divide(orderDon.getRate(),0,RoundingMode.HALF_UP);
             orderDon.setRefundBalance(refundMoney);
             orderDon.setRefundMoney(BigDecimal.ZERO);
         } else {

+ 26 - 3
netflix-service/src/main/java/com/cyksj/service/order/impl/OrderDonServiceImpl.java

@@ -265,7 +265,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 
 		orderDon.setMoney(payRequest.getDonMoney());
 		orderDon.setRealMoney(payRequest.getDonMoney());
-
+		//未传货币单元 默认美元
+		orderDon.setCurrency(Optional.ofNullable(payRequest.getCurrency()).orElse("USD"));
+		orderDon.setRate(payRequest.getRate());
 		List<Long> dpSkuIds = payRequest.getDpSkuIds();
 		if (CollUtil.isNotEmpty(dpSkuIds)) {
 			if (dpSkuIds.size() > 1) {
@@ -349,6 +351,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			});
 		}
 		orderDon.setPayTitle(payTitle.toString());
+		if ("TWD".equals(payRequest.getCurrency())){
+			orderDon.setMoney(orderDon.getMoney().setScale(-2, RoundingMode.HALF_UP));
+		}
 		this.saveOrUpdate(orderDon);
 
 		if (orderDon.getIsDp()) {
@@ -763,13 +768,25 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 
 		String payOpenId = user.getOpenId();
+		BigDecimal price = sku.getPrice();
+		if ("TWD".equals(payRequest.getCurrency())){
+			price = sku.getTwPrice();
+		}else if ("HKD".equals(payRequest.getCurrency())){
+			price = sku.getHkPrice();
+		}
+
+		if (price.compareTo(BigDecimal.ZERO) == 0){
+			price = sku.getPrice().multiply(payRequest.getRate());
+		}
 
 		/* 生成订单 */
 		String donNo = SEQUENCE.nextId().toString();
 		OrderDon orderDon = new OrderDon();
 		orderDon.setOrderNo(donNo);
 		orderDon.setOpenId(payOpenId);
-		orderDon.setMoney(sku.getPrice().multiply(BigDecimal.valueOf(payRequest.getNum())));
+		orderDon.setMoney(price.multiply(BigDecimal.valueOf(payRequest.getNum())));
+		orderDon.setCurrency(payRequest.getCurrency());
+		orderDon.setRate(payRequest.getRate());
 		orderDon.setSkuId(renewSkuId);
 		orderDon.setRelationId(relation.getId());
 		//续费订单
@@ -796,7 +813,10 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 		}
 		orderDon.setRealMoney(orderDon.getMoney());
 		//扣除使用优惠券、余额的订单金额
-		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, sku.getPrice(), goodsDon.getType());
+		deductOrderMoney(orderDon, couponUser, payRequest.getBalance(), user, price, goodsDon.getType());
+		if ("TWD".equals(payRequest.getCurrency())){
+			orderDon.setMoney(orderDon.getMoney().setScale(-2, RoundingMode.HALF_UP));
+		}
 		this.saveOrUpdate(orderDon);
 		//订单金额为0 且订单为已完成 更新虚物车票
 		if (orderDon.getMoney().compareTo(BigDecimal.ZERO) == 0) {
@@ -1979,6 +1999,9 @@ public class OrderDonServiceImpl extends ServiceImpl<OrderDonMapper, OrderDon> i
 			}
 			BigDecimal userBalance = user.getBalance();
 			//扣除余额 是否成功
+			if (!"USD".equals(orderDon.getCurrency())){
+				subBalance = subBalance.divide(orderDon.getRate(),0,RoundingMode.HALF_UP);
+			}
 			Integer success = userMapper.deductBalance(user.getId(), subBalance, userBalance);
 			if (success != 1) throw BusinessRuntimeException.getInstance(I18nMessageUtil.getI18nMsg("user_balance_not_enough"));
 			orderDon.setBalance(subBalance);

+ 6 - 3
netflix-service/src/main/java/com/cyksj/service/paypal/PayPalService.java

@@ -1,5 +1,6 @@
 package com.cyksj.service.paypal;
 
+import com.cyksj.common.EnvCommonService;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.task.GlobalThreadPoolTaskExecutor;
 import com.cyksj.common.util.Jsons;
@@ -44,6 +45,8 @@ public class PayPalService{
 
     private final RedisService redisService;
 
+    private final EnvCommonService envCommonService;
+
 
     private static final String SANDBOX_URL = "https://api-m.sandbox.paypal.com";
     private static final String LIVE_URL = "https://api-m.paypal.com";
@@ -125,7 +128,7 @@ public class PayPalService{
         RedirectUrls redirectUrls = new RedirectUrls();
 
         redirectUrls.setCancelUrl(paypalPayConfig.getCancelUrl());
-        String returnUrl = "https://" + paypalPayConfig.getHost() + "/8081/api/applets/order/paypal/notify";
+        String returnUrl = "https://" + paypalPayConfig.getHost() + "/"+envCommonService.getPort()+"/"+envCommonService.getApi()+"/applets/order/paypal/notify";
         //成功回调地址(自己写的/pay/success)
         redirectUrls.setReturnUrl(returnUrl);
 
@@ -135,7 +138,7 @@ public class PayPalService{
 
         //订单价格
         Amount amount = new Amount();
-        amount.setCurrency("USD");
+        amount.setCurrency(orderDon.getCurrency());
         // 支付的总价,paypal会校验 total = subTotal + tax + ...
         BigDecimal totalMoney = orderDon.getMoney().divide(new BigDecimal(100), 2, RoundingMode.HALF_DOWN);
         amount.setTotal(totalMoney.toString());
@@ -190,7 +193,7 @@ public class PayPalService{
         APIContext apiContext = getAPIContext(paypalPayConfig.getClientId(), paypalPayConfig.getClientSecret(),paypalPayConfig.getMode());
         Sale sale = Sale.get(apiContext, orderDon.getTransactionId());
         Refund refund = new Refund();
-        refund.setAmount(new Amount("USD", net.divide(new BigDecimal(100),2,RoundingMode.HALF_DOWN).toString()));
+        refund.setAmount(new Amount(orderDon.getCurrency(), net.divide(new BigDecimal(100),2,RoundingMode.HALF_DOWN).toString()));
         refund = sale.refund(apiContext, refund);
         log.info("paypal return refund:{}",refund);
         if (!"completed".equals(refund.getState())) {

+ 11 - 1
netflix-web/src/main/java/com/cyksj/web/controller/goods/GoodsDonController.java

@@ -152,13 +152,18 @@ public class GoodsDonController {
         DateTime now = DateTime.now();
         list.forEach(data -> {
             data.setSpecs(beanSearcher.searchFirst(GoodsDonSpec.class, MapUtils.builder().field(GoodsDonSpec::getGoodsId, data.getId()).build()));
-            data.setSkuList(beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, data.getId()).field(GoodsDonSkuFrontView::getStatus, true).orderBy(GoodsDonSkuFrontView::getPrice).asc().build()));
+            List<GoodsDonSkuFrontView> skuList = beanSearcher.searchAll(GoodsDonSkuFrontView.class, MapUtils.builder().field(GoodsDonSkuFrontView::getGoodsId, data.getId()).field(GoodsDonSkuFrontView::getStatus, true).orderBy(GoodsDonSkuFrontView::getPrice).asc().build());
+            data.setSkuList(skuList);
             data.getSkuList().forEach(sku -> {
                 if (sku.getIsDp()) {
                     List<GoodsDiscountPlusPurchaseRelationFrontView> dpSkuViews = beanSearcher.searchAll(GoodsDiscountPlusPurchaseRelationFrontView.class, MapUtils.builder().field(GoodsDiscountPlusPurchaseRelationFrontView::getSkuId, sku.getId()).build());
                     sku.setDpSkuViews(dpSkuViews);
                 }
             });
+            if (!skuList.isEmpty()) {
+                data.setTwPrice(skuList.get(0).getTwPrice());
+                data.setHkPrice(skuList.get(0).getHkPrice());
+            }
             Integer sold = orderDonMapper.selectCount(Wrappers.lambdaQuery(OrderDon.class)
                     .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
             data.setSold(sold + data.getVirtualSold());
@@ -205,6 +210,11 @@ public class GoodsDonController {
                     .eq(OrderDon::getGoodsId, data.getId()).notIn(OrderDon::getStatus, Constant.noOrderStatus));
             data.setSold(sold + data.getVirtualSold());
             data.setNotifyMsg(getPayMsgTime(data.getId(), now, 1));
+            List<GoodsDonSku> skuList = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.builder().field(GoodsDonSku::getGoodsId, data.getId()).field(GoodsDonSku::getStatus, true).orderBy(GoodsDonSku::getPrice).asc().build());
+            if (!skuList.isEmpty()) {
+                data.setTwPrice(skuList.get(0).getTwPrice());
+                data.setHkPrice(skuList.get(0).getHkPrice());
+            }
         });
         redisService.setNx(h5CacheKey, dataList, RedisService.key.YH_HOME_PAGHE_CACHE.getTimeout());
         return GatewayResponse.SUCCESS.newBuilder().toResult(dataList);

+ 7 - 0
netflix-web/src/main/java/com/cyksj/web/controller/group/GroupRelationController.java

@@ -509,6 +509,13 @@ public class GroupRelationController {
             }
         }
         Page<UserRecommendGoodsFrontView> page = groupRelationFrontService.getRecommendGoodsViews(isPayNf, filter_goods_id, start, limit);
+        page.getRecords().forEach(data -> {
+            List<GoodsDonSku> skuList = beanSearcher.searchAll(GoodsDonSku.class, MapUtils.builder().field(GoodsDonSku::getGoodsId, data.getGoodsId()).field(GoodsDonSku::getStatus, true).orderBy(GoodsDonSku::getPrice).asc().build());
+            if (!skuList.isEmpty()) {
+                data.setTwPrice(skuList.get(0).getTwPrice());
+                data.setHkPrice(skuList.get(0).getHkPrice());
+            }
+        });
         return GatewayResponse.SUCCESS.newBuilder().toResult(page);
     }
 }

+ 20 - 0
netflix-web/src/main/java/com/cyksj/web/controller/manage/AdminController.java

@@ -5,6 +5,7 @@ import cn.hutool.core.date.DateTime;
 import cn.hutool.core.date.DateUtil;
 import cn.hutool.core.lang.Validator;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
@@ -18,6 +19,7 @@ import com.cyksj.mapper.PhoneCodeMapper;
 import com.cyksj.model.entity.PhoneCode;
 import com.cyksj.model.manage.dto.AdminInfo;
 import com.cyksj.model.manage.entity.Admin;
+import com.cyksj.redis.RedisService;
 import com.cyksj.service.mail.MailService;
 import com.cyksj.service.mange.AdminService;
 import lombok.RequiredArgsConstructor;
@@ -52,6 +54,8 @@ public class AdminController {
 
     private final MailService mailService;
 
+    private final RedisService redisService;
+
     private static final List<String> SEND_LIST = List.of(
             "1935822056@qq.com",
             "598488687@qq.com",
@@ -293,4 +297,20 @@ public class AdminController {
         return result;
     }
 
+
+
+    /**
+     * 获取当日汇率
+     */
+    @GetMapping("/latest/exchangerate")
+    public Result<String> latestExchangerate() {
+        String url = "https://api.exchangerate-api.com/v4/latest/USD";
+        String exchangeRate = redisService.getStr(RedisService.key.EXCHANGE_RATE_KEY.getName());
+        if (StrUtil.isBlank(exchangeRate)) {
+            exchangeRate = HttpUtil.get(url);
+            redisService.set(RedisService.key.EXCHANGE_RATE_KEY.getName(),exchangeRate);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(exchangeRate);
+    }
+
 }

+ 28 - 0
netflix-web/src/main/java/com/cyksj/web/controller/user/UserController.java

@@ -3,10 +3,13 @@ package com.cyksj.web.controller.user;
 import cn.hutool.core.date.DateTime;
 import cn.hutool.core.util.ObjectUtil;
 import cn.hutool.core.util.StrUtil;
+import cn.hutool.extra.servlet.ServletUtil;
+import cn.hutool.http.HttpUtil;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.cyksj.common.annotation.NoSubmit;
 import com.cyksj.common.exception.BusinessRuntimeException;
 import com.cyksj.common.i18n.I18nMessageUtil;
+import com.cyksj.common.util.StringUtil;
 import com.cyksj.dto.Result;
 import com.cyksj.enums.GatewayApiCode;
 import com.cyksj.enums.GatewayResponse;
@@ -22,6 +25,7 @@ import com.cyksj.model.request.UserReq;
 import com.cyksj.model.request.WorkOrderReq;
 import com.cyksj.model.response.UserAuthLoginResp;
 import com.cyksj.model.views.*;
+import com.cyksj.redis.RedisService;
 import com.cyksj.service.corp.CropChatService;
 import com.cyksj.service.exchange.ExchangeCodeService;
 import com.cyksj.service.order.UserRealOrderBenefitsService;
@@ -75,6 +79,8 @@ public class UserController {
 
     private final UserPageLanguageMapper userPageLanguageMapper;
 
+    private final RedisService redisService;
+
     @GetMapping(value = "/wx/whoami")
     public Result<UserWhoami> whoami() {
         long userId = StpUserUtil.getLoginIdAsLong();
@@ -390,4 +396,26 @@ public class UserController {
         });
         return GatewayResponse.SUCCESS.newBuilder().toResult();
     }
+
+    /**
+     * 查询用户ip地址
+     */
+    @GetMapping("/get/ip")
+    public Result<String> getUserIp(){
+        return GatewayResponse.SUCCESS.newBuilder().toResult(HttpUtil.get("http://whois.pconline.com.cn/ipJson.jsp?ip=" + ServletUtil.getClientIP(request) + "&json=true"));
+    }
+
+    /**
+     * 获取当日汇率
+     */
+    @GetMapping("/latest/exchangerate")
+    public Result<String> latestExchangerate() {
+        String url = "https://api.exchangerate-api.com/v4/latest/USD";
+        String exchangeRate = redisService.getStr(RedisService.key.EXCHANGE_RATE_KEY.getName());
+        if (StrUtil.isBlank(exchangeRate)) {
+            exchangeRate = HttpUtil.get(url);
+            redisService.set(RedisService.key.EXCHANGE_RATE_KEY.getName(),exchangeRate);
+        }
+        return GatewayResponse.SUCCESS.newBuilder().toResult(exchangeRate);
+    }
 }