diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/user/UserCountVo.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/user/UserCountVo.java index 5f483a8e..e45a869e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/user/UserCountVo.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/dto/app/vo/user/UserCountVo.java @@ -7,6 +7,14 @@ import lombok.Data; @Schema(description = "用户统计相关") public class UserCountVo { private Long userId; + /** + * 新增粉丝数 + */ + private Long newFansCount; + /** + * 新增访客数 + */ + private Long newVisitorCount; /** * 粉丝总数 */ diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java index 03c0f356..a06d96a3 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/TrdPayTypeEnum.java @@ -100,11 +100,27 @@ public enum TrdPayTypeEnum { * 989 支付宝 934 微信 */ V9("https://api.pay.wangwang888.cloud","/Pay_Index.html","/Pay_Trade_query.html","/api/pay/trd/notify/v9","OK"), + /** + * 商户对接信息 + * 商户后台:https://20.255.61.130/user + * 登录账号:pite + * 登录密码:abcd1234 + * 支付密码:f$4K4&dB + * 商户编号:10062 + * 对接密钥:dqer5b7rrr4d7g6uk61rjvviyt2b50rn + * 网关地址:https://20.255.61.130/ + * 通道编码:1 + * 回调IP:20.255.61.130 + * 用json的方式对接 + * pay_type=json + */ + V10("https://20.255.61.130","/Pay_Index.html","/Pay_Trade_query.html","/api/pay/trd/notify/v10","OK"), ; private final String gatewayUrl; private final String createOrderUrl; private final String queryOrderUrl; + @Deprecated private final String notifyPath; private final String notifyResp; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV10Service.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV10Service.java new file mode 100644 index 00000000..ea9d395f --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV10Service.java @@ -0,0 +1,146 @@ +package com.ruoyi.cai.trdpay.handle; + +import com.alibaba.fastjson2.JSON; +import com.alibaba.fastjson2.JSONObject; +import com.ruoyi.cai.domain.PayTrdConfig; +import com.ruoyi.cai.pay.PayManager; +import com.ruoyi.cai.pay.PayOrderInfoDTO; +import com.ruoyi.cai.pay.PayReturnResp; +import com.ruoyi.cai.service.OrderLogsService; +import com.ruoyi.cai.trdpay.PayMd5Util; +import com.ruoyi.cai.trdpay.PayTrdService; +import com.ruoyi.cai.trdpay.TrdPayTypeEnum; +import com.ruoyi.cai.trdpay.dto.NotifyResp; +import com.ruoyi.cai.util.RestTemplateUtil; +import com.ruoyi.common.exception.ServiceException; +import com.ruoyi.common.helper.LoginHelper; +import com.ruoyi.common.utils.ServletUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpEntity; +import org.springframework.http.HttpHeaders; +import org.springframework.http.MediaType; +import org.springframework.stereotype.Service; +import org.springframework.util.MultiValueMap; +import org.springframework.web.client.RestTemplate; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class PayTrdV10Service implements PayTrdService { + + @Autowired + private OrderLogsService orderLogsService; + @Autowired + private PayManager payManager; + + @Override + public TrdPayTypeEnum getType() { + return TrdPayTypeEnum.V10; + } + + @Override + public PayReturnResp createOrderAli(PayOrderInfoDTO payOrderInfoDTO, PayTrdConfig payTrdConfig,boolean wx) { + TrdPayTypeEnum type = getType(); + RestTemplate rest = RestTemplateUtil.getNoSSLRest(); + Map params = new HashMap<>(); + params.put("pay_memberid", payTrdConfig.getMchId()); + params.put("pay_orderid", payOrderInfoDTO.getOrderNo()); + params.put("pay_applydate", LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); + params.put("pay_bankcode", payTrdConfig.getProductId(wx)); + String notifyUrl = type.getNotifyUrl(payTrdConfig.getNotifyUrl(), wx); + params.put("pay_notifyurl", notifyUrl); + params.put("pay_amount", payOrderInfoDTO.getPriceYuanStr()); + MultiValueMap map = PayMd5Util.createParamsOfMap(params, payTrdConfig.getSign(), "pay_md5sign"); + map.add("pay_productname",payOrderInfoDTO.getBody()); + map.add("pay_ip", ServletUtils.getClientIP()); + map.add("pay_userid", LoginHelper.getUserId()+""); + map.add("pay_type", "json"); + String gatewayUrl = getGatewayUrl(payTrdConfig); + String createOrderUrl = gatewayUrl + type.getCreateOrderUrl(); + HttpHeaders headers = new HttpHeaders(); + headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED); + HttpEntity> request = new HttpEntity<>(map, headers); + String body = rest.postForObject(createOrderUrl, request, String.class); + JSONObject jsonObject = JSON.parseObject(body); + boolean success = checkSuccess(jsonObject); + orderLogsService.createAliPayLogs(payOrderInfoDTO.getOrderNo(), createOrderUrl+JSON.toJSONString(map), jsonObject, success, type, getStepName(wx)); + if(!success){ + log.info("第三方支付失败 V10 统一支付失败失败 url={} params={} body={}, payTrdConfig={}, typeEnum={}", createOrderUrl,JSON.toJSONString(map), body, JSON.toJSONString(payTrdConfig), JSON.toJSONString(jsonObject)); + throw new ServiceException("调用支付失败"); + } + String payUrl = jsonObject.getJSONObject("data").getString("payUrl"); + if(wx){ + return PayReturnResp.createH5(payUrl); + }else{ + return PayReturnResp.createApp(payUrl); + } + } + private boolean checkSuccess(JSONObject jsonObject) { + if(jsonObject == null){ + return false; + } + if(!"ok".equals(jsonObject.getString("status"))){ + return false; + } + return true; + } + + @Override + public NotifyResp getNotifyResp(Map sourceData) { + String mchOrderNo = sourceData.get("orderid"); + String payOrderId = sourceData.get("transaction_id"); + String status = sourceData.get("returncode"); + NotifyResp resp = new NotifyResp(); + resp.setOrderNo(mchOrderNo); + resp.setTrdOrderNo(payOrderId); + resp.setPayTypeEnum(getType()); + resp.setSourceData(sourceData); + resp.setSuccess("00".equals(status)); + return resp; + } + + @Override + public JSONObject queryOrder(String orderNo, PayTrdConfig payTrdConfig) { + RestTemplate rest = RestTemplateUtil.getRest(); + TrdPayTypeEnum type = getType(); + Map params = new HashMap<>(); + params.put("pay_memberid", payTrdConfig.getMchId()); + params.put("pay_orderid", orderNo); + MultiValueMap map = PayMd5Util.createParamsOfMap(params, payTrdConfig.getSign(), "pay_md5sign"); + String gatewayUrl = getGatewayUrl(payTrdConfig); + String queryOrderUrl = gatewayUrl + type.getQueryOrderUrl(); + String body = RestTemplateUtil.postFormData(rest, queryOrderUrl, map); + JSONObject jsonObject = JSON.parseObject(body); + if(jsonObject == null){ + log.error("第三方支付查询失败 返回数据为空 URL={} query={}",queryOrderUrl,JSON.toJSONString(map)); + throw new ServiceException("调用支付失败"); + } + log.info("第三方支付查询成功 V10 URL={}, query={}, body={}",queryOrderUrl,JSON.toJSONString(map), body); + return jsonObject; + } + + @Override + public JSONObject resetOrder(String orderNo, PayTrdConfig payTrdConfig, boolean updateData) { + JSONObject jsonObject = this.queryOrder(orderNo,payTrdConfig); + if(!"00".equals(jsonObject.getString("returncode"))){ + log.info("第三方支付失败 V10统一支付查询订单失败 orderNo={}, payTrdConfig={}", orderNo, JSON.toJSONString(payTrdConfig)); + throw new ServiceException("V10统一支付查询订单失败"); + } + String status = jsonObject.getString("trade_state"); + if("SUCCESS".equals(status)){ + if(updateData){ + Map params = new HashMap<>(); + params.put("str", "主动查询出来的结果"); + params.put("data", JSON.toJSONString(jsonObject)); + payManager.callBack(orderNo,null,params,"V10", null); + } + } + return jsonObject; + } + +}