dao/src/main/java/com/sandu/ximon/dao/domain/C3mOrder.java
@@ -1,16 +1,12 @@ package com.sandu.ximon.dao.domain; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.sandu.ximon.dao.enums.OrderStatus; import com.sandu.ximon.dao.enums.OrderType; import lombok.Data; import org.springframework.core.annotation.OrderUtils; import java.io.Serializable; import java.util.Date; import java.math.BigDecimal; import lombok.Data; /** * C3订单表 @@ -19,7 +15,6 @@ @TableName(value ="c3_order") @Data public class C3mOrder implements Serializable { public static String REQUEST_URL = "http://www.ximonsmart.com/charge/#/charge/"; /** @@ -114,7 +109,7 @@ private Long stopChargingTimestamp; /** * 订单状态:// 未支付(0),已支付(1),已退款(2),退款中(3),退款失败(4),订单完成(5) * 订单状态:// 已支付(1),已退款(3),退款中(2),退款失败5),订单完成(4) */ private Integer orderStatus; @@ -128,7 +123,16 @@ */ private String poleName; /** * 0 充电中 1充电结束 */ private Integer changingStates; /** * 用户标识 */ private String userCode; @TableField(exist = false) private static final long serialVersionUID = 1L; } dao/src/main/java/com/sandu/ximon/dao/mapper/C3mOrderMapper.java
@@ -8,8 +8,11 @@ import org.apache.ibatis.annotations.Update; /** * @Entity com.sandu.ximon.dao.domain.C3mOrder */ * @author Administrator * @description 针对表【c3_order(C3订单表)】的数据库操作Mapper * @createDate 2022-06-27 12:11:23 * @Entity com.sandu.ximon.dao.domain.C3mOrder */ @Mapper public interface C3mOrderMapper extends BaseMapper<C3mOrder> { dao/src/main/resources/mapper/C3mOrderMapper.xml
@@ -11,9 +11,9 @@ <result property="poleMac" column="pole_mac" jdbcType="VARCHAR"/> <result property="outTradeNo" column="out_trade_no" jdbcType="VARCHAR"/> <result property="orderType" column="order_type" jdbcType="VARCHAR"/> <result property="totalAmount" column="total_amount" jdbcType="DOUBLE"/> <result property="receiptAmount" column="receipt_amount" jdbcType="DOUBLE"/> <result property="refundAmount" column="refund_amount" jdbcType="DOUBLE"/> <result property="totalAmount" column="total_amount" jdbcType="DECIMAL"/> <result property="receiptAmount" column="receipt_amount" jdbcType="DECIMAL"/> <result property="refundAmount" column="refund_amount" jdbcType="DECIMAL"/> <result property="aliBuyerLogonId" column="ali_buyer_logon_id" jdbcType="VARCHAR"/> <result property="subscribeChargingCapacity" column="subscribe_charging_capacity" jdbcType="INTEGER"/> <result property="actualChargingCapacity" column="actual_charging_capacity" jdbcType="DOUBLE"/> @@ -26,6 +26,8 @@ <result property="orderStatus" column="order_status" jdbcType="INTEGER"/> <result property="c3Name" column="c3_name" jdbcType="VARCHAR"/> <result property="poleName" column="pole_name" jdbcType="VARCHAR"/> <result property="changingStates" column="changing_states" jdbcType="INTEGER"/> <result property="userCode" column="user_code" jdbcType="VARCHAR"/> </resultMap> <sql id="Base_Column_List"> @@ -35,6 +37,7 @@ ali_buyer_logon_id,subscribe_charging_capacity,actual_charging_capacity, create_timestamp,pay_timestamp,refund_timestamp, refund_msg,start_charging_timestamp,stop_charging_timestamp, order_status,c3_name,pole_name order_status,c3_name,pole_name, changing_states,user_code </sql> </mapper> ximon-admin/src/main/java/com/sandu/ximon/admin/controller/C3mOrderController.java
@@ -28,7 +28,6 @@ import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.SortedMap; @@ -68,15 +67,15 @@ */ @PostMapping("/advancePay") public ResponseVO<Object> advancePayOrder(@RequestBody PayParam param) { if (param.getTotalAmount() == 0d) { throw new BusinessException("金额不能为0"); if (param.getTotalAmount() < 0) { throw new BusinessException("金额必须大于0"); } // C3充电桩实体 C3mCharging c3m = c3mService.getC3mByPoleId(param.getPoleId()); if (null == c3m) { throw new BusinessException("未找到当前充电桩"); } C3mOrder c3mOrderEntity = c3mOrderService.advancePayOrder(param.getPoleId(), c3m, param.getOrderType() C3mOrder c3mOrderEntity = c3mOrderService.advancePayOrder(param.getPoleId(), c3m, "wxpay" , param.getTotalAmount(), param.getSubscribeChargingCapacity()); if (null == c3mOrderEntity) { throw new BusinessException("该充电桩正被使用!"); @@ -84,10 +83,11 @@ // return R.ok().put("outTradeNo",c3mOrderEntity.getOutTradeNo()) // .put("totalAmount",totalAmount); Map map = new HashMap(); map.put("outTradeNo", c3mOrderEntity.getOutTradeNo()); map.put("totalAmount", param.getTotalAmount()); return ResponseUtil.success(map); param.setOutTradeNo(c3mOrderEntity.getOutTradeNo()); param.setTotalAmount(c3mOrderEntity.getTotalAmount()); String s = WxFastPayService.parseWxAmount(param.getTotalAmount().toString()); SortedMap<Object, Object> result = wxPayService.miniAppPay("扫码充电支付(C3充电桩)", param.getOutTradeNo(),Integer.valueOf(s) , param.getPoleId()); return ResponseUtil.success(result); } @@ -151,52 +151,14 @@ return ResponseUtil.success("支付完成"); } @RequestMapping("/wxpay") public ResponseVO<Object> c3Wxpay(@RequestBody PayParam param) { //String result = wxPayService.miniAppPay(outTradeNo, totalAmount, streetlightId); SortedMap<Object, Object> result = wxPayService.appPay("扫码充电支付(C3充电桩)", param.getOutTradeNo(), param.getWxPayTotalAmount(), param.getPoleId()); return ResponseUtil.success(result); } public ResponseVO<Object> queryPayStates(@RequestBody PayParam param) { // @RequestMapping("/wxpay") // public ResponseVO<Object> c3Wxpay(@RequestBody PayParam param) { // // //String result = wxPayService.miniAppPay(outTradeNo, totalAmount, streetlightId); ////支付宝交易号 // String trade_no = WIDtrade_no.Text.Trim(); ////支付宝交易号与商户网站订单号不能同时为空 ////商户订单号 // String out_trade_no = WIDout_trade_no.Text.Trim(); ////把请求参数打包成数组 // SortedMap<Object, Object> result = wxPayService.appPay("扫码充电支付(C3充电桩)", param.getOutTradeNo(), param.getWxPayTotalAmount(), param.getPoleId(),c3mOrderEntity); // // SortedDictionary<string, string> sParaTemp = new SortedDictionary<string, string>(); // sParaTemp.Add("partner", Config.Partner); // sParaTemp.Add("_input_charset", Config.Input_charset.ToLower()); // sParaTemp.Add("service", "single_trade_query"); // sParaTemp.Add("trade_no", trade_no); // sParaTemp.Add("out_trade_no", out_trade_no); ////建立请求 // string sHtmlText = Submit.BuildRequest(sParaTemp); // ////请在这里加上商户的业务逻辑程序代码 // ////——请根据您的业务逻辑来编写程序(以下代码仅作参考)—— // // XmlDocument xmlDoc = new XmlDocument(); // try // { // xmlDoc.LoadXml(sHtmlText); // string strXmlResponse = xmlDoc.SelectSingleNode("/alipay").InnerText; // Response.Write(strXmlResponse); // } // catch (Exception exp) // { // Response.Write(sHtmlText); // } return ResponseUtil.success(null); } // return ResponseUtil.success(result); // } @RequestMapping("/queryOrder") ximon-admin/src/main/java/com/sandu/ximon/admin/param/PayParam.java
@@ -18,8 +18,14 @@ private Double totalAmount; /** * 微信支付金额 */ private Integer WxPayTotalAmount; /** * 预计充电量 */ private Integer subscribeChargingCapacity; private String outTradeNo; ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wx/WxFastPayService.java
@@ -12,7 +12,6 @@ import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult; import com.github.binarywang.wxpay.constant.WxPayConstants; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.binarywang.wxpay.service.WxPayService; import com.sandu.common.execption.BusinessException; import com.sandu.common.util.IpUtil; import com.sandu.ximon.admin.dto.wxquerydto.WxOrderDto; @@ -21,6 +20,7 @@ import lombok.AllArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.text.DecimalFormat; import java.text.SimpleDateFormat; @@ -36,15 +36,12 @@ public class WxFastPayService { private final com.github.binarywang.wxpay.service.WxPayService wxPayService; //private final WxPayProperties wxPayProperties; // public static final String WECHAT_ORDER_PAY_CALLBACK_URL = "http://49.235.239.118:20012/callback/pay/wechatCallback"; public static final String WECHAT_ORDER_PAY_CALLBACK_URL = "http://49.235.239.118:20012/callback/pay/wechatCallback"; //微信订单状态查询 public static final String WECHAT_ORDER_QUETY_URL = "https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/"; public static final String WECHAT_ORDER_QUETY = "?mchid="; private final UsrWxPayConfigService wxPayConfigService; /** @@ -57,28 +54,24 @@ */ public SortedMap<Object, Object> appPay(String body, String orderSn, int totalFee, Long poleId) { WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId); wxConfig.setMchId(wxConfig.getMchId().trim()); WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderSn); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setOpenid("otiM54x_hc_5gbhMY5aZxo7UByNo"); //wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp()); wxPayUnifiedOrderRequest.setNotifyUrl(WECHAT_ORDER_PAY_CALLBACK_URL); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.APP); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); System.out.println("********************************"); String time = String.valueOf(System.currentTimeMillis() / 1000); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) { SortedMap<Object, Object> parameters = new TreeMap<>(); /*hashMap.put("appId", wxPayUnifiedOrderResult.getAppid()); hashMap.put("nonceStr", wxPayUnifiedOrderResult.getNonceStr()); hashMap.put("prepayId", wxPayUnifiedOrderResult.getPrepayId()); // hashMap.put("package", "prepay_id=" + wxPayUnifiedOrderResult.getPrepayId()); hashMap.put("signType", WxPayConstants.SignType.MD5); hashMap.put("timeStamp", time); hashMap.put("partnerid", wxPayProperties.getMchId());*/ parameters.put("appid", wxPayUnifiedOrderResult.getAppid()); parameters.put("noncestr", wxPayUnifiedOrderResult.getNonceStr()); // 随机字符串 @@ -89,7 +82,7 @@ parameters.put("package", "Sign=WXPay"); parameters.put("timestamp", time); String sign = createSign(parameters, wxConfig.getPrivateKey()); String sign = createSign(wxConfig.getPrivateKey(), parameters); //hashMap.put("paySign", wechatSign); parameters.put("Sign", sign); @@ -123,22 +116,23 @@ /** * 微信订单状态查询 * * @param poleId * @param outTradeNo * @return */ public boolean WxOrderQuery(Long poleId,String outTradeNo){ public boolean WxOrderQuery(Long poleId, String outTradeNo) { WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId); if(wxConfig==null){ if (wxConfig == null) { throw new BusinessException("获取微信支付配置失败"); } String s = HttpUtil.get(WECHAT_ORDER_QUETY_URL + outTradeNo + WECHAT_ORDER_QUETY + wxConfig.getMchId());//WxOrderDto WxOrderDto wxOrderDto = JSON.parseObject(s, WxOrderDto.class); if(("SUCCESS").equals(wxOrderDto.getTrade_state())){ if (("SUCCESS").equals(wxOrderDto.getTrade_state())) { return true; } return false; return false; } /** @@ -146,7 +140,7 @@ * @return */ @SuppressWarnings("rawtypes") private String createSign(SortedMap<Object, Object> parameters, String Key) { private String createSign(String Key, SortedMap<Object, Object> parameters) { StringBuffer sb = new StringBuffer(); Set es = parameters.entrySet();// 所有参与传参的参数按照accsii排序(升序) Iterator it = es.iterator(); @@ -173,7 +167,7 @@ } } public WxPayRefundNotifyResult parseRefundNotifyResult( String xmlData) { public WxPayRefundNotifyResult parseRefundNotifyResult(String xmlData) { try { return wxPayService.parseRefundNotifyResult(xmlData); } catch (WxPayException e) { @@ -185,13 +179,12 @@ /** * 订单退款 只能退款一次 * * @param wxPayService * @param orderId * @param refundFee * @param callbackUrl * @return */ public boolean refundOrder( String orderId, String refundSn, Integer refundFee, String callbackUrl) { public boolean refundOrder(String orderId, String refundSn, Integer refundFee, String callbackUrl) { WxPayRefundRequest refundRequest = new WxPayRefundRequest(); refundRequest.setOutTradeNo(orderId); refundRequest.setOutRefundNo(refundSn); @@ -216,7 +209,7 @@ /** * 生成二维码付款 */ public String generateQRCodePay( String body, public String generateQRCodePay(String body, String orderId, int totalFee, String callbackUrl) { WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); @@ -292,4 +285,52 @@ return amount; } @Transactional(rollbackFor = Exception.class) public SortedMap<Object, Object> miniAppPay(String body, String orderId, int totalFee, Long poleId) { WxConfigEntity wxConfig = wxPayConfigService.getConfigByPoleId(poleId); wxConfig.setMchId(wxConfig.getMchId().trim()); WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(orderId); wxPayUnifiedOrderRequest.setTotalFee(totalFee); wxPayUnifiedOrderRequest.setOpenid("otiM54x_hc_5gbhMY5aZxo7UByNo"); wxPayUnifiedOrderRequest.setSignType(WxPayConstants.SignType.MD5); wxPayUnifiedOrderRequest.setSpbillCreateIp(IpUtil.getRealIp()); wxPayUnifiedOrderRequest.setNotifyUrl(WECHAT_ORDER_PAY_CALLBACK_URL); wxPayUnifiedOrderRequest.setTradeType(WxPayConstants.TradeType.JSAPI); System.out.println("-----------"+wxPayUnifiedOrderRequest); try { WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(wxPayUnifiedOrderRequest); String time = String.valueOf(System.currentTimeMillis() / 1000); if (WxPayConstants.ResultCode.SUCCESS.equals(wxPayUnifiedOrderResult.getResultCode())) { SortedMap<Object, Object> parameters = new TreeMap<>(); parameters.put("appid", wxPayUnifiedOrderResult.getAppid()); parameters.put("noncestr", wxPayUnifiedOrderResult.getNonceStr()); // 随机字符串 parameters.put("partnerid", wxConfig.getMchId()); // 商户id // parameters.put("out_trade_no", orderId);//商户订单号 parameters.put("prepayid", wxPayUnifiedOrderResult.getPrepayId()); parameters.put("package", "Sign=WXPay"); parameters.put("timestamp", time); String sign = createSign(wxConfig.getPrivateKey(), parameters); //hashMap.put("paySign", wechatSign); parameters.put("Sign", sign); return parameters; } else { log.error("微信支付失败,{}", wxPayUnifiedOrderResult.getErrCodeDes()); throw new BusinessException("微信支付失败," + wxPayUnifiedOrderResult); } } catch (WxPayException e) { log.error("微信支付失败,{}", e.getErrCodeDes()); throw new BusinessException("微信支付失败," + e.getErrCodeDes()); } } } ximon-admin/src/main/java/com/sandu/ximon/admin/pay/wxpay/UsrWxPayConfigService.java
@@ -41,10 +41,10 @@ } WxConfigEntity config; //未设置支付参数,则使用默认支付参数 if (pole.getClientId() == null) { config = getById(0); } config = getOne(Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getClientId, pole.getClientId()).eq(WxConfigEntity::getState, 1)); if (pole.getClientId() == null) { config = getById(15); // todo 暂时写死,后续需要改成配置文件 } if (config == null) { throw new BusinessException("用户未配置支付配置,请配置后重试"); } @@ -69,6 +69,9 @@ } else { config.setClientId(SecurityUtils.getUserId()); } } else { config.setClientId(SecurityUtils.getUserId()); config.setCreateUserId(SecurityUtils.getUserId()); } return save(config); } @@ -99,15 +102,19 @@ LambdaQueryWrapper<WxConfigEntity> wrapper = new LambdaQueryWrapper<>(); System.out.println("----------------------------" + clientService.findClientId()); PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); if (SecurityUtils.getClientId() != null) {//客户 if (clientService.findClientId()) {//二级客户 if (SecurityUtils.getClientId() != null) { //客户 if (clientService.findClientId()) { //二级客户 PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); wrapper = Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getCreateUserId, SecurityUtils.getUserId()); } else if (!clientService.findClientId()) {//一级客户 } else if (!clientService.findClientId()) { //一级客户 PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); wrapper = Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getClientId, SecurityUtils.getUserId()); } } else {//管理 } else { //管理 PageHelper.startPage(baseConditionVO.getPageNo(), baseConditionVO.getPageSize()); wrapper = Wrappers.lambdaQuery(WxConfigEntity.class); } @@ -155,28 +162,38 @@ /** * 获取当前用户所有的wx支付配置 */ List<WxConfigEntity> configList; if (SecurityUtils.getClientId() != null) { //客户 List<WxConfigEntity> configList = list(Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getClientId, SecurityUtils.getUserId()) configList = list(Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getClientId, SecurityUtils.getUserId()) .or( user -> { user.eq(WxConfigEntity::getCreateUserId, SecurityUtils.getUserId()); } )); if (configList.size() == 1 && state == 0) { throw new BusinessException("当前用户只有一个支付配置,不能停用"); } //设置当前用户所有的支付配置为停用 configList.forEach( wxConfigEntity -> { wxConfigEntity.setState(0); } ); boolean b = updateBatchById(configList); if (!b) { throw new BusinessException("更新失败"); } } else { //管理 configList = list(Wrappers.lambdaQuery(WxConfigEntity.class).eq(WxConfigEntity::getClientId, byId.getCreateUserId()) .or( user -> { user.eq(WxConfigEntity::getCreateUserId, SecurityUtils.getUserId()); } )); } if (configList.size() == 1 && state == 0) { throw new BusinessException("当前用户只有一个支付配置,不能停用"); } //设置当前用户所有的支付配置为停用 configList.forEach( wxConfigEntity -> { wxConfigEntity.setState(0); } ); boolean b = updateBatchById(configList); if (!b) { throw new BusinessException("更新失败"); } WxConfigEntity config = new WxConfigEntity(); config.setConfigId(id); config.setState(state); ximon-admin/src/main/java/com/sandu/ximon/admin/service/C3mOrderService.java
@@ -138,9 +138,9 @@ ); // 推送到自动查询模块,进行扫描启动 orderQueryListener.startScan(OrderScanType.C3M.getType()); if(b){ save(c3mOrderEntity); } // if(b){ // save(c3mOrderEntity); // } return b ? c3mOrderEntity : null; } @@ -151,6 +151,7 @@ WxPayOrderNotifyResult wxPayOrderNotifyResult = fastPayService.parseOrderNotifyResult(xmlData); String orderSn = wxPayOrderNotifyResult.getOutTradeNo(); String transactionId = wxPayOrderNotifyResult.getOutTradeNo(); Integer totalFee = wxPayOrderNotifyResult.getTotalFee(); C3mOrder userOrder = getByOrderSn(orderSn); if (userOrder == null) { return WxPayNotifyResponse.fail("订单不存在 sn=" + orderSn); @@ -166,14 +167,6 @@ if (!updateById(userOrder)) { return WxPayNotifyResponse.fail("更新数据已失效"); } // UserPayRecord userPayRecord = new UserPayRecord(); // userPayRecord.setOrderId(userOrder.getId()); // userPayRecord.setPayAmount(userOrder.getTotalPrice()); // userPayRecord.setPayType(PayTypeEnums.WECHAT.getCode()); // userPayRecord.setPayDate(userOrder.getPayTime()); // userPayRecord.setUserId(userOrder.getUserId()); // userPayRecordService.save(userPayRecord); return WxPayNotifyResponse.success("更新数据成功"); } ximon-admin/src/main/resources/application-local.yml
@@ -39,7 +39,7 @@ enable: true listenter: isOpen: true isOpen: false minio: endpoint: 47.106.172.9