package com.doumee.api.web; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.StringUtils; import com.doumee.core.model.ApiResponse; import com.doumee.core.wx.WxMiniConfig; import com.doumee.service.business.GoodsorderService; import com.doumee.service.business.RefundService; import com.wechat.pay.java.core.RSAAutoCertificateConfig; import com.wechat.pay.java.core.notification.NotificationConfig; import com.wechat.pay.java.core.notification.NotificationParser; import com.wechat.pay.java.core.notification.RequestParam; import com.wechat.pay.java.service.partnerpayments.jsapi.model.Transaction; import com.wechat.pay.java.service.refund.model.RefundNotification; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.servlet.ServletInputStream; import javax.servlet.http.HttpServletRequest; import java.io.BufferedReader; import java.io.InputStreamReader; /** * Created by IntelliJ IDEA. * 支付回调 * @Author : Rk * @create 2023/2/23 13:49 */ @Slf4j @RestController @CrossOrigin public class PaymentCallback { @Autowired private GoodsorderService goodsorderService; /** * 【微信支付】异步通知 * * @return */ @PostMapping("/api/wxPayNotify") public ApiResponse wxPay_notify(HttpServletRequest request) { try { ServletInputStream inputStream = request.getInputStream(); StringBuffer stringBuffer = new StringBuffer(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s; //读取回调请求体 while ((s = bufferedReader.readLine()) != null) { stringBuffer.append(s); } String body = stringBuffer.toString(); String timestamp = request.getHeader("Wechatpay-Timestamp"); String nonce = request.getHeader("Wechatpay-Nonce"); String signType = request.getHeader("Wechatpay-Signature-Type"); String serialNo = request.getHeader("wechatpay-Serial"); String signature = request.getHeader("Wechatpay-Signature"); RequestParam requestParam = new RequestParam.Builder() .serialNumber(serialNo) .nonce(nonce) .signType(signType) .signature(signature) .timestamp(String.valueOf(timestamp)) .body(body) .build(); NotificationConfig config = new RSAAutoCertificateConfig.Builder() .merchantId(WxMiniConfig.wxProperties.getMchId()) .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath()) .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer()) .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key()) .build(); NotificationParser parser = new NotificationParser(config); Transaction result = parser.parse(requestParam, Transaction.class); //自定义订单号 String outTradeNo = result.getOutTradeNo(); //微信订单号 String paymentNo = result.getTransactionId(); if ("SUCCESS".equals(result.getTradeState().name())) { // 支付成功ge switch (result.getAttach()) { //支付订单回调 case "createGoodsOrder": { goodsorderService.payNotify(outTradeNo,paymentNo); break; } } } else { // 支付失败 switch (result.getAttach()) { case "createGoodsOrder": { break; } } } return ApiResponse.success("处理成功!"); } catch (Exception e) { e.printStackTrace(); log.error("微信回调结果异常,异常原因{}", e.getLocalizedMessage()); return ApiResponse.failed(""); } } @PostMapping("/api/wxRefundNotify") public ApiResponse wxRefundNotify(HttpServletRequest request) { try { ServletInputStream inputStream = request.getInputStream(); StringBuffer stringBuffer = new StringBuffer(); BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream)); String s; //读取回调请求体 while ((s = bufferedReader.readLine()) != null) { stringBuffer.append(s); } String body = stringBuffer.toString(); String timestamp = request.getHeader("Wechatpay-Timestamp"); String nonce = request.getHeader("Wechatpay-Nonce"); String signType = request.getHeader("Wechatpay-Signature-Type"); String serialNo = request.getHeader("wechatpay-Serial"); String signature = request.getHeader("Wechatpay-Signature"); RequestParam requestParam = new RequestParam.Builder() .serialNumber(serialNo) .nonce(nonce) .signType(signType) .signature(signature) .timestamp(String.valueOf(timestamp)) .body(body) .build(); NotificationConfig config = new RSAAutoCertificateConfig.Builder() .merchantId(WxMiniConfig.wxProperties.getMchId()) .privateKeyFromPath(WxMiniConfig.wxProperties.getPrivateKeyPath()) .merchantSerialNumber(WxMiniConfig.wxProperties.getSerialNumer()) .apiV3Key(WxMiniConfig.wxProperties.getApiV3Key()) .build(); NotificationParser parser = new NotificationParser(config); RefundNotification result = parser.parse(requestParam, RefundNotification.class); // if ("SUCCESS".equals(result.getRefundStatus().name())) { // 支付成功ge goodsorderService.closeGoodsorderDone(result); // } return ApiResponse.success("处理成功"); } catch (Exception e) { e.printStackTrace(); log.error("微信回调结果异常,异常原因{}", e.getLocalizedMessage()); return ApiResponse.failed(""); } } }