package com.doumee.api.web;
|
|
import com.doumee.config.wx.WxMiniConfig;
|
import com.doumee.core.model.ApiResponse;
|
import com.doumee.service.business.OrdersService;
|
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.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 OrdersService ordersService;
|
|
/**
|
* 【微信支付】异步通知
|
*
|
* @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 "createOrder": {
|
ordersService.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) {
|
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
|
ordersService.refundCallback(result);
|
// }
|
return ApiResponse.success("处理成功");
|
} catch (Exception e) {
|
e.printStackTrace();
|
log.error("微信回调结果异常,异常原因{}", e.getLocalizedMessage());
|
return ApiResponse.failed("");
|
}
|
}
|
|
}
|