content: package com.sky.controller.nofity;
  
  import com.alibaba.druid.support.json.JSONUtils;
  import com.alibaba.fastjson.JSON;
  import com.alibaba.fastjson.JSONObject;
  import com.sky.properties.WeChatProperties;
  import com.sky.service.OrderService;
  import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
  
  import lombok.extern.slf4j.Slf4j;
  import org.apache.http.entity.ContentType;
  import org.springframework.beans.factory.annotation.Autowired;
  import org.springframework.web.bind.annotation.RequestMapping;
  import org.springframework.web.bind.annotation.RestController;
  
  import javax.servlet.http.HttpServletRequest;
  import javax.servlet.http.HttpServletResponse;
  import java.io.BufferedReader;
  import java.nio.charset.StandardCharsets;
  import java.util.HashMap;
  
  /**
   * 支付回调相关接口
   */
  @RestController
  @RequestMapping("/notify")
  @Slf4j
  public class PayNotifyController {
      @Autowired
      private OrderService orderService;
      @Autowired
      private WeChatProperties weChatProperties;
  
      /**
       * 支付成功回调
       *
       * @param request
       */
      @RequestMapping("/paySuccess")
      public void paySuccessNotify(HttpServletRequest request, HttpServletResponse response) throws Exception {
          // 读取数据
          String body = readData(request);
          log.info("支付成功回调：{}", body);
  
          // 数据解密
          String plainText = decryptData(body);
          log.info("解密后的文本：{}", plainText);
  
          JSONObject jsonObject = JSON.parseObject(plainText);
          String outTradeNo = jsonObject.getString("out_trade_no");// 商户平台订单号
          String transactionId = jsonObject.getString("transaction_id");// 微信支付交易号
  
          log.info("商户平台订单号：{}", outTradeNo);
          log.info("微信支付交易号：{}", transactionId);
  
          // 业务处理，修改订单状态、来单提醒
          orderService.paySuccess(outTradeNo);
  
          // 给微信响应
          responseToWeixin(response);
      }
  
      /**
       * 读取数据
       *
       * @param request
       * @return
       * @throws Exception
       */
      private String readData(HttpServletRequest request) throws Exception {
          BufferedReader reader = request.getReader();
          StringBuilder result = new StringBuilder();
          String line = null;
          while ((line = reader.readLine()) != null) {
              if (result.length() > 0) {
                  result.append("\n");
              }
              result.append(line);
          }
          return result.toString();
      }
  
      /**
       * 数据解密
       *
       * @param body
       * @return
       * @throws Exception
       */
      private String decryptData(String body) throws Exception {
          JSONObject resultObject = JSON.parseObject(body);
          JSONObject resource = resultObject.getJSONObject("resource");
          String ciphertext = resource.getString("ciphertext");
          String nonce = resource.getString("nonce");
          String associatedData = resource.getString("associated_data");
  
          AesUtil aesUtil = new AesUtil(weChatProperties.getApiV3Key().getBytes(StandardCharsets.UTF_8));
          // 密文解密
          String plainText = aesUtil.decryptToString(associatedData.getBytes(StandardCharsets.UTF_8),
                  nonce.getBytes(StandardCharsets.UTF_8),
                  ciphertext);
  
          return plainText;
      }
  
      /**
       * 给微信响应
       * 
       * @param response
       */
      private void responseToWeixin(HttpServletResponse response) throws Exception {
          response.setStatus(200);
          HashMap<Object, Object> map = new HashMap<>();
          map.put("code", "SUCCESS");
          map.put("message", "SUCCESS");
          response.setHeader("Content-type", ContentType.APPLICATION_JSON.toString());
          response.getOutputStream().write(JSONUtils.toJSONString(map).getBytes(StandardCharsets.UTF_8));
          response.flushBuffer();
      }
  }
  