diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/config/DuanXinBaoSmsProperties.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/config/DuanXinBaoSmsProperties.java new file mode 100644 index 00000000..174f0c72 --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/config/DuanXinBaoSmsProperties.java @@ -0,0 +1,15 @@ + +package com.ruoyi.cai.config; + +import lombok.Data; +import org.springframework.boot.context.properties.ConfigurationProperties; +import org.springframework.stereotype.Component; + +@Data +@Component +@ConfigurationProperties(prefix = "duanxinbao.sms") +public class DuanXinBaoSmsProperties { + private String username; + private String password; + private String content; +} diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/DuanXinBaoSmsKit.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/DuanXinBaoSmsKit.java index e8876bb4..0b32a24e 100644 --- a/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/DuanXinBaoSmsKit.java +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/kit/DuanXinBaoSmsKit.java @@ -1,8 +1,16 @@ package com.ruoyi.cai.kit; import cn.hutool.core.util.RandomUtil; +import com.github.houbb.heaven.annotation.CommonEager; +import com.ruoyi.cai.config.AliSmsProperties; +import com.ruoyi.cai.config.DuanXinBaoSmsProperties; +import com.ruoyi.common.utils.StringUtils; +import lombok.Setter; import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; +import javax.annotation.PostConstruct; import java.io.BufferedReader; import java.io.InputStream; import java.io.InputStreamReader; @@ -14,6 +22,7 @@ import java.security.NoSuchAlgorithmException; import java.util.Objects; @Slf4j +@Component public class DuanXinBaoSmsKit { public static void main(String[] args) { @@ -21,9 +30,26 @@ public class DuanXinBaoSmsKit { log.info(s+""); } - private final static String USER_NAME = "huaxiang5201"; - private final static String TEST_PASSWORD = "qwe8848."; - private final static String CONTENT = "【花香app】您的验证码是%s。如非本人操作,请忽略本短信"; + @Autowired + @Setter + private DuanXinBaoSmsProperties config; + + @PostConstruct + public void init() { + if(StringUtils.isNotBlank(config.getPassword())){ + TEST_PASSWORD = config.getPassword(); + } + if(StringUtils.isNotBlank(config.getUsername())){ + USER_NAME = config.getUsername(); + } + if(StringUtils.isNotBlank(config.getContent())){ + CONTENT = config.getContent(); + } + } + + private static String USER_NAME = "huaxiang5201"; + private static String TEST_PASSWORD = "qwe8848."; + private static String CONTENT = "【花香app】您的验证码是%s。如非本人操作,请忽略本短信"; private final static String HTTP_URL = "http://api.smsbao.com/sms"; 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 b8d84118..dbaad4d6 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 @@ -84,6 +84,13 @@ public enum TrdPayTypeEnum { * [回调IP]: 142.171.122.90 */ V7("https://baihe.lhsifang.com","/api/pay/create","/api/pay/query","/api/pay/trd/notify/v7","success"), + /** + * 信息 + * 添加商户成功!商户ID:1013 + * 密钥:pswWIbqnwlTlBDbZUk4qTisKbjWl5D9e + * https://31.bghyvwk.cn + */ + V8("https://31.bghyvwk.cn","/api/pay/create","/api/pay/query","/api/pay/trd/notify/v8","success"), ; private final String gatewayUrl; private final String createOrderUrl; diff --git a/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV8Service.java b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV8Service.java new file mode 100644 index 00000000..0c29c52e --- /dev/null +++ b/ruoyi-cai/src/main/java/com/ruoyi/cai/trdpay/handle/PayTrdV8Service.java @@ -0,0 +1,150 @@ +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.utils.ServletUtils; +import com.ruoyi.system.domain.SysOperLog; +import lombok.extern.slf4j.Slf4j; +import org.apache.commons.lang3.StringUtils; +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.util.HashMap; +import java.util.Map; + +@Service +@Slf4j +public class PayTrdV8Service implements PayTrdService { + + @Autowired + private OrderLogsService orderLogsService; + @Autowired + private PayManager payManager; + + @Override + public TrdPayTypeEnum getType() { + return TrdPayTypeEnum.V8; + } + + + @Override + public PayReturnResp createOrderAli(PayOrderInfoDTO payOrderInfoDTO, PayTrdConfig payTrdConfig) { + TrdPayTypeEnum type = getType(); + RestTemplate rest = RestTemplateUtil.getNoSSLRest(); + Map params = new HashMap<>(); + params.put("pid", payTrdConfig.getMchId()); + params.put("method", "jump"); + params.put("device", "mobile"); + params.put("type", "alipay"); + params.put("out_trade_no", payOrderInfoDTO.getOrderNo()); + String notifyUrl = payTrdConfig.getNotifyUrl() + type.getNotifyPath(); + params.put("notify_url", notifyUrl); + params.put("return_url", ""); + params.put("name", payOrderInfoDTO.getSubject()); + params.put("money", payOrderInfoDTO.getPriceYuanStr()); + params.put("clientip", ServletUtils.getClientIP()); + params.put("timestamp", System.currentTimeMillis()/1000 + ""); + MultiValueMap map = PayMd5Util.createParamsOfMap(params, payTrdConfig.getSign()); + map.add("sign_type","MD5"); + String gatewayUrl = type.getGatewayUrl(); + if (StringUtils.isNotBlank(payTrdConfig.getGatewayUrl())) { + gatewayUrl = payTrdConfig.getGatewayUrl(); + } + 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); + orderLogsService.createAliPayLogs(payOrderInfoDTO.getOrderNo(), createOrderUrl+JSON.toJSONString(map), jsonObject, type); + if(jsonObject == null){ + log.error("第三方支付失败 V8 返回数据为空 url={} params={}",createOrderUrl,JSON.toJSONString(map)); + throw new ServiceException("调用支付失败"); + } + if(!"0".equals(jsonObject.getString("code"))){ + log.info("第三方支付失败 V8 统一支付失败失败 url={} params={} body={}, payTrdConfig={}, typeEnum={}", createOrderUrl,JSON.toJSONString(map), body, JSON.toJSONString(payTrdConfig), JSON.toJSONString(jsonObject)); + throw new ServiceException("调用支付失败"); + } + String payUrl = jsonObject.getString("pay_info"); + return PayReturnResp.createH5(payUrl); + } + + @Override + public NotifyResp getNotifyResp(Map sourceData) { + String mchOrderNo = sourceData.get("out_trade_no"); + String payOrderId = sourceData.get("api_trade_no"); + String status = sourceData.get("trade_status"); + NotifyResp resp = new NotifyResp(); + resp.setOrderNo(mchOrderNo); + resp.setTrdOrderNo(payOrderId); + resp.setPayTypeEnum(getType()); + resp.setSourceData(sourceData); + resp.setSuccess("TRADE_SUCCESS".equals(status)); + return resp; + } + + @Override + public JSONObject queryOrder(String orderNo, PayTrdConfig payTrdConfig) { + throw new ServiceException("V8不支持订单查询"); + /*TrdPayTypeEnum type = getType(); + Map params = new HashMap<>(); + params.put("merchantId", payTrdConfig.getMchId()); + params.put("merchantPayNo", orderNo); + String para = PayMd5Util.createParams(params,payTrdConfig.getSign()); + String gatewayUrl = type.getGatewayUrl(); + if(StringUtils.isNotBlank(payTrdConfig.getGatewayUrl())){ + gatewayUrl = payTrdConfig.getGatewayUrl(); + } + String queryOrderUrl = gatewayUrl + type.getQueryOrderUrl(); + String url = queryOrderUrl + "?" + para; + String body = RestTemplateUtil.getRest().getForEntity(url, String.class).getBody(); + JSONObject jsonObject = JSON.parseObject(body); + if(jsonObject == null){ + log.error("第三方支付查询失败 返回数据为空 URL={}",url); + throw new ServiceException("调用支付失败"); + } + log.info("第三方支付查询成功 V8 URL={}, body={}",url, body); + return jsonObject;*/ + } + + @Override + public JSONObject resetOrder(String orderNo, PayTrdConfig payTrdConfig, boolean updateData) { + throw new ServiceException("V8不支持订单查询"); + /*JSONObject jsonObject = this.queryOrder(orderNo,payTrdConfig); + if(!"SUCCESS".equals(jsonObject.getString("retCode"))){ + log.info("第三方支付失败 V8统一支付失败失败 orderNo={}, payTrdConfig={}", orderNo, JSON.toJSONString(payTrdConfig)); + throw new ServiceException("调用支付失败"); + } + Integer status = jsonObject.getInteger("status"); + if(status != null && status.equals(1)){ + String mchOrderNo = jsonObject.getString("mchOrderNo"); + String payOrderId = jsonObject.getString("payOrderId"); + String productId = jsonObject.getString("productId"); + Map objectJson = new HashMap<>(); + for (String key : jsonObject.keySet()) { + objectJson.put(key, jsonObject.getString(key)); + } + if(updateData){ + payManager.callBack(mchOrderNo,payOrderId,objectJson,"V8", PayTypeEnum.TRD); + } + } + return jsonObject;*/ + } + +}