| | |
| | | import com.doumee.config.wx.WxPayV3Service; |
| | | import com.doumee.core.constants.Constants; |
| | | import com.doumee.core.utils.ID; |
| | | import com.doumee.core.utils.aliyun.AliSmsService; |
| | | import com.doumee.dao.business.MemberMapper; |
| | | import com.doumee.dao.business.OrdersRefundMapper; |
| | | import com.doumee.dao.business.OrdersMapper; |
| | | import com.doumee.dao.business.SmsrecordMapper; |
| | | import com.doumee.dao.business.model.Member; |
| | | import com.doumee.dao.business.model.Notice; |
| | | import com.doumee.dao.business.model.Orders; |
| | | import com.doumee.dao.business.model.OrdersRefund; |
| | | import com.doumee.dao.business.model.Smsrecord; |
| | | import com.alibaba.fastjson.JSONObject; |
| | | import com.doumee.service.business.NoticeService; |
| | | import com.doumee.service.business.OrdersService; |
| | | import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; |
| | |
| | | import com.wechat.pay.java.service.payments.model.Transaction; |
| | | import com.wechat.pay.java.service.refund.model.RefundNotification; |
| | | import com.wechat.pay.java.service.refund.model.Status; |
| | | import io.swagger.annotations.Api; |
| | | import lombok.extern.slf4j.Slf4j; |
| | | import org.apache.commons.lang3.StringUtils; |
| | | import org.springframework.beans.factory.annotation.Autowired; |
| | |
| | | * @Author : Rk |
| | | * @create 2023/3/24 16:57 |
| | | */ |
| | | @Api(tags = "支付回调业务接口") |
| | | @Slf4j |
| | | @RestController |
| | | @CrossOrigin |
| | |
| | | |
| | | @Autowired |
| | | private NoticeService noticeService; |
| | | |
| | | @Autowired |
| | | private SmsrecordMapper smsrecordMapper; |
| | | |
| | | @Autowired |
| | | private MemberMapper memberMapper; |
| | | |
| | | |
| | | // ==================== V2 回调 ==================== |
| | |
| | | .last("limit 1")); |
| | | if (refundRecord != null) { |
| | | Status refundStatus = refundNotification.getRefundStatus(); |
| | | if (Status.SUCCESS.equals(refundStatus)) { |
| | | refundRecord.setStatus(Constants.ONE); // 退款成功 |
| | | refundRecord.setRefundTime(new java.util.Date()); |
| | | } else if (Status.CLOSED.equals(refundStatus) || Status.ABNORMAL.equals(refundStatus)) { |
| | | refundRecord.setStatus(Constants.TWO); // 退款失败 |
| | | } |
| | | ordersRefundMapper.updateById(refundRecord); |
| | | log.info("退款记录状态已更新, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus()); |
| | | |
| | | // 退款成功 → 通知会员 |
| | | if (Status.SUCCESS.equals(refundStatus) && refundRecord.getOrderId() != null) { |
| | | Orders refundOrder = ordersMapper.selectById(refundRecord.getOrderId()); |
| | | if (refundOrder != null) { |
| | | Notice notice = new Notice(); |
| | | notice.setUserType(0); |
| | | notice.setUserId(refundOrder.getMemberId()); |
| | | notice.setTitle(Constants.MemberOrderNotify.REFUNDED.getTitle()); |
| | | notice.setContent(Constants.MemberOrderNotify.REFUNDED.format( |
| | | "orderNo", refundOrder.getCode(), |
| | | "amount", String.valueOf(Constants.getFormatMoney(refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)))); |
| | | notice.setObjId(refundOrder.getId()); |
| | | notice.setObjType(0); |
| | | notice.setStatus(0); |
| | | notice.setIsdeleted(Constants.ZERO); |
| | | notice.setCreateDate(new java.util.Date()); |
| | | noticeService.create(notice); |
| | | // 幂等判断:已成功/已失败的不重复处理 |
| | | if (!Constants.equalsInteger(refundRecord.getStatus(), Constants.ZERO)) { |
| | | log.info("退款记录已处理, refundRecordId={}, status={}, 跳过", refundRecord.getId(), refundRecord.getStatus()); |
| | | } else { |
| | | if (Status.SUCCESS.equals(refundStatus)) { |
| | | refundRecord.setStatus(Constants.ONE); // 退款成功 |
| | | refundRecord.setRefundTime(new java.util.Date()); |
| | | } else if (Status.CLOSED.equals(refundStatus) || Status.ABNORMAL.equals(refundStatus)) { |
| | | refundRecord.setStatus(Constants.TWO); // 退款失败 |
| | | refundRecord.setRemark("微信退款失败: " + refundStatus.name()); |
| | | } |
| | | // PROCESSING 状态无变化,不更新 |
| | | ordersRefundMapper.updateById(refundRecord); |
| | | log.info("退款记录状态已更新, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus()); |
| | | |
| | | // 退款成功 → 通知会员 |
| | | if (Status.SUCCESS.equals(refundStatus) && refundRecord.getOrderId() != null) { |
| | | Orders refundOrder = ordersMapper.selectById(refundRecord.getOrderId()); |
| | | if (refundOrder != null) { |
| | | Notice notice = new Notice(); |
| | | notice.setUserType(0); |
| | | notice.setUserId(refundOrder.getMemberId()); |
| | | notice.setTitle(Constants.MemberOrderNotify.REFUNDED.getTitle()); |
| | | notice.setContent(Constants.MemberOrderNotify.REFUNDED.format( |
| | | "orderNo", refundOrder.getCode(), |
| | | "amount", String.valueOf(Constants.getFormatMoney(refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L)))); |
| | | notice.setObjId(refundOrder.getId()); |
| | | notice.setObjType(0); |
| | | notice.setStatus(0); |
| | | notice.setIsdeleted(Constants.ZERO); |
| | | notice.setCreateDate(new java.util.Date()); |
| | | noticeService.create(notice); |
| | | |
| | | // 短信通知会员:退款已完成 |
| | | Member refundMember = memberMapper.selectById(refundOrder.getMemberId()); |
| | | if (refundMember != null && StringUtils.isNotBlank(refundMember.getTelephone())) { |
| | | String smsContent = Constants.SmsNotify.MEMBER_REFUNDED.format( |
| | | "orderNo", refundOrder.getCode(), |
| | | "money", String.valueOf(Constants.getFormatMoney( |
| | | refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L))); |
| | | try { |
| | | JSONObject templateParam = new JSONObject(); |
| | | templateParam.put("orderNo", refundOrder.getCode()); |
| | | templateParam.put("money", String.valueOf(Constants.getFormatMoney( |
| | | refundOrder.getRefundAmount() != null ? refundOrder.getRefundAmount() : 0L))); |
| | | boolean smsResult = AliSmsService.sendSms(refundMember.getTelephone(), |
| | | Constants.SmsNotify.MEMBER_REFUNDED.getTemplateCode(), |
| | | templateParam.toJSONString()); |
| | | if (smsResult) { |
| | | log.info("退款短信发送成功: phone={}", refundMember.getTelephone()); |
| | | } else { |
| | | log.warn("退款短信发送失败: phone={}", refundMember.getTelephone()); |
| | | } |
| | | // 存储短信记录 |
| | | Smsrecord smsRecord = new Smsrecord(); |
| | | smsRecord.setPhone(refundMember.getTelephone()); |
| | | smsRecord.setContent(smsContent); |
| | | smsRecord.setType(Constants.ONE); |
| | | smsRecord.setStatus(smsResult ? Constants.ONE : Constants.ZERO); |
| | | smsRecord.setCreateTime(new java.util.Date()); |
| | | smsRecord.setDeleted(Constants.ZERO); |
| | | smsrecordMapper.insert(smsRecord); |
| | | } catch (Exception smsEx) { |
| | | log.error("退款短信发送异常: {}", smsEx.getMessage()); |
| | | try { |
| | | Smsrecord smsRecord = new Smsrecord(); |
| | | smsRecord.setPhone(refundMember.getTelephone()); |
| | | smsRecord.setContent(smsContent); |
| | | smsRecord.setType(Constants.ONE); |
| | | smsRecord.setStatus(Constants.ZERO); |
| | | smsRecord.setCreateTime(new java.util.Date()); |
| | | smsRecord.setDeleted(Constants.ZERO); |
| | | smsrecordMapper.insert(smsRecord); |
| | | } catch (Exception ignored) {} |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |
| | | } |