This commit is contained in:
admin
2024-07-26 00:34:57 +08:00
parent 4c5b046107
commit e33a01042d
5 changed files with 70 additions and 64 deletions

View File

@@ -1,7 +1,6 @@
package com.starry.admin.modules.weichat.controller;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson2.JSONObject;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
@@ -28,9 +27,15 @@ import lombok.extern.slf4j.Slf4j;
import org.dom4j.Document;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
@@ -71,67 +76,55 @@ public class WxPlayController {
* @author admin
* @since 2024/5/8 11:25
**/
@GetMapping("/jsCallback")
public String wxPayNotify(@RequestBody String xmlData) {
log.info("****************接受到微信支付回调:{}", xmlData);
this.dealNotify(xmlData);
@RequestMapping("/jsCallback")
public String wxPayNotify(HttpServletRequest request) {
try (InputStream inStream = request.getInputStream(); ByteArrayOutputStream outSteam = new ByteArrayOutputStream()) {
byte[] buffer = new byte[1024];
int len;
while ((len = inStream.read(buffer)) != -1) {
outSteam.write(buffer, 0, len);
}
log.info("微信支付回调开始-参数解析-开始");
// 获取微信调用我们notify_url的返回信息
String result = outSteam.toString("utf-8");
log.info("微信支付回调开始-参数解析-结束,result={}", result);
this.dealNotify(result);
} catch (Exception e) {
log.error("微信支付回调业务处理异常", e);
}
return WxPayNotifyResponse.success("成功");
}
private void dealNotify(String xmlData) {
public void dealNotify(String xmlData) {
try {
Map<String, String> orderMap = readStringXmlOut(xmlData);
String outTradeNo = orderMap.get("out_trade_no");
PlayOrderInfoEntity orderInfoEntity = orderInfoService.getById(outTradeNo);
String tenantId = orderMap.get("attach");
if (StrUtil.isBlank(tenantId)) {
log.error("支付对应业务处理异常-未查询到租户信息,xmlData={}", xmlData);
}
SecurityUtils.setTenantId(tenantId);
PlayOrderInfoEntity orderInfoEntity = orderInfoService.queryByOrderNo(outTradeNo);
if (Objects.isNull(orderInfoEntity)) {
log.error("*********未查询到对应的支付记录,订单号:{}", outTradeNo);
log.error("支付对应业务处理异常-未查询到对应的支付记录,xmlData={}", xmlData);
return;
}
// // TODO如果支付状态不是待支付
// if (!orderInfoEntity.getOrderStatus().equals(RepairStatusEnum.NOT_PAY.name())) {
// log.error("*********支付记录状态异常,支付记录:{}", JSONObject.toJSONString(repair));
// return;
// }
// Date nowDate = new Date();
// repair.setPaySuccessTime(nowDate);
// repair.setPayStatus(RepairStatusEnum.PAID.name());
// repair.setStatus(RepairStatusEnum.REPAIRING.name());
// TODO如果订单不是支付订单,并且支付状态不为未支付
if (!"0".equals(orderInfoEntity.getOrderType()) || !"0".equals(orderInfoEntity.getPayState())) {
log.error("支付对应业务处理异常-支付记录状态异常支付记录xmlData={}", xmlData);
return;
}
//修养订单状态
orderInfoEntity.setPayState("1");
orderInfoService.updateById(orderInfoEntity);
//修改账户余额
customUserInfoService.customAccountBalanceRecharge(orderInfoEntity.getOrderMoney(), orderInfoEntity.getPurchaserBy(), orderInfoEntity.getId());
log.info("*********支付处理完成");
} catch (Exception e) {
log.error(e.getMessage());
log.error("订单回调业务处理异常,xmlData={}", xmlData);
}
}
//public void jsCallback(HttpServletRequest request, HttpServletResponse response) throws Exception {
// // 读取回调数据
// InputStream inputStream = request.getInputStream();
// StringBuilder sb = new StringBuilder();
// String s;
// BufferedReader in = new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
// while ((s = in.readLine()) != null) {
// sb.append(s);
// }
// in.close();
// inputStream.close();
//
// // 解析xml成map
// Map<String, Object> m = XmlUtil.xmlToMap(sb.toString());
// // 过滤空 设置 TreeMap
// SortedMap<Object, Object> packageParams = new TreeMap<>();
// for (String parameter : m.keySet()) {
// Object parameterValue = m.get(parameter);
// String v = "";
// if (null != parameterValue) {
// v = parameterValue.toString().trim();
// }
// packageParams.put(parameter, v);
// }
// log.info("packageParams=" + packageParams);
// String resXml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
// response.getWriter().write(resXml);
//}
@CustomUserLogin
@@ -161,24 +154,24 @@ public class WxPlayController {
// 订单总金额,单位为分
long totalFee = getTotalFee(money);
// 创建订单信息
// String orderNo = playOrderInfoService.getOrderNo();
String orderId = IdUtil.fastSimpleUUID();
orderInfoService.createRechargeOrder(orderId, new BigDecimal(totalFee * 1.0 / 100), new BigDecimal(totalFee * 1.0 / 100), customUserInfo.getId());
customUserInfoService.customAccountBalanceRecharge(new BigDecimal(money), ThreadLocalRequestDetail.getCustomUserInfo().getId(), orderId);
// return R.ok("充值成功");
String orderNo = playOrderInfoService.getOrderNo();
orderInfoService.createRechargeOrder(orderNo, new BigDecimal(totalFee * 1.0 / 100), new BigDecimal(totalFee * 1.0 / 100), customUserInfo.getId());
WxPayService wxPayService = mpService.getWxPay();
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setOpenid(customUserInfo.getOpenid());
// 订单总金额单位为分开发阶段固定设置为支付1分钱
request.setAttach(tenantId);
request.setTotalFee(1);
request.setOutTradeNo(orderId);
request.setOutTradeNo(orderNo);
request.setTradeType("JSAPI");
request.setSpbillCreateIp("101.43.206.16");
request.setNotifyUrl(wxPayService.getConfig().getNotifyUrl());
request.setBody("船票充值");
WxPayUnifiedOrderResult orderResult;
try {
//统一下单商户系统先调用该接口在微信支付服务后台生成预支付交易单返回正确的预支付交易会话标识后再在APP里面调起支付
orderResult = wxPayService.unifiedOrder(request);
} catch (WxPayException e) {
throw new RuntimeException(e);