diff --git a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java index 37d5621b5..3944ed2c4 100644 --- a/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java +++ b/jsowell-admin/src/main/java/com/jsowell/api/uniapp/PayController.java @@ -1,6 +1,5 @@ package com.jsowell.api.uniapp; -import com.alibaba.fastjson2.JSON; import com.alibaba.fastjson2.JSONObject; import com.google.common.collect.ImmutableMap; import com.huifu.adapay.core.AdapayCore; @@ -9,12 +8,14 @@ import com.jsowell.common.annotation.Anonymous; import com.jsowell.common.core.controller.BaseController; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.ykc.ReturnCodeEnum; +import com.jsowell.common.enums.ykc.ScenarioEnum; import com.jsowell.common.exception.BusinessException; import com.jsowell.common.response.RestApiResponse; import com.jsowell.common.util.StringUtils; import com.jsowell.common.util.id.IdUtils; import com.jsowell.pile.dto.GetPayModeDTO; import com.jsowell.pile.dto.PayOrderDTO; +import com.jsowell.pile.dto.PaymentScenarioDTO; import com.jsowell.pile.dto.WeixinPayDTO; import com.jsowell.pile.vo.uniapp.PayModeVO; import com.jsowell.service.MemberService; @@ -72,48 +73,15 @@ public class PayController extends BaseController { } dto.setOpenId(openId); // 充值余额 附加参数 - Map weixinMap = memberService.rechargeBalance(dto); + PaymentScenarioDTO paymentScenarioDTO = new PaymentScenarioDTO(); + paymentScenarioDTO.setType(ScenarioEnum.BALANCE.getValue()); + paymentScenarioDTO.setMemberId(memberId); + dto.setAttach(JSONObject.toJSONString(paymentScenarioDTO)); + dto.setDescription("会员充值余额"); + Map weixinMap = orderService.weixinPayV3(dto); response = new RestApiResponse<>(ImmutableMap.of("weixinMap", weixinMap)); } catch (Exception e) { - logger.error("会员充值余额 error", e); - response = new RestApiResponse<>(ReturnCodeEnum.CODE_MEMBER_RECHARGE_BALANCE_ERROR); - } - return response; - } - - /** - * 会员充值余额 - * http://localhost:8080/uniapp/pay/rechargeBalance - * - * @param request - * @param dto - * @return - */ - @PostMapping("/rechargeBalance") - public RestApiResponse rechargeBalance(HttpServletRequest request, @RequestBody WeixinPayDTO dto) { - logger.info("会员充值余额 param:{}", dto.toString()); - RestApiResponse response; - try { - if (StringUtils.isBlank(dto.getCode()) || StringUtils.isBlank(dto.getAmount())) { - return new RestApiResponse<>(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); - } - // 鉴权 - String memberId = getMemberIdByAuthorization(request); - if (StringUtils.isBlank(memberId)) { - throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR); - } - dto.setMemberId(memberId); - String openId = memberService.getOpenIdByCode(dto.getCode()); - if (StringUtils.isBlank(openId)) { - throw new BusinessException(ReturnCodeEnum.CODE_GET_OPEN_ID_BY_CODE_ERROR); - } - dto.setOpenId(openId); - // 充值余额 附加参数 - Map weixinMap = memberService.rechargeBalanceWithAdapay(dto); - response = new RestApiResponse<>(ImmutableMap.of("weixinMap", weixinMap)); - } catch (Exception e) { - logger.error("会员充值余额 error", e); - response = new RestApiResponse<>(ReturnCodeEnum.CODE_MEMBER_RECHARGE_BALANCE_ERROR); + response = new RestApiResponse<>(); } return response; } @@ -150,6 +118,7 @@ public class PayController extends BaseController { if (isLock) { map = orderService.payOrder(dto); } + // Map map = orderService.payOrder(dto); response = new RestApiResponse<>(map); } catch (BusinessException e) { logger.warn("支付订单 warn param:{}", dto.toString(), e); @@ -167,55 +136,6 @@ public class PayController extends BaseController { return response; } - /** - * adapay支付订单 - * http://localhost:8080/uniapp/pay/payOrderWithAdapay - * - * @param request - * @param dto - * @return - */ - @PostMapping("/payOrderWithAdapay") - public RestApiResponse payOrderWithAdapay(HttpServletRequest request, @RequestBody PayOrderDTO dto) { - logger.info("adapay支付订单 param:{}", dto.toString()); - RestApiResponse response; - - // 支付订单加锁 - String lockKey = "pay_order_" + dto.getOrderCode(); - String lockValue = IdUtils.fastUUID(); - try { - String memberId = getMemberIdByAuthorization(request); - if (StringUtils.isBlank(memberId)) { - throw new BusinessException(ReturnCodeEnum.CODE_TOKEN_ERROR); - } - if (dto.getPayAmount() == null) { - throw new BusinessException(ReturnCodeEnum.CODE_PARAM_NOT_NULL_ERROR); - } - dto.setMemberId(memberId); - dto.setLockValue(lockValue); - // redis锁 - Boolean isLock = redisCache.lock(lockKey, lockValue, 60); - Map map = null; - if (isLock) { - map = orderService.payOrderWithAdapay(dto); - } - response = new RestApiResponse<>(map); - } catch (BusinessException e) { - logger.warn("adapay支付订单 warn param:{}", dto.toString(), e); - response = new RestApiResponse<>(e.getCode(), e.getMessage()); - } catch (Exception e) { - logger.error("adapay支付订单 error param:{}", dto.toString(), e); - response = new RestApiResponse<>(ReturnCodeEnum.CODE_ORDER_PAY_ERROR); - } finally { - // 支付订单解锁 - if (lockValue.equals(redisCache.getCacheObject(lockKey).toString())) { - redisCache.unLock(lockKey); - } - } - logger.info("adapay支付订单 result:{}", JSONObject.toJSONString(response)); - return response; - } - /** * 7003 获取支付方式 * http://localhost:8080/uniapp/pay/getPayMode @@ -261,7 +181,6 @@ public class PayController extends BaseController { /** * 微信退款回调接口 - * * @param request * @param body * @return @@ -314,10 +233,11 @@ public class PayController extends BaseController { /** * 汇付支付回调 - * https://api.jsowellcloud.com/uniapp/pay/refund + * https://api.jsowellcloud.com/uniapp/pay/adapayCallback */ @PostMapping("/adapayCallback") public void callback(HttpServletRequest request) { + logger.info("汇付支付回调 request:{}", JSONObject.toJSONString(request)); try { //验签请参data String data = request.getParameter("data"); @@ -327,18 +247,17 @@ public class PayController extends BaseController { boolean checkSign; //验签请参publicKey String publicKey = AdapayCore.PUBLIC_KEY; - logger.info("汇付支付回调验签请参:data={}sign={}", data, sign); + logger.info("汇付支付回调验签请参data={}, sign={}", data, sign); //验签 checkSign = AdapaySign.verifySign(data, sign, publicKey); if (checkSign) { //验签成功逻辑 - System.out.println("汇付支付回调成功返回数据data:" + data); + logger.info("汇付支付回调成功返回数据data:{}", data); } else { //验签失败逻辑 } } catch (Exception e) { - logger.error("汇付支付回调失败 request:{}", JSON.toJSONString(request)); + logger.error("汇付支付回调失败 error", e); } } - } diff --git a/jsowell-admin/src/test/java/SpringBootTestController.java b/jsowell-admin/src/test/java/SpringBootTestController.java index 9989d5a49..2f427fa6e 100644 --- a/jsowell-admin/src/test/java/SpringBootTestController.java +++ b/jsowell-admin/src/test/java/SpringBootTestController.java @@ -1,12 +1,7 @@ import com.alibaba.fastjson2.JSONObject; import com.fasterxml.jackson.core.JsonProcessingException; import com.google.common.collect.ImmutableMap; -import com.google.common.collect.Maps; -import com.huifu.adapay.core.exception.BaseAdaPayException; -import com.huifu.adapay.model.Payment; import com.jsowell.JsowellApplication; -import com.jsowell.adapay.common.CreateAdaPaymentParam; -import com.jsowell.adapay.service.AdapayService; import com.jsowell.common.constant.CacheConstants; import com.jsowell.common.constant.Constants; import com.jsowell.common.core.domain.ykc.LoginRequestData; @@ -14,15 +9,12 @@ import com.jsowell.common.core.domain.ykc.TransactionRecordsData; import com.jsowell.common.core.redis.RedisCache; import com.jsowell.common.enums.ykc.OrderStatusEnum; import com.jsowell.common.exception.BusinessException; -import com.jsowell.common.util.BytesUtil; -import com.jsowell.common.util.DateUtils; -import com.jsowell.common.util.DictUtils; -import com.jsowell.common.util.JWTUtils; -import com.jsowell.common.util.StringUtils; -import com.jsowell.common.util.YKCUtils; +import com.jsowell.common.util.*; +import com.jsowell.common.util.http.HttpUtils; import com.jsowell.common.util.id.SnUtils; import com.jsowell.common.util.id.SnowflakeIdWorker; import com.jsowell.common.util.ip.AddressUtils; +import com.jsowell.common.util.lianlian.LianLianUtils; import com.jsowell.netty.command.ykc.IssueQRCodeCommand; import com.jsowell.netty.command.ykc.ProofreadTimeCommand; import com.jsowell.netty.handler.HeartbeatRequestHandler; @@ -34,14 +26,7 @@ import com.jsowell.pile.domain.PileBillingDetail; import com.jsowell.pile.domain.PileBillingTemplate; import com.jsowell.pile.domain.PileStationInfo; import com.jsowell.pile.domain.WxpayCallbackRecord; -import com.jsowell.pile.dto.BasicPileDTO; -import com.jsowell.pile.dto.BatchCreatePileDTO; -import com.jsowell.pile.dto.ImportBillingTemplateDTO; -import com.jsowell.pile.dto.QueryOrderDTO; -import com.jsowell.pile.dto.QueryPileDTO; -import com.jsowell.pile.dto.QueryStationDTO; -import com.jsowell.pile.dto.RefundableWxPayOrderData; -import com.jsowell.pile.dto.WeixinPayDTO; +import com.jsowell.pile.dto.*; import com.jsowell.pile.mapper.MemberBasicInfoMapper; import com.jsowell.pile.mapper.PileBillingTemplateMapper; import com.jsowell.pile.service.IOrderBasicInfoService; @@ -60,6 +45,7 @@ import com.jsowell.service.MemberService; import com.jsowell.service.OrderService; import com.jsowell.service.PileRemoteService; import com.jsowell.service.PileService; +import com.jsowell.thirdparty.domain.StationInfo; import com.jsowell.thirdparty.service.LianLianService; import com.jsowell.wxpay.common.WeChatPayParameter; import com.jsowell.wxpay.dto.AppletTemplateMessageSendDTO; @@ -72,7 +58,6 @@ import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.cglib.beans.BeanMap; import org.springframework.test.context.ActiveProfiles; import org.springframework.test.context.junit4.SpringRunner; import org.springframework.util.StopWatch; @@ -80,13 +65,7 @@ import org.springframework.util.StopWatch; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Collections; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.util.*; @ActiveProfiles("dev") @SpringBootTest(classes = JsowellApplication.class, webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) @@ -161,9 +140,6 @@ public class SpringBootTestController { @Autowired private IPileAuthCardService pileAuthCardService; - @Autowired - private AdapayService adapayService; - @Autowired private LianLianService lianLianService; @@ -171,51 +147,6 @@ public class SpringBootTestController { static final String ALGORITHM_MAC = "HmacMD5"; - @Test - public void testCreateAdapay() { - adapayService.createTransactionObject(); - } - - /** - * 创建交易对象 - */ - @Test - public void test() { - // 请求参数 - Map paymentParams = Maps.newHashMap(); - paymentParams.put("order_no", "fasdftawefawefawsdcaseg"); - paymentParams.put("pay_amt", "0.05"); - paymentParams.put("app_id", "app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa"); - paymentParams.put("pay_channel", "wx_lite"); - paymentParams.put("goods_title", "Your goods_title"); - paymentParams.put("goods_desc", "Your goods_desc"); - paymentParams.put("description", "payment Discription"); - Map expendMap = Maps.newHashMap(); - expendMap.put("open_id", "o4REX5PYTXvwl_YXs_aGrVAqCh_c"); - paymentParams.put("expend", expendMap); - // paymentParams.put("div_members", [{"amount":"0.05", "fee_flag":"Y", "member_id":"member_id_test"}]); - // 调用创建方法,获取 Payment对象_ - - // 封装对象 - CreateAdaPaymentParam createAdaPaymentParam = new CreateAdaPaymentParam(); - createAdaPaymentParam.setOrder_no("fasdftawefawefawsdcaseg123"); - createAdaPaymentParam.setPay_amt("0.05"); - createAdaPaymentParam.setApp_id("app_d0c80cb1-ffc8-48cb-a030-fe9bec823aaa"); // todo 后面移动到配置文件中 - createAdaPaymentParam.setPay_channel("wx_lite"); // todo 如果以后有支付宝等别的渠道,这里需要做修改,判断是什么渠道的请求 - createAdaPaymentParam.setGoods_title("充电费用1"); - createAdaPaymentParam.setGoods_desc("充电费用2"); - createAdaPaymentParam.setDescription("充电费用3"); - createAdaPaymentParam.setExpend(JSONObject.toJSONString( ImmutableMap.of("open_id", "o4REX5PYTXvwl_YXs_aGrVAqCh_c"))); - try { - // Map response = Payment.create(paymentParams); - Map response = Payment.create(BeanMap.create(createAdaPaymentParam)); - System.out.println(response); - } catch (BaseAdaPayException e) { - e.printStackTrace(); - } - } - - @Test public void testupdateElecAmount() { orderBasicInfoService.updateElecAmount(); @@ -227,29 +158,31 @@ public class SpringBootTestController { System.out.println(pileAuthCard); } - // @Test - // public void testLianLian(){ - // // 获取令牌 - // LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); - // dto.setOperatorId("987654321"); - // dto.setOperatorSecret("1234567890abcdef"); - // String token = lianLianService.getToken(dto); - // System.out.println("token:" + token); - // - // - // LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder() - // .OperatorID("987654321") - // .DataSecret("1234567890abcdef") - // .DataSecretIV("1234567890abcdef") - // .SigSecret("1234567890abcdef") - // .token(token) - // .stationId(2L) - // - // .build(); - // lianLianService.pushStationInfo(dto1); - // - // - // } + @Test + public void testLianLian(){ + // // 获取令牌 + // LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); + // dto.setOperatorId("987654321"); + // dto.setOperatorSecret("1234567890abcdef"); + // String token = lianLianService.getToken(dto); + // System.out.println("token:" + token); + // + // + // LianLianPushStationInfoDTO dto1 = LianLianPushStationInfoDTO.builder() + // .OperatorID("987654321") + // .DataSecret("1234567890abcdef") + // .DataSecretIV("1234567890abcdef") + // .SigSecret("1234567890abcdef") + // .token(token) + // .stationId(2L) + // + // .build(); + // lianLianService.pushStationInfo(dto1); + + lianLianService.pushConnectorStatus("8800000000000101", "1"); + + + } @Test @@ -842,7 +775,7 @@ public class SpringBootTestController { } @Test - public void testGetMemberToken() { + public void testGetMemberToken(){ String memberId = JWTUtils.getMemberId("eyJhbGciOiJIUzI1NiJ9.eyJpYXQiOjE2NzY1MTY5MzgsImV4cCI6MTY3OTEwODkzOH0.4MwhZIOpnCfQloR7zEm2hwPOh2yyI2qxbBbTcv_SnZ4"); System.out.println(memberId); } diff --git a/jsowell-pile/pom.xml b/jsowell-pile/pom.xml index d399d27d5..1b9c6df26 100644 --- a/jsowell-pile/pom.xml +++ b/jsowell-pile/pom.xml @@ -92,6 +92,16 @@ com.alibaba.fastjson2 fastjson2 + + + com.huifu.adapay.core + adapay-core-sdk + + + + com.huifu.adapay + adapay-java-sdk + diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileConnectorInfoService.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileConnectorInfoService.java index 798420031..5b100c5e3 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileConnectorInfoService.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/IPileConnectorInfoService.java @@ -91,7 +91,9 @@ public interface IPileConnectorInfoService { */ int updateConnectorStatus(String connectorCode, String status); - /** + String pushConnectorStatus(String pileConnectorCode, String status); + + /** * 通过桩编号修改枪口状态 * 仅用于登录逻辑使用 * @param pileSn 桩编号 diff --git a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java index bda70444c..0ab5f6dd7 100644 --- a/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java +++ b/jsowell-pile/src/main/java/com/jsowell/pile/service/impl/PileConnectorInfoServiceImpl.java @@ -439,6 +439,11 @@ public class PileConnectorInfoServiceImpl implements IPileConnectorInfoService { return response; } + @Override + public String pushConnectorStatus(String pileConnectorCode, String status) { + return null; + } + /** * 查询充电枪口的实时数据 */ @@ -527,6 +532,9 @@ public class PileConnectorInfoServiceImpl implements IPileConnectorInfoService { num = pileConnectorInfoMapper.updateConnectorStatus(pileConnectorCode, status); deleteRedisByPileSn(pileSn); redisCache.setCacheObject(redisKey, status); + + // 推送联联平台 设备状态变化推送接口 ConnectorStatusInfo + } return num; } diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/domain/ConnectorStatusInfo.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/domain/ConnectorStatusInfo.java index c7a1eebfc..553c93b1b 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/domain/ConnectorStatusInfo.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/domain/ConnectorStatusInfo.java @@ -1,5 +1,6 @@ package com.jsowell.thirdparty.domain; +import com.alibaba.fastjson2.annotation.JSONField; import lombok.AllArgsConstructor; import lombok.Builder; import lombok.Data; @@ -17,7 +18,8 @@ public class ConnectorStatusInfo { * 充电设备接口编码 Y * 充电设备接口编码,同一对接平台内唯一 */ - private String ConnectorID; + @JSONField(name = "ConnectorID") + private String connectorID; /** * 充电设备接口状态 Y @@ -28,7 +30,8 @@ public class ConnectorStatusInfo { * 4:占用(预约锁定) * 255:故障 */ - private String Status; + @JSONField(name = "Status") + private String status; /** * 车位状态(0-未知;10-空闲;50-占用) N diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/LianLianService.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/LianLianService.java index 8af4b5414..73ac3b631 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/LianLianService.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/LianLianService.java @@ -16,7 +16,7 @@ public interface LianLianService { /** * 根据充电站id,推送充电站信息 - * @param stationId + * @param dto */ void pushStationInfo(LianLianPushStationInfoDTO dto); @@ -78,4 +78,12 @@ public interface LianLianService { * @return */ String getToken(LianLianGetTokenDTO dto); + + /** + * 推送联联平台 设备状态变化推送 + * @param pileConnectorCode + * @param status + * @return + */ + String pushConnectorStatus(String pileConnectorCode, String status); } diff --git a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/impl/LianLianServiceImpl.java b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/impl/LianLianServiceImpl.java index 809994022..0ffd168f9 100644 --- a/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/impl/LianLianServiceImpl.java +++ b/jsowell-thirdparty/src/main/java/com/jsowell/thirdparty/service/impl/LianLianServiceImpl.java @@ -55,6 +55,12 @@ import java.util.stream.Collectors; @Service public class LianLianServiceImpl implements LianLianService { + private static final String TEST_URL = "http://testdataexchange.evchargeonline.com:82/shevcs/v1/"; + private static final String OPERATOR_ID = "987654321"; + private static final String OPERATOR_SECRET = "1234567890abcdef"; + private static final String SIG_SECRET = "1234567890abcdef"; // 签名秘钥 + private static final String DATA_SECRET = "1234567890abcdef"; // 消息密钥 + private static final String DATA_SECRETIV = "1234567890abcdef"; // 消息密钥初始化向量 @Autowired private IPileMerchantInfoService pileMerchantInfoService; @@ -152,7 +158,7 @@ public class LianLianServiceImpl implements LianLianService { } // 调用联联平台接口 - String url = "http://testdataexchange.evchargeonline.com:82/shevcs/v1/" + "notification_stationInfo"; + String url = TEST_URL + "notification_stationInfo"; String jsonStr = JSONObject.toJSONString(info); JSONObject data = new JSONObject(); @@ -169,8 +175,7 @@ public class LianLianServiceImpl implements LianLianService { } public static void main(String[] args){ - BigDecimal bigDecimal = new BigDecimal("7").setScale(1, BigDecimal.ROUND_HALF_UP); - System.out.println(bigDecimal); + } /** @@ -564,7 +569,7 @@ public class LianLianServiceImpl implements LianLianService { } /** - * 获取令牌 + * 从联联平台获取令牌 * @param dto * @return */ @@ -575,7 +580,7 @@ public class LianLianServiceImpl implements LianLianService { String token = ""; try { //测试用请求地址 - String requestUrl = "http://testdataexchange.evchargeonline.com:82/shevcs/v1/query_token"; + String requestUrl = TEST_URL + "query_token"; //请求data Map data = new HashMap<>(); @@ -617,6 +622,38 @@ public class LianLianServiceImpl implements LianLianService { return token; } + /** + * 联联平台推送 设备状态变化推送 + * @param pileConnectorCode + * @param status + * @return + */ + @Override + public String pushConnectorStatus(String pileConnectorCode, String status) { + String url = TEST_URL + "notification_stationStatus"; + + // 获取令牌 + LianLianGetTokenDTO dto = new LianLianGetTokenDTO(); + dto.setOperatorId(OPERATOR_ID); + dto.setOperatorSecret(OPERATOR_SECRET); + String token = getToken(dto); + if (StringUtils.isBlank(token)) { + return null; + } + ConnectorStatusInfo info = ConnectorStatusInfo.builder() + .connectorID(pileConnectorCode) + .status(status) + .build(); + // 调用联联平台接口 + JSONObject json = new JSONObject(); + json.put("ConnectorStatusInfo", info); + String jsonString = JSONObject.toJSONString(json); + + String result = HttpRequestUtil.sendPost(token, jsonString, url, DATA_SECRET, DATA_SECRETIV, OPERATOR_ID, SIG_SECRET); + + return result; + } + // TODO 推送停止充电结果 notification_stop_charge_result // TODO 推送充电订单信息 notification_charge_order_info