diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/CaseApplicationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/CaseApplicationController.java index 1ccaea8..d120476 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/CaseApplicationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/CaseApplicationController.java @@ -3,7 +3,6 @@ package com.ruoyi.web.controller.wisdomarbitrate; import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; -import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.page.TableDataInfo; import com.ruoyi.common.enums.BusinessType; import com.ruoyi.common.utils.SecurityUtils; @@ -18,7 +17,6 @@ import org.springframework.web.bind.annotation.*; import java.util.List; -import static com.ruoyi.common.core.domain.AjaxResult.error; @RestController diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 71fea1e..00240c2 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -126,6 +126,19 @@ javax.servlet-api + + org.projectlombok + lombok + 1.18.22 + + + + + com.tencentcloudapi + tencentcloud-sdk-java + 3.1.270 + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java new file mode 100644 index 0000000..d84faab --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SmsUtils.java @@ -0,0 +1,66 @@ +package com.ruoyi.common.utils; + +import com.tencentcloudapi.common.Credential; +import com.tencentcloudapi.common.exception.TencentCloudSDKException; +import com.tencentcloudapi.sms.v20210111.SmsClient; +import com.tencentcloudapi.sms.v20210111.models.SendSmsResponse; +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import lombok.var; + +import java.util.Objects; + +@Slf4j +public class SmsUtils { + private static final String SDK_APP_ID = "应用id"; + private static final String SECRET_ID = "API的SecretId"; + private static final String SECRET_KEY = "API的SecretKey"; + private static final String SIGN_NAME = "签名内容"; + public static Boolean sendSms(SendSmsRequest request) { + Credential cred = new Credential(SECRET_ID,SECRET_KEY); + SmsClient client = new SmsClient(cred, "ap-guangzhou"); + + final var req = new com.tencentcloudapi.sms.v20210111.models.SendSmsRequest(); + req.setPhoneNumberSet(new String[]{"+86" + request.getPhone()}); + req.setSmsSdkAppId(SDK_APP_ID); + req.setSignName(SIGN_NAME); + req.setTemplateId(request.getTemplateId()); + req.setTemplateParamSet(request.getTemplateParamSet()); + + SendSmsResponse res = null; + try { + res = client.SendSms(req); + } catch (TencentCloudSDKException e) { + log.error("发送短信出错:", e); + return Boolean.FALSE; + } + log.error("发送短信结果:", SendSmsResponse.toJsonString(res)); + + if (Objects.nonNull(res.getSendStatusSet()) && res.getSendStatusSet().length > 0 && "Ok".equals(res.getSendStatusSet()[0].getCode())){ + return Boolean.TRUE; + } + return Boolean.FALSE; + } + + /** + * 参数对象 + */ + @Data + public static class SendSmsRequest { + /** + * 电话 + */ + private String phone; + + /** + * 模板 ID: 必须填写已审核通过的模板 ID + */ + private String templateId; + + /** + * 模板参数: 模板参数的个数需要与 TemplateId 对应模板的变量个数保持一致,若无模板参数,则设置为空 + */ + private String[] templateParamSet; + + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/CasePaymentRecord.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/CasePaymentRecord.java new file mode 100644 index 0000000..f35b9ed --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/CasePaymentRecord.java @@ -0,0 +1,33 @@ +package com.ruoyi.wisdomarbitrate.domain; + +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.common.core.domain.BaseEntity; +import lombok.Data; + +import java.util.Date; + +@Data +public class CasePaymentRecord extends BaseEntity { + private static final long serialVersionUID = 1L; + /** + * 主键 + */ + private Integer id; + /** + * 案件id + */ + private Long caseId; + /** + * 订单号 + */ + private String orderNumber; + /** + * 支付状态(0未支付,1已支付) + */ + private Integer paymentStatus; + /** + * 支付时间 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date paymentTime; +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/dto/CasePayDTO.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/dto/CasePayDTO.java index 8f2f20d..a58518b 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/dto/CasePayDTO.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/domain/dto/CasePayDTO.java @@ -1,14 +1,25 @@ package com.ruoyi.wisdomarbitrate.domain.dto; import lombok.Data; - /** * 案件缴费传入参数 */ @Data public class CasePayDTO { - private int totalFee; //订单金额 单位:分 - private String body;//商品描述 + /** + * 案件id + */ + private Long caseId; + + /** + * 订单金额 单位:分 + */ + private int totalFee; + + /** + * 描述 + */ + private String body; /** * 交易类型 native(扫码) / jsapi(小程序) / app / h5 */ @@ -17,4 +28,4 @@ public class CasePayDTO { * 支付方式 wxpay(微信) alipay(支付宝) */ private String platform; -} +} \ No newline at end of file diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/mapper/CasePaymentRecordMapper.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/mapper/CasePaymentRecordMapper.java new file mode 100644 index 0000000..0aa384a --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/mapper/CasePaymentRecordMapper.java @@ -0,0 +1,11 @@ +package com.ruoyi.wisdomarbitrate.mapper; + +import com.ruoyi.wisdomarbitrate.domain.CasePaymentRecord; + +public interface CasePaymentRecordMapper { + int saveRecord(CasePaymentRecord casePaymentRecord); + + CasePaymentRecord queryRecord(String orderSn); + + void update(CasePaymentRecord casePaymentRecord); +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CallBackHandleServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CallBackHandleServiceImpl.java new file mode 100644 index 0000000..4812468 --- /dev/null +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CallBackHandleServiceImpl.java @@ -0,0 +1,35 @@ +package com.ruoyi.wisdomarbitrate.service.impl; + +import com.ruoyi.CallBackService; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +/** + * 业务回调处理 + */ +@Component +@Slf4j +public class CallBackHandleServiceImpl implements CallBackService { + @Autowired + private CasePaymentServiceImpl casePaymentService; + @Override + public void successPay(String orderSn) { + casePaymentService.callback(orderSn); + } + + @Override + public void failPay(String orderSn) { + log.info("支付失败回调!"+orderSn); + } + + @Override + public void successRefund(String orderSn) { + log.info("退款成功回调!"+orderSn); + } + + @Override + public void failRefund(String orderSn) { + log.info("退款失败回调!"+orderSn); + } +} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CasePaymentServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CasePaymentServiceImpl.java index 598e979..dd02df0 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CasePaymentServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/CasePaymentServiceImpl.java @@ -1,29 +1,41 @@ package com.ruoyi.wisdomarbitrate.service.impl; -import com.ruoyi.CallBackService; + + import com.ruoyi.ElegentPay; import com.ruoyi.common.constant.CaseApplicationConstants; import com.ruoyi.common.core.domain.AjaxResult; - +import com.ruoyi.common.utils.SmsUtils; import com.ruoyi.dto.PayRequest; import com.ruoyi.dto.PayResponse; +import com.ruoyi.wisdomarbitrate.domain.CaseAffiliate; import com.ruoyi.wisdomarbitrate.domain.CaseApplication; -import com.ruoyi.wisdomarbitrate.mapper.CaseApplicationMapper; -import com.ruoyi.wisdomarbitrate.service.ICasePaymentService; +import com.ruoyi.wisdomarbitrate.domain.CasePaymentRecord; import com.ruoyi.wisdomarbitrate.domain.dto.CasePayDTO; +import com.ruoyi.wisdomarbitrate.mapper.CaseApplicationMapper; +import com.ruoyi.wisdomarbitrate.mapper.CasePaymentRecordMapper; +import com.ruoyi.wisdomarbitrate.service.ICasePaymentService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.time.LocalDateTime; +import java.util.Date; +import java.util.List; + @Service public class CasePaymentServiceImpl implements ICasePaymentService { private final ElegentPay elegentPay; private final CaseApplicationMapper caseApplicationMapper; + private final CasePaymentRecordMapper casePaymentRecordMapper; + @Autowired public CasePaymentServiceImpl(ElegentPay elegentPay - , CaseApplicationMapper caseApplicationMapper) { + , CaseApplicationMapper caseApplicationMapper + , CasePaymentRecordMapper casePaymentRecordMapper) { this.elegentPay = elegentPay; this.caseApplicationMapper = caseApplicationMapper; + this.casePaymentRecordMapper = casePaymentRecordMapper; } @Override @@ -33,13 +45,65 @@ public class CasePaymentServiceImpl implements ICasePaymentService { payRequest.setOrderSn(System.currentTimeMillis() + ""); payRequest.setTotalFee(casePayDTO.getTotalFee()); PayResponse response = elegentPay.requestPay(payRequest, casePayDTO.getTradeType(), casePayDTO.getPlatform()); + if (response.getCode_url() == null) { + return AjaxResult.error(); + } + //缴费记录表里新增数据 + CasePaymentRecord casePaymentRecord = new CasePaymentRecord(); + casePaymentRecord.setCaseId(casePayDTO.getCaseId()); + casePaymentRecord.setOrderNumber(payRequest.getOrderSn()); + casePaymentRecord.setPaymentStatus(0); + int count = casePaymentRecordMapper.saveRecord(casePaymentRecord); + if (count < 1) { + return AjaxResult.error("请检查参数是否有误"); + } return AjaxResult.success(response); } + + public AjaxResult callback(String orderSn) { + //查询记录 + CasePaymentRecord casePaymentRecord = casePaymentRecordMapper.queryRecord(orderSn); + if (casePaymentRecord == null) { + return AjaxResult.error("未查询到相关记录"); + } + Long caseId = casePaymentRecord.getCaseId(); + //更改记录表里的支付状态和支付时间 + casePaymentRecord.setPaymentStatus(1); + casePaymentRecord.setPaymentTime(new Date()); + casePaymentRecordMapper.update(casePaymentRecord); + //根据案件id查询案件信息 + CaseApplication caseApplication = new CaseApplication(); + caseApplication.setId(caseId); + CaseApplication caseApplication1 = caseApplicationMapper.selectCaseApplication(caseApplication); + caseApplication1.setCaseStatus(CaseApplicationConstants.PENDING_PAYMENT_CONFIRM); + //修改案件状态 + caseApplicationMapper.submitCaseApplication(caseApplication); + //发送短信通知 + SmsUtils.SendSmsRequest request = new SmsUtils.SendSmsRequest(); + List caseAffiliates = caseApplication1.getCaseAffiliates();//获取案件关联人信息 + if (caseAffiliates!=null&&caseAffiliates.size()>0){ + for (CaseAffiliate caseAffiliate : caseAffiliates) { + request.setPhone(caseAffiliate.getContactTelphone()); + //获取身份类型 + int identityType = caseAffiliate.getIdentityType(); + if (identityType==1){ //申请人 + request.setTemplateId("申请人模板id"); //传入申请人模板id + // 这个值,要看你的模板中是否预留了占位符,如果没有则不需要设置 + request.setTemplateParamSet(new String[]{"模板中的参数值,如果没有则为空"}); + } else { //被申请人 + request.setTemplateId("被申请人模板id"); + request.setTemplateParamSet(new String[]{"模板中的参数值,如果没有则为空"}); + } + } + } + SmsUtils.sendSms(request); + return AjaxResult.success(); + } @Override public AjaxResult confirmPayment(CaseApplication caseApplication) { caseApplication.setCaseStatus(CaseApplicationConstants.EVIDENCE_CONFREMED); - int i = caseApplicationMapper.updataCaseApplication(caseApplication); + int i = caseApplicationMapper.submitCaseApplication(caseApplication); if (i > 0) { return AjaxResult.success(); } diff --git a/ruoyi-system/src/main/resources/mapper/wisdomarbitrate/CasePaymentRecordMapper.xml b/ruoyi-system/src/main/resources/mapper/wisdomarbitrate/CasePaymentRecordMapper.xml new file mode 100644 index 0000000..07c1f62 --- /dev/null +++ b/ruoyi-system/src/main/resources/mapper/wisdomarbitrate/CasePaymentRecordMapper.xml @@ -0,0 +1,29 @@ + + + + + INSERT INTO case_payment_record (case_id, order_number, payment_status) + VALUES (#{caseId}, #{orderNumber}, #{paymentStatus}) + + + update case_payment_record + + case_id= #{caseId}, + order_number = #{orderNumber}, + payment_time = #{paymentTime}, + payment_status = #{paymentStatus}, + + where id = #{id} + + + \ No newline at end of file