rk
昨天 996b2f16afaa271ce8aad6abf6858aa5db503eb3
server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -4,11 +4,17 @@
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;
@@ -16,6 +22,7 @@
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;
@@ -30,6 +37,7 @@
 * @Author : Rk
 * @create 2023/3/24 16:57
 */
@Api(tags = "支付回调业务接口")
@Slf4j
@RestController
@CrossOrigin
@@ -49,6 +57,12 @@
    @Autowired
    private NoticeService noticeService;
    @Autowired
    private SmsrecordMapper smsrecordMapper;
    @Autowired
    private MemberMapper memberMapper;
    // ==================== V2 回调 ====================
@@ -171,32 +185,84 @@
                            .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) {}
                                }
                            }
                        }
                    }
                }
            }