DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/CbyzxPayUtil.java
@@ -1,20 +1,20 @@ package com.stylefeng.guns.modular.system.util; import cn.hutool.Hutool; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import lombok.extern.slf4j.Slf4j; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.util.Arrays; import java.util.Date; import java.util.LinkedHashMap; import java.util.Map; import java.util.*; /** * 创博优支付工具类 * 目前仅实现创建支付单接口。 */ @Slf4j public class CbyzxPayUtil { /** @@ -26,11 +26,11 @@ * 创建支付单接口 */ public static final String CREATE_PAY_ORDER_PATH = "/api/inner/pay/create"; public static final String CLOSE_PAY_ORDER_PATH = "/api/inner/pay/close"; public static final String CLOSE_PAY_ORDER_PATH = "/api/inner/refund/create"; private static final String PAYMENT_ORDER_TYPE = "PAYMENT_ORDER"; private static final String DEFAULT_CURRENCY = "CNY"; private static final String DEFAULT_PAY_CHANNEL_CODE = "ykdride-wxmini"; private static final String DEFAULT_PAY_CHANNEL_CODE = "ykdride-driver-wxmini"; private static final String DEFAULT_TENANT = "gz.zuny.ykdride.platform"; private CbyzxPayUtil() { @@ -76,6 +76,7 @@ private static JSONObject postForJson(String baseUrl, String path, Map<String, Object> params, String actionName) { HttpClientUtil httpClientUtil = new HttpClientUtil(); log.info("{} request: {}", actionName, JSONObject.toJSONString(params)); String responseText = httpClientUtil.pushHttpRequset( "POST", buildUrl(baseUrl, path), @@ -145,9 +146,6 @@ if (request == null) { throw new IllegalArgumentException("request must not be null"); } if (!StringUtils.hasText(request.getTenant())) { throw new IllegalArgumentException("tenant must not be blank"); } if (!StringUtils.hasText(request.getOutRequestNo())) { throw new IllegalArgumentException("outRequestNo must not be blank"); } @@ -169,7 +167,6 @@ public static ClosePayOrderRequest mockCloseRequest(String outRequestNo) { ClosePayOrderRequest request = new ClosePayOrderRequest(); request.setTenant(DEFAULT_TENANT); request.setOutRequestNo(outRequestNo); return request; } @@ -206,14 +203,17 @@ params.put("tenant", DEFAULT_TENANT); params.put("paymentOrderType", PAYMENT_ORDER_TYPE); params.put("outRequestNo", outRequestNo); //转为分 paymentOrderAmount = BigDecimal.valueOf(paymentOrderAmount.multiply(new BigDecimal(100)).intValue()); params.put("paymentOrderAmount", paymentOrderAmount); params.put("currency", DEFAULT_CURRENCY); params.put("buyerId", buyerId); params.put("openId", openId); params.put("subOpenid", openId); params.put("storeIds", Arrays.asList("246")); params.put("payChannelCode", DEFAULT_PAY_CHANNEL_CODE); params.put("payEndTime", payEndTime); params.put("callbackUrl", callbackUrl); params.put("businessCode", "driver"); return params; } @@ -272,24 +272,46 @@ public static class ClosePayOrderRequest { private String tenant; private String outRequestNo; private String refundOutRequestNo; private Integer refundAmount; private String refundDesc; public Map<String, Object> toParamMap() { Map<String, Object> params = new LinkedHashMap<>(); params.put("tenant", tenant); params.put("tenant",DEFAULT_TENANT ); params.put("outRequestNo", outRequestNo); params.put("refundOutRequestNo", refundOutRequestNo); params.put("refundAmount", refundAmount); params.put("refundDesc", refundDesc); return params; } public String getTenant() { return tenant; public String getRefundOutRequestNo() { return refundOutRequestNo; } public void setTenant(String tenant) { this.tenant = tenant; public void setRefundOutRequestNo(String refundOutRequestNo) { this.refundOutRequestNo = refundOutRequestNo; } public Integer getRefundAmount() { return refundAmount; } public void setRefundAmount(Integer refundAmount) { this.refundAmount = refundAmount; } public String getRefundDesc() { return refundDesc; } public void setRefundDesc(String refundDesc) { this.refundDesc = refundDesc; } public String getOutRequestNo() { return outRequestNo; } DriverYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/WeChatUtil.java
@@ -23,11 +23,9 @@ @Component public class WeChatUtil { @Value("${wx.appletsAppid}") private String wxAppletsAppid; private String wxAppletsAppid="wx20301e30167d920e"; @Value("${wx.appletsAppSecret}") private String wxAppletsAppSecret; private String wxAppletsAppSecret="4b8fe5cea20c4309fa996caa06ac9b4c"; @Autowired private RestTemplate restTemplate; @@ -39,7 +37,7 @@ * @return */ public Map<String, String> code2Session(String jscode){ String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + wxAppletsAppid + "&secret=" + wxAppletsAppSecret String url = "https://api.weixin.qq.com/sns/jscode2session?appid=" + "wx20301e30167d920e" + "&secret=" + "4b8fe5cea20c4309fa996caa06ac9b4c" + "&js_code=" + jscode + "&grant_type=authorization_code"; String forObject = restTemplate.getForObject(url, String.class); JSONObject jsonObject = JSON.parseObject(forObject); @@ -85,7 +83,7 @@ String content = "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "×tamp=" + timestamp + "&url=" + url; String signature = DigestUtils.sha1Hex(content); Map<String,Object> map=new HashMap<>(); map.put("appId", wxAppletsAppid); map.put("appId", "wx20301e30167d920e"); map.put("timestamp", timestamp); map.put("nonceStr", noncestr); map.put("signature", signature); DriverYKDTravel/guns-admin/src/main/resources/application-prod.yml
@@ -80,8 +80,8 @@ grantType: authorization_code #填authorization_code appid: 111 #应用唯一标识,在微信开放平台提交应用审核通过后获得 appSecret: 111 #应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 appletsAppid: wx436cde5de45e1ed1 #小程序APPid appletsAppSecret: e94f587cfb5c325c13d72b1f5ddbb1e6 # appletsAppid: wxccaecee088db18d5 #小程序APPid appletsAppSecret: c02390b36817fae7ccd27f084dfbd294 # mchId: 111 #微信支付分配的商户号 key: 111 #key为商户平台设置的密钥key: url: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1} ManagementYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/controller/specialTrain/TOrderCrossCityController.java
@@ -526,6 +526,7 @@ } if(query.getPayType() == 1){//微信 // TODO 退款 //添加交易明细 transactionDetailsService.saveData(orderCrossCity.getUserId(), "跨城出行取消退款", query.getAmount(), 1, 1, 1, 3, tOrderCrossCityId); }else if(query.getPayType()==4){ ManagementYKDTravel/guns-admin/src/main/resources/application-dev.yml
@@ -1,12 +1,14 @@ server: port: 8010 tomcat: basedir: /etraffic/server/chuxing/tomcat servlet: session: cookie: name: CHUXINGSID guns: swagger-open: true #是否开启swagger (true/false) swagger-open: false #是否开启swagger (true/false) kaptcha-open: false #是否开启登录时验证码 (true/false) spring-session-open: true #是否开启spring session,如果是多机环境需要开启(true/false) session-invalidate-time: 1800 #session失效时间(只在单机环境下生效,多机环境在SpringSessionConfig类中配置) 单位:秒 @@ -18,7 +20,7 @@ spring: profiles: active: dev active: prod mvc: static-path-pattern: /static/** view: @@ -32,15 +34,17 @@ multipart: max-request-size: 500MB max-file-size: 500MB redis: host: 192.168.110.80 port: 6379 password: 123456 session: redis: namespace: spring:chuxing:session store-type: redis timeout: 7200 redis: host: 127.0.0.1 port: 6410 password: Qnz_jt@20#25 database: 0 timeout: 1000 mybatis-plus: type-aliases-package: com.stylefeng.guns.modular @@ -54,10 +58,10 @@ --- spring: datasource: url: jdbc:mysql://192.168.110.47:3306/hn_ridingdb?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai url: jdbc:mysql://127.0.0.1:8066/yuekeduo?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=CONVERT_TO_NULL&useSSL=false&serverTimezone=Asia/Shanghai username: root password: 123456 db-name: qyttravel #用来搜集数据库的所有表 password: YueKeDuo@2026!. db-name: yuekeduo #用来搜集数据库的所有表 filters: wall,mergeStat @@ -65,7 +69,11 @@ spring: data: mongodb: uri: mongodb://192.168.110.80:27017/traveling_track host: 127.0.0.1 port: 27009 username: qnjt_ridingmgdb password: qnjtriding@Prom2025 database: qnjt_ridingmgdb --- @@ -73,8 +81,8 @@ grantType: authorization_code #填authorization_code appid: 1111 #应用唯一标识,在微信开放平台提交应用审核通过后获得 appSecret: 1111 #应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 appletsAppid: wxcc3c9058e2b294db #小程序APPid appletsAppSecret: 5610fc6126255ca5f7bd9fa4330338b6 # appletsAppid: wx436cde5de45e1ed1 #小程序APPid appletsAppSecret: e94f587cfb5c325c13d72b1f5ddbb1e6 # mchId: 1111 #微信支付分配的商户号 key: 1111 #key为商户平台设置的密钥key: @@ -86,23 +94,23 @@ alipayPublicKey: 1111 #应用公钥 alipay_public_key: 1111 #支付宝公钥 --- qyt: chuxing_url: http://192.168.110.80:8010 daijia_url: http://192.168.110.80:8010 chuxing_url: http://127.0.0.1:5000 daijia_url: http://10.31.182.11:3000/daijia #支付回调地址 #正式环境 callbackPath: http://192.168.110.80 callbackPath: https://traffic.qytzt.cn/chuxing #交通部推送数据功能开关 pushMinistryOfTransport: false cos: secretId: AKIDofP7ezSmvtiNtDMLExUpALJCya0EHG3e secretKey: Sp481pRrRpBQzOekfPzPgmhR0GV9oKem UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/api/OrderController.java
@@ -1720,40 +1720,43 @@ */ @ResponseBody @PostMapping("/base/cbyzxCancelOrderTaxi") public void cbyzxCancelOrderTaxi(HttpServletRequest request, HttpServletResponse response) { try { Map<String, String> map = payMoneyUtil.weixinpayCallback(request); if (null != map) { String order_id = map.get("transaction_id"); String out_trade_no = map.get("out_trade_no"); String result = map.get("result"); if (ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)) { PrintWriter out = response.getWriter(); out.write(result); out.flush(); out.close(); public Map<String, Object> cbyzxCancelOrderTaxi(HttpServletRequest request, HttpServletResponse response) { // 不做处理 退款已同步处理 return buildCbyzxCallbackResponse(0, "success"); String[] split = out_trade_no.split("_"); Integer id = Integer.valueOf(split[0]); Integer type = Integer.valueOf(split[1]); switch (type) { case 1: orderPrivateCarService.payCancelOrderPrivateCar(id, order_id, 1); break; case 2: orderTaxiService.payCancelOrderTaxi(id, order_id, 1); break; case 3: orderCrossCityService.payCancelOrderCrossCity(id, order_id, 1); break; } } // cloudPay(map.get("total_fee"),map.get("transaction_id"),1); } } catch (Exception e) { e.printStackTrace(); } // try { // Map<String, String> map = payMoneyUtil.weixinpayCallback(request); // if (null != map) { // String order_id = map.get("transaction_id"); // String out_trade_no = map.get("out_trade_no"); // String result = map.get("result"); // if (ToolUtil.isNotEmpty(out_trade_no) && ToolUtil.isNotEmpty(order_id)) { // PrintWriter out = response.getWriter(); // out.write(result); // out.flush(); // out.close(); // // String[] split = out_trade_no.split("_"); // Integer id = Integer.valueOf(split[0]); // Integer type = Integer.valueOf(split[1]); // switch (type) { // case 1: // orderPrivateCarService.payCancelOrderPrivateCar(id, order_id, 1); // break; // case 2: // orderTaxiService.payCancelOrderTaxi(id, order_id, 1); // break; // case 3: // orderCrossCityService.payCancelOrderCrossCity(id, order_id, 1); // break; // } // } //// cloudPay(map.get("total_fee"),map.get("transaction_id"),1); // // } // } catch (Exception e) { // e.printStackTrace(); // } } /** UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/specialTrain/server/impl/OrderPrivateCarServiceImpl.java
@@ -1133,7 +1133,7 @@ if (orderPrivateCar.getState() >= 5 && orderPrivateCar.getState() != 11) { return ResultUtil.error("订单已取消,请刷新页面"); } if (!Integer.valueOf(2).equals(orderPrivateCar.getType())) { if (!Integer.valueOf(2).equals(orderPrivateCar.getPaymentMode())) { ResultUtil refundResult = handlePrivateCarPrepayCancelRefund(orderPrivateCar, reason, remark, uid); if (refundResult != null) { if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) { @@ -2694,7 +2694,7 @@ } private String buildPrepayRefundOutNo(Integer orderId) { return "PREPAY_REFUND_1_" + orderId; return "PREPAY_REFUND_1_" + orderId+ToolUtil.getRandomString(5); } private boolean isPrivateCarPrepayMode(OrderPrivateCar orderPrivateCar) { UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/CbyzxPayUtil.java
@@ -213,6 +213,7 @@ params.put("payChannelCode", DEFAULT_PAY_CHANNEL_CODE); params.put("payEndTime", payEndTime); params.put("callbackUrl", callbackUrl); params.put("businessCode", "passenger"); return params; } UserYKDTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/taxi/service/impl/OrderTaxiServiceImpl.java
@@ -1,5 +1,6 @@ package com.stylefeng.guns.modular.taxi.service.impl; import cn.hutool.core.util.IdUtil; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; @@ -554,9 +555,12 @@ if (orderTaxi.getState() >= 5 && orderTaxi.getState() != 11) { return ResultUtil.error("订单已取消,请刷新页面"); } if (!Integer.valueOf(2).equals(orderTaxi.getType())) { System.out.println("出租车退款111!!!!"); if (!Integer.valueOf(2).equals(orderTaxi.getPaymentMode())) { System.out.println("出租车退款2222!!!!"); ResultUtil refundResult = handleTaxiPrepayCancelRefund(orderTaxi, reason, remark, uid); if (refundResult != null) { System.out.println("出租车退款3333!!!!"+refundResult.getCode()); if (!ResultUtil.SUCCESS.equals(refundResult.getCode())) { return refundResult; } @@ -2191,10 +2195,11 @@ } private String buildPrepayRefundOutNo(Integer orderId) { return "PREPAY_REFUND_2_" + orderId; return "PREPAY_REFUND_2_" + orderId+ ToolUtil.getRandomString(5); } private ResultUtil handleTaxiPrepayCancelRefund(OrderTaxi orderTaxi, String reason, String remark, Integer uid) throws Exception { System.out.println("出租车退款!!!!"); if (orderTaxi == null || !Integer.valueOf(1).equals(orderTaxi.getPaymentMode())) { return null; } @@ -2212,6 +2217,7 @@ request.setRefundAmount(toFen(refundAmount)); request.setRefundDesc(ToolUtil.isNotEmpty(reason) ? reason : "出租车订单取消退款"); JSONObject response = CbyzxPayUtil.closePayOrder(request); System.out.println("微信先付订单退款结果:" + response.toJSONString()); if (!isTaxiPrepayRefundSuccess(response)) { return ResultUtil.error(extractTaxiRefundMessage(response), response); }