| | |
| | | |
| | | 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": { |
| | |
| | | // 支付失败 |
| | | switch (result.getAttach()) { |
| | | 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(""); |
| | | } |
| | | } |
| | | |
| | | } |