|  |  |  | 
|---|
|  |  |  |  | 
|---|
|  |  |  | 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.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse; | 
|---|
|  |  |  | import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult; | 
|---|
|  |  |  | import com.github.binarywang.wxpay.config.WxPayConfig; | 
|---|
|  |  |  | 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.apache.shiro.SecurityUtils; | 
|---|
|  |  |  | import org.apache.shiro.mgt.DefaultSecurityManager; | 
|---|
|  |  |  | 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. | 
|---|
|  |  |  | 
|---|
|  |  |  | /** | 
|---|
|  |  |  | * 【微信支付】异步通知 | 
|---|
|  |  |  | * | 
|---|
|  |  |  | * @param xmlResult | 
|---|
|  |  |  | * @return | 
|---|
|  |  |  | */ | 
|---|
|  |  |  | @PostMapping("/api/wxPayNotify") | 
|---|
|  |  |  | public String wxPay_notify(@RequestBody String xmlResult) { | 
|---|
|  |  |  | log.info(xmlResult); | 
|---|
|  |  |  | if (StringUtils.isBlank(xmlResult)) return null; | 
|---|
|  |  |  | public ApiResponse wxPay_notify(HttpServletRequest request) { | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | WxPayOrderNotifyResult result = WxMiniConfig.wxPayService.parseOrderNotifyResult(xmlResult); | 
|---|
|  |  |  | 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.getReturnCode())) { | 
|---|
|  |  |  | // 支付成功 | 
|---|
|  |  |  | if ("SUCCESS".equals(result.getTradeState().name())) { | 
|---|
|  |  |  | // 支付成功ge | 
|---|
|  |  |  | switch (result.getAttach()) { | 
|---|
|  |  |  | //家长支付订单 | 
|---|
|  |  |  | //支付订单回调 | 
|---|
|  |  |  | case "createGoodsOrder": { | 
|---|
|  |  |  | goodsorderService.payNotify(outTradeNo,paymentNo); | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | 
|---|
|  |  |  | } else { | 
|---|
|  |  |  | // 支付失败 | 
|---|
|  |  |  | switch (result.getAttach()) { | 
|---|
|  |  |  | //家长支付订单 | 
|---|
|  |  |  | case "createOrder": { | 
|---|
|  |  |  |  | 
|---|
|  |  |  | case "createGoodsOrder": { | 
|---|
|  |  |  | break; | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return WxPayNotifyResponse.fail(result.getReturnMsg()); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | return WxPayNotifyResponse.success("处理成功!"); | 
|---|
|  |  |  | return ApiResponse.success("处理成功!"); | 
|---|
|  |  |  | } catch (Exception e) { | 
|---|
|  |  |  | e.printStackTrace(); | 
|---|
|  |  |  | log.error("微信回调结果异常,异常原因{}", e.getLocalizedMessage()); | 
|---|
|  |  |  | return WxPayNotifyResponse.fail(e.getMessage()); | 
|---|
|  |  |  | return ApiResponse.failed(""); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  | @PostMapping("/api/wxRefundNotify") | 
|---|
|  |  |  | public ApiResponse wxRefundNotify(HttpServletRequest request) { | 
|---|
|  |  |  | log.error("微信退款回调结果开始===========" ); | 
|---|
|  |  |  | try { | 
|---|
|  |  |  | DefaultSecurityManager securityManager = new DefaultSecurityManager(); | 
|---|
|  |  |  | SecurityUtils.setSecurityManager(securityManager); | 
|---|
|  |  |  | 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(""); | 
|---|
|  |  |  | } | 
|---|
|  |  |  | } | 
|---|
|  |  |  |  | 
|---|
|  |  |  | } | 
|---|