From 584d854f42d54a6e65d54f8f18191f3aba7e1e0d Mon Sep 17 00:00:00 2001 From: yuyang <2265829957@qq.com> Date: Fri, 15 Oct 2021 17:14:02 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=AF=E4=BB=98=E5=AE=9D=E8=AE=A2=E5=8D=95?= =?UTF-8?q?=E6=AD=A3=E5=BC=8F=E6=96=B9=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/XhpcChargingPileServiceImpl.java | 1 + .../XhpcChargingStationServiceImpl.java | 60 +++++- .../order/api/XhpcPileOrderController.java | 1 + .../XhpcHistoryOrderController.java | 17 +- .../impl/XhpcRealTimeOrderServiceImpl.java | 14 +- .../controller/AlipayPaymentController.java | 105 +++++++++- .../controller/XhpcRefundAuditController.java | 181 ++++++++++++++---- .../impl/XhpcRefundAuditServiceImpl.java | 3 + .../src/main/resources/bootstrap.yml | 14 +- .../controller/XhpcAppUserController.java | 48 ++++- .../src/main/resources/bootstrap.yml | 10 +- 11 files changed, 377 insertions(+), 77 deletions(-) diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingPileServiceImpl.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingPileServiceImpl.java index bcdc5c94..1e64797b 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingPileServiceImpl.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingPileServiceImpl.java @@ -81,6 +81,7 @@ public class XhpcChargingPileServiceImpl implements IXhpcChargingPileService { Long rateModelId = Long.parseLong(StringUtils.valueOf(stringObjectMap.get("rateModelId"))); xhpcChargingPile.setRateModelId(rateModelId); String serialNumber = xhpcChargingPile.getSerialNumber(); + xhpcChargingPile.setCreateTime(new Date()); //判断桩编号是否重复 int count = xhpcChargingPileMapper.getXhpcChargingPileSerialNumberCount(serialNumber); if (count > 0) { diff --git a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java index ab29ef57..df154580 100644 --- a/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java +++ b/xhpc-modules/xhpc-charging-station/src/main/java/com/xhpc/charging/station/service/XhpcChargingStationServiceImpl.java @@ -22,6 +22,7 @@ import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.transaction.interceptor.TransactionAspectSupport; import java.math.BigDecimal; import java.util.*; @@ -395,21 +396,37 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi if(list.size() == 1){ if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){ + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue); } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues); if(!endTime.equals("24:00:00")) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue); } }else{ if(k == 0){ if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){ + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue); } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues); }else if(k < list.size()-1){ String endTimeK = list.get(k - 1).getEndTime(); if (!endTimeK.equals(startTime)) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue); } //并把本条数据也添加上 @@ -417,12 +434,20 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi }else{ String endTimeK = list.get(k - 1).getEndTime(); if (!endTimeK.equals(startTime)) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } //添加一条默认费率时段 sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue); } //并把本条数据也添加上 sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues); if (!endTime.equals("24:00:00")) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } //添加一条默认费率时段 sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue); } @@ -619,7 +644,7 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi //终端状态用 redis数据 if(map.get("serialNumber") !=null){ Map cacheMap =redisService.getCacheMap("gun:"+map.get("serialNumber").toString()); - if(cacheMap !=null){ + if(!cacheMap.isEmpty()){ if("空闲".equals(cacheMap.get("status"))){ map.put("status", 2); }else if ("离线".equals(cacheMap.get("status"))){ @@ -657,10 +682,10 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi } } }else{ - map.put("status", 1); + map.put("status", 5); } }else{ - map.put("status", 1); + map.put("status", 5); } } } @@ -691,11 +716,6 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi if (xhpcChargingStationDto.getChargingStationId() == null) { return AjaxResult.error("1001", "电站id为空"); } - //电站id不能为空 - if (xhpcChargingStationDto.getDefaultPeriodId() == null) { - return AjaxResult.error("1001", "默认时段费率id为空"); - } - //判断费率和费率时间段 是否有值 if (xhpcChargingStationDto.getXhpcRateList() == null && xhpcChargingStationDto.getXhpcRateList().size() == 0) { return AjaxResult.error(1001, "费率不能为空"); @@ -822,21 +842,37 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi if(list.size() == 1){ if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){ + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue); } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues); if(!endTime.equals("24:00:00")) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue); } }else{ if(k == 0){ if(!"00:00:00".equals(xhpcRateTimeDto.getStartTime())){ + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort= addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, "00:00:00", startTime, sort, 2, rateValue); } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues); }else if(k < list.size()-1){ String endTimeK = list.get(k - 1).getEndTime(); if (!endTimeK.equals(startTime)) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue); } //并把本条数据也添加上 @@ -844,12 +880,20 @@ public class XhpcChargingStationServiceImpl implements IXhpcChargingStationServi }else{ String endTimeK = list.get(k - 1).getEndTime(); if (!endTimeK.equals(startTime)) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } //添加一条默认费率时段 sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTimeK, startTime, sort, 2, rateValue); } //并把本条数据也添加上 sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodIdMap, startTime, endTime, sort, 1, rateValues); if (!endTime.equals("24:00:00")) { + if(rateValue ==null || "".equals(rateValue)){ + TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); + return AjaxResult.error("请填写默认时间段费率"); + } //添加一条默认费率时段 sort = addXhpcRateTime(chargingStationId, rateModelId, defaultPeriodId, endTime, "24:00:00", sort, 2, rateValue); } diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java index 70eb9d1e..c6c8efdc 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/api/XhpcPileOrderController.java @@ -195,6 +195,7 @@ public class XhpcPileOrderController extends BaseController { JSONObject json = new JSONObject(map); //消息对了内容 webSocketService.getMessage(userId+"",json.toString()); + logger.info("桩实时数据发送WebSocket成功>>>>>orderNo:" + orderNo); } catch (Exception e) { Map map = new HashMap<>(); map.put("code", 500); diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java index b8e3731e..e062ad08 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/controller/XhpcHistoryOrderController.java @@ -77,18 +77,17 @@ public class XhpcHistoryOrderController extends BaseController { */ @GetMapping("/test3") @Scheduled(cron = "0 0 12 * * ?") - public void test3() { + public void test3(){ add(100,3); } - /** * 场站统计 */ @GetMapping("/test2") @Scheduled(cron = "0 0 11 * * ?") - public void test2() { + public void test2(){ add(100,2); - } + } /** * 日期统计 @@ -99,7 +98,7 @@ public class XhpcHistoryOrderController extends BaseController { //获取500条待统计历史订单 //跨时段,跨费率,计费模型 //日期统计 - int type = 1; + int type =1; List list = xhpcHistoryOrderService.getStatistisList(100,type); //是否跨天 if(list !=null && list.size()>0){ @@ -159,7 +158,7 @@ public class XhpcHistoryOrderController extends BaseController { } //修改历史订单表状态 - XhpcHistoryOrder xhpcHistoryOrder = new XhpcHistoryOrder(); + XhpcHistoryOrder xhpcHistoryOrder =new XhpcHistoryOrder(); xhpcHistoryOrder.setHistoryOrderId(xhpc.getHistoryOrderId()); xhpcHistoryOrder.setState(type + 1); xhpcHistoryOrderService.update(xhpcHistoryOrder); @@ -169,11 +168,11 @@ public class XhpcHistoryOrderController extends BaseController { } /** - * 小时统计,每分钟执行 + * 小时统计 */ @GetMapping("/test") - @Scheduled(cron = "0 * * * * ?") - public void test() { + @Scheduled(cron = "0 */1 * * * ?") + public void test(){ //获取500条待统计历史订单 //跨时段,跨费率,计费模型 //小时统计 diff --git a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java index b446dadc..9d674cf1 100644 --- a/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java +++ b/xhpc-modules/xhpc-order/src/main/java/com/xhpc/order/service/impl/XhpcRealTimeOrderServiceImpl.java @@ -280,7 +280,13 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { Map operatorMessage = xhpcChargeOrderService.getOperatorMessage(xhpcChargeOrder.getChargingStationId()); if(operatorMessage !=null){ if(operatorMessage.get("operatorIdEvcs")!=null){ - xhpcHistoryOrder.setOperatorIdEvcs(operatorMessage.get("operatorIdEvcs").toString()); + + if(operatorMessage.get("operatorIdEvcs") !=null && "".equals(operatorMessage.get("operatorIdEvcs").toString())){ + String stw = operatorMessage.get("operatorIdEvcs").toString(); + if(stw.length()>9){ + xhpcHistoryOrder.setOperatorIdEvcs(stw.substring(8, stw.length() - 1)); + } + } } if(operatorMessage.get("maintenanceCommissionRate") !=null && operatorMessage.get("commissionType") !=null && operatorMessage.get("platformCommissionRate") !=null){ Integer commissionType = (Integer) operatorMessage.get("commissionType"); @@ -512,8 +518,8 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { xhpcOrderRedisRecord.setCreateTime(date); xhpcChargeOrderService.addXhpcOrderRedisRecord(xhpcOrderRedisRecord); //删除redis - redisService.deleteObject("order:"+orderNo); - redisService.deleteObject("order:"+orderNo+".lord"); + //redisService.deleteObject("order:"+orderNo); + //redisService.deleteObject("order:"+orderNo+".lord"); logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); logger.info("<<<<<<<<<<<<<<<<订单结束回调成功>>>>>>>>>>>>>>>>>"); @@ -629,7 +635,7 @@ public class XhpcRealTimeOrderServiceImpl implements IXhpcRealTimeOrderService { map.put("message", "实时数据"); map.put("userId", xhpcChargeOrder.getUserId()); Map data = new HashMap<>(); - data.put("amountCharged",divide); + data.put("amountCharged",amountCharged); data.put("gunNumber",gunId); data.put("chargingOrderId",chargeOrderId); data.put("chargingTimeNumber",cacheRealtimeData.getChargingTime()); diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java index df40d83d..33dbe2bb 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/AlipayPaymentController.java @@ -4,8 +4,12 @@ import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; +import com.alipay.api.CertAlipayRequest; import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.AlipayTradeAppPayModel; import com.alipay.api.internal.util.AlipaySignature; +import com.alipay.api.internal.util.AntCertificationUtil; +import com.alipay.api.request.AlipayTradeAppPayRequest; import com.alipay.api.request.AlipayTradeCreateRequest; import com.alipay.api.response.AlipayTradeCreateResponse; import com.xhpc.common.api.PowerPileService; @@ -37,10 +41,7 @@ import javax.servlet.http.HttpServletRequest; import java.math.BigDecimal; import java.net.URLDecoder; import java.net.URLEncoder; -import java.util.Date; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; +import java.util.*; @RestController @@ -91,10 +92,32 @@ public class AlipayPaymentController { //生成充值订单 XhpcRechargeOrder xhpcRechargeOrder = iXhpcRechargeOrderService.addRechargeOrder(userId, BigDecimal.valueOf(Double.parseDouble(amount)), "2", orderNumber); String attach = attachYu(StringUtils.valueOf(xhpcRechargeOrder.getRechargeOrderId()), StringUtils.valueOf(amount), null, orderNumber); - AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", environment.getProperty("ALIPAYAPPID"), environment.getProperty("ALIPAYPRIVATEKEY"), "json", "utf-8", environment.getProperty("ALIPAYPUBLICKEY"), "RSA2"); + + /** 初始化 **/ + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + /** 支付宝网关 **/ + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/ + certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID")); + /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/ + certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY")); + /** 应用公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setCertPath(environment.getProperty("CERTPATH")); + /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setAlipayPublicCertPath(environment.getProperty("PUBLICCERTPATH")); + /** 支付宝根证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setRootCertPath(environment.getProperty("ROOTCRETPATH")); + /** 设置签名类型 **/ + certAlipayRequest.setSignType("RSA2"); + /** 设置请求格式,固定值json **/ + certAlipayRequest.setFormat("json"); + /** 设置编码格式 **/ + certAlipayRequest.setCharset("UTF-8"); + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + //AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", environment.getProperty("ALIPAYAPPID"), environment.getProperty("ALIPAYPRIVATEKEY"), "json", "utf-8", environment.getProperty("ALIPAYPUBLICKEY"), "RSA2"); AlipayTradeCreateRequest request = new AlipayTradeCreateRequest(); String encode = URLEncoder.encode(attach); - System.out.println("encode :"+encode); + request.setBizContent("{" + "\"out_trade_no\":\""+orderNumber+"\"," + "\"total_amount\":"+amount+"," + "\"subject\":\"小华充电\"," + @@ -105,7 +128,7 @@ public class AlipayPaymentController { request.setNotifyUrl(environment.getProperty("ALIPAYPSERVERDOMAIN")); try { //这里和普通的接口调用不同,使用的是sdkExecute - AlipayTradeCreateResponse response = alipayClient.execute(request); + AlipayTradeCreateResponse response = alipayClient.certificateExecute(request); if(response.isSuccess()){ String trade_no = response.getTradeNo();// 获取返回的tradeNO。 return AjaxResult.success(trade_no); @@ -132,8 +155,11 @@ public class AlipayPaymentController { logger.info("<<<<<<<<<<<>>>>>>>>"+params); logger.info("<<<<<<<<<<<<>>>>>>>>>"); try{ + String publiccertpath = getAlipayPublicKey(environment.getProperty("PUBLICCERTPATH")); + logger.info("<<<<<<<<<<<<支付宝公钥证书>>>>>>>>>"+publiccertpath); // 调用SDK验证签名 - boolean signVerified = AlipaySignature.rsaCheckV1(params, environment.getProperty("ALIPAYPUBLICKEY"), "utf-8", "RSA2"); + boolean signVerified = AlipaySignature.rsaCheckV1(params, publiccertpath, "utf-8", "RSA2"); + logger.info("<<<<<<<<<<<<验证签名>>>>>>>>>"+signVerified); if (signVerified) { //("支付宝回调签名认证成功"); AlipayNotifyParam param = buildAlipayNotifyParam(params); @@ -161,14 +187,14 @@ public class AlipayPaymentController { // 业务处理失败,可查看日志进行补偿,跟支付宝已经没多大关系。 return "success"; }else{ - logger.info("<<<<<<<<<<<<支付宝服务器解析失败>>>>>>>>>"); - //logger.info("支付宝回调签名认证失败,signVerified=false, paramsJson:{}", paramsJson); return "failure"; } }catch (Exception e){ + e.printStackTrace(); //logger.error("支付宝回调签名认证失败,paramsJson:{},errorMsg:{}", paramsJson, e.getMessage()); return "failure"; } + } @@ -266,4 +292,63 @@ public class AlipayPaymentController { logger.info("<<<<<<<<<<<<"+r.getMsg()+">>>>>>>>>"); } + + + public static void main(String[] args) { + try{ + +// String st ="{gmt_create=2021-10-15 10:14:13, charset=UTF-8, seller_email=27555730@qq.com, subject=小华充电, sign=PNRU8Rck2aTVWqgoVOOsaZFujrlt7AQrsZKWw8S4RP7Ctehgj607PZ0j8364YLuIL9SKY1G7pPAP1Zfgur1uRw5CiqygqBkDl+jVu4Wh1BYUs8Qe0S5rKHGWk27uGi2gGdEvwCoPpzOnfHpGUbz3dhlqb03rkROAHHUNgOeKeMyzU5sfUB6z/tDpXoB3bcqZoEeaBba/mlu7L3QgqAXTRVLaE5tPntZfe5Ag/Sh3M9YX+07ktxA4khvCpRsB84yT3DTAKj8qY/IWnlsf4iUcU0A8GuGRAjkYNwadOIH3N/ngmS9LPkDME+TwoJ8F1gFpx6xbYSSbq8AtoGedujJXpA==, buyer_id=2088912814256712, invoice_amount=2.84, notify_id=2021101500222101424056715726105484, fund_bill_list=[{\"amount\":\"2.16\",\"fundChannel\":\"COUPON\"},{\"amount\":\"2.84\",\"fundChannel\":\"ALIPAYACCOUNT\"}], notify_type=trade_status_sync, trade_status=TRADE_SUCCESS, receipt_amount=5.00, buyer_pay_amount=5.00, app_id=2021002156615717, sign_type=RSA2, seller_id=2088631279527183, gmt_payment=2021-10-15 10:14:23, notify_time=2021-10-15 10:14:24, passback_params=%7B%22customerId%22%3A19%2C%22money%22%3A%225%22%2C%22out_trade_no%22%3A%22000000120211015101411117%22%7D, version=1.0, out_trade_no=000000120211015101411117, total_amount=5.00, trade_no=2021101522001456715750880678, auth_app_id=2021002156615717, buyer_logon_id=181****4652, point_amount=0.00}"; +// System.out.println("map:"+st); +// String resultInfo=st.substring(1,st.length()-1); +// //resultInfo=resultInfo.replace(", ","&"); +// System.out.println("resultInfo="+resultInfo); +// //回调的待验签字符串 +// //String resultInfo = "gmt_create=2021-10-14 18:55:50&charset=UTF-8&seller_email=27555730@qq.com&subject=小华充电&sign=DN7OEd6MwL1d+RsevKOPD9XGGV4hJFZ/gKRuqh2wCIN9FWlutMp654XyTPCu1jOGYaCQkjycJiriq+Cxqp6bXa0bAEKdrl+3bqfE1Cx9YjL5nvgYLuhfhoH7rrFsJVBE92lh7O541f+w8HNrTSG5Xa6lUUuqb55MEHx2GKvAISM9BChSK279FvLQV7rhmhO840QIJCgQkwm6sueLg1tVnH9nkcd0YRrE924n+mYzdRAS6Ekq2MlE2vOjHslO796oIKY0EyHb4z6liSupkmiZgQ2v5DppXiS6+/H6uLyOBMhIgMdO9ZmYRkUtHkq7emYmvjFwR2lRdy/qqnGW3OFbGw==&buyer_id=2088912814256712&invoice_amount=5.00¬ify_id=2021101400222185603056715724775024&fund_bill_list=[{\"amount\":\"5.00\",\"fundChannel\":\"ALIPAYACCOUNT\"}]¬ify_type=trade_status_sync&trade_status=TRADE_SUCCESS&receipt_amount=5.00&buyer_pay_amount=5.00&app_id=2021002156615717&sign_type=RSA2&seller_id=2088631279527183&gmt_payment=2021-10-14 18:56:03¬ify_time=2021-10-14 19:10:21&passback_params=%7B%22customerId%22%3A13%2C%22money%22%3A%225%22%2C%22out_trade_no%22%3A%22000000120211014185549114%22%7D&version=1.0&out_trade_no=000000120211014185549114&total_amount=5.00&trade_no=2021101422001456715747823733&auth_app_id=2021002156615717&buyer_logon_id=181****4652&point_amount=0.00"; +// String charset="utf-8"; +// //支付宝公钥证书 +// String alipayPublicCertPath="I:\\顶想\\充电桩\\支付宝\\10-13\\alipayCertPublicKey_RSA2.crt"; +// //签名方式 +// String sign_type="RSA2"; +// //对待签名字符串数据通过&进行拆分 +// String [] temp = resultInfo.split(", "); +// LinkedHashMap map = new LinkedHashMap(); +// //把拆分数据放在map集合内 +// for (int i = 0; i < temp.length; i++) { +// String[] arr = temp[i].split("=", 2); //通过"="号分割成2个数据 +// String[] tempAagin = new String[arr.length]; //再开辟一个数组用来接收分割后的数据 +// for (int j = 0; j < arr.length; j++) { +// tempAagin[j] = arr[j]; +// } +// map.put(tempAagin[0], tempAagin[1]); +// } +// System.out.println("map:"+map); +// //验签方法 +// boolean signVerified= AlipaySignature.rsaCertCheckV1(map, alipayPublicCertPath, charset,sign_type); +// if(signVerified){ +// // TODO 验签成功后 +// System.out.println("验签成功后:success"); +// }else{ +// System.out.println("验签失败后:fail"); +// } + + + + }catch (Exception e){ + e.printStackTrace(); + } + + } + + + /** + * 从公钥证书中提取公钥 + * + * @param alipayPublicCertPath 公钥证书存放路径,例如:/home/admin/cert.crt + * @return 公钥 + * @throws AlipayApiException + */ + public static String getAlipayPublicKey(String alipayPublicCertPath) throws AlipayApiException { + return AntCertificationUtil.getAlipayPublicKey(alipayPublicCertPath); + } + } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java index ec7896b5..1a231d74 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/controller/XhpcRefundAuditController.java @@ -1,8 +1,12 @@ package com.xhpc.payment.controller; import com.alipay.api.AlipayApiException; +import com.alipay.api.AlipayClient; import com.alipay.api.CertAlipayRequest; import com.alipay.api.DefaultAlipayClient; +import com.alipay.api.domain.AlipayFundTransUniTransferModel; +import com.alipay.api.domain.Participant; +import com.alipay.api.internal.util.AlipaySignature; import com.alipay.api.request.AlipayFundTransUniTransferRequest; import com.alipay.api.response.AlipayFundTransUniTransferResponse; import com.xhpc.common.core.constant.HttpStatus; @@ -39,6 +43,7 @@ import org.springframework.transaction.interceptor.TransactionAspectSupport; import org.springframework.web.bind.annotation.*; import javax.net.ssl.SSLContext; +import javax.xml.soap.SAAJResult; import java.io.File; import java.io.FileInputStream; import java.io.IOException; @@ -77,7 +82,9 @@ public class XhpcRefundAuditController extends BaseController { @ApiOperation(value = "退款审核") @Transactional public AjaxResult info(@RequestBody XhpcRefundAudit xhpcRefundAudit) { - Map map = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId()); + + Long refundOrderId = xhpcRefundAudit.getRefundOrderId(); + Map map = iXhpcRefundOrderService.info(refundOrderId); if (null == map) { AjaxResult.error(HttpStatus.DATA_ERROR, "退款订单不存在"); @@ -109,9 +116,13 @@ public class XhpcRefundAuditController extends BaseController { xhpcUserAccountStatementService.add(xhpcRefundAudit.getRefundOrderId(), amount, userId, StatusConstants.FLOWING_WATER_REFUND); String type = StringUtils.valueOf(map.get("type")); if (StatusConstants.OPERATION_WX_TYPE.equals(type)) { - enterpriseCheckOut(xhpcRefundAudit); + return enterpriseCheckOut(xhpcRefundAudit); + } + if (StatusConstants.OPERATION_ALI_PAY_TYPE.equals(type)) { + return zhbCheckOut(xhpcRefundAudit); } } + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.success(); } @@ -166,20 +177,24 @@ public class XhpcRefundAuditController extends BaseController { * * @return */ - public Object enterpriseCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit) { + public AjaxResult enterpriseCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit) { //只有审核通过才能退款 + Long refundOrderId = xhpcRefundAudit.getRefundOrderId(); Map xhpcRefundOrder = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId()); if (StringUtils.isNull(xhpcRefundOrder)) { + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.error(HttpStatus.DATA_ERROR, "订单不存在"); } String examineStatus = StringUtils.valueOf(xhpcRefundOrder.get("examineStatus")); if (!"1".equals(examineStatus)) { + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); } String status = StringUtils.valueOf(xhpcRefundOrder.get("status")); if (!"0".equals(status)) { + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); } @@ -200,6 +215,7 @@ public class XhpcRefundAuditController extends BaseController { Double value = amount * 100; Integer refund_fee = value.intValue(); if (refund_fee <= 0) { + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单金额出错"); } String userId = StringUtils.valueOf(xhpcRefundOrder.get("userId")); @@ -207,10 +223,12 @@ public class XhpcRefundAuditController extends BaseController { String balance = StringUtils.valueOf(appUserInfo.get("balance")); if (StringUtils.isNull(appUserInfo)) { + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.error(HttpStatus.DATA_ERROR, "用户不存在"); } BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(BigDecimal.valueOf(amount)); if (surplus.compareTo(BigDecimal.ZERO) == -1) { + updateXhpcRefundOrder(refundOrderId,2); return AjaxResult.error(HttpStatus.ERROR_STATUS, "余额不足"); } String result = ""; @@ -338,6 +356,7 @@ public class XhpcRefundAuditController extends BaseController { BigDecimal surplus =new BigDecimal(balance).subtract(amount); xhpcAppUser.setBalance(surplus); xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + updateXhpcRefundOrder(id,2); } return AjaxResult.success("退款成功"); } @@ -345,6 +364,7 @@ public class XhpcRefundAuditController extends BaseController { AjaxResult.error(e.getMessage()); e.printStackTrace(); } + updateXhpcRefundOrder(id,1); return AjaxResult.error(); } @@ -353,49 +373,130 @@ public class XhpcRefundAuditController extends BaseController { * 26 * @throws IOException * 27 */ - public void enterpriseCheckOut() throws AlipayApiException { + public AjaxResult zhbCheckOut(@RequestBody XhpcRefundAudit xhpcRefundAudit){ + //修改订单状态 + Long refundOrderId = xhpcRefundAudit.getRefundOrderId(); + //只有审核通过才能退款 + Map xhpcRefundOrder = iXhpcRefundOrderService.info(xhpcRefundAudit.getRefundOrderId()); - String orderNumber = "alipay" + DateUtils.timePath(); + if (StringUtils.isNull(xhpcRefundOrder)) { + updateXhpcRefundOrder(refundOrderId,2); + return AjaxResult.error(HttpStatus.DATA_ERROR, "订单不存在"); + } + String examineStatus = StringUtils.valueOf(xhpcRefundOrder.get("examineStatus")); + if (!"1".equals(examineStatus)) { + updateXhpcRefundOrder(refundOrderId,2); + return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); + } + String status = StringUtils.valueOf(xhpcRefundOrder.get("status")); + if (!"0".equals(status)) { + updateXhpcRefundOrder(refundOrderId,2); + return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单状态不能退款"); + } + String orderOutNumber = StringUtils.valueOf(xhpcRefundOrder.get("refundOrderNumber")); + String uid = StringUtils.valueOf(xhpcRefundOrder.get("alipayId")); + String money = StringUtils.valueOf(xhpcRefundOrder.get("amount")); + Double amount = Double.parseDouble(StringUtils.valueOf(xhpcRefundOrder.get("amount"))); + //退款金额单位为分 + Double value = amount * 100; + Integer refund_fee = value.intValue(); + if (refund_fee <= 0) { + updateXhpcRefundOrder(refundOrderId,2); + return AjaxResult.error(HttpStatus.ERROR_STATUS, "订单金额出错"); + } + String userId = StringUtils.valueOf(xhpcRefundOrder.get("userId")); + Map appUserInfo = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId)); + String balance = StringUtils.valueOf(appUserInfo.get("balance")); - String filePath = this.getClass().getResource("/").getPath() + "证书名字"; - System.out.println(filePath); - CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); - certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); - certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID")); - certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY"));//密钥 - certAlipayRequest.setFormat("json"); - certAlipayRequest.setCharset("UTF-8"); - certAlipayRequest.setSignType("RSA2"); - certAlipayRequest.setCertPath(filePath + "appCertPublicKey.crt");//应用证书 - certAlipayRequest.setAlipayPublicCertPath(filePath + "alipayCertPublicKey_RSA2.crt");//支付证书 - certAlipayRequest.setRootCertPath(filePath + "alipayRootCert.crt"); - DefaultAlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); - AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); - //价格 - Double money = 0.01; - //转账标题 - String order_title = "支付宝提现"; - //支付宝会员id - String identity = "123"; - //实名信息 - String name = ""; - request.setBizContent("{" + - "\"out_biz_no\":\"201806300001\"," + + if (StringUtils.isNull(appUserInfo)) { + updateXhpcRefundOrder(refundOrderId,2); + return AjaxResult.error(HttpStatus.DATA_ERROR, "用户不存在"); + } + BigDecimal surplus = BigDecimal.valueOf(Double.valueOf(balance)).subtract(BigDecimal.valueOf(amount)); + if (surplus.compareTo(BigDecimal.ZERO) == -1) { + updateXhpcRefundOrder(refundOrderId,2); + return AjaxResult.error(HttpStatus.ERROR_STATUS, "余额不足"); + } + try { + String orderNumber = "alipay" + DateUtils.timePath(); + /** 初始化 **/ + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + /** 支付宝网关 **/ + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/ + certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID")); + /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/ + certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY")); + /** 应用公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setCertPath(environment.getProperty("CERTPATH")); + /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setAlipayPublicCertPath(environment.getProperty("PUBLICCERTPATH")); + /** 支付宝根证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setRootCertPath(environment.getProperty("ROOTCRETPATH")); + /** 设置签名类型 **/ + certAlipayRequest.setSignType("RSA2"); + /** 设置请求格式,固定值json **/ + certAlipayRequest.setFormat("json"); + /** 设置编码格式 **/ + certAlipayRequest.setCharset("UTF-8"); - "\"trans_amount\":" + money + "," + - "\"product_code\":\"TRANS_ACCOUNT_NO_PWD\"," + - "\"biz_scene\":\"DIRECT_TRANSFER\"," + - "\"order_title\":\"" + order_title + "\"," + - "\"payee_info\":{" + - "\"identity\":\"" + identity + "\"," + - "\"identity_type\":\"ALIPAY_USER_ID \"," + - " }," + - " }"); - AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); + /** 实例化具体API对应的request类,类名称和接口名称对应,当前调用接口名称:alipay.fund.trans.uni.transfer(单笔转账接口) **/ + AlipayFundTransUniTransferRequest request = new AlipayFundTransUniTransferRequest(); + /** 设置业务参数,具体接口参数传值以文档说明为准:https://opendocs.alipay.com/apis/api_28/alipay.fund.trans.uni.transfer/ **/ + AlipayFundTransUniTransferModel model = new AlipayFundTransUniTransferModel(); + /** 商户端的唯一订单号,对于同一笔转账请求,商户需保证该订单号唯一 **/ + model.setOutBizNo(orderNumber); + /** 转账金额,TRANS_ACCOUNT_NO_PWD产品取值最低0.1 **/ + model.setTransAmount(money); + /** 产品码,单笔无密转账到支付宝账户固定为:TRANS_ACCOUNT_NO_PWD **/ + model.setProductCode("TRANS_ACCOUNT_NO_PWD"); + /** 场景码,单笔无密转账到支付宝账户固定为:DIRECT_TRANSFER **/ + model.setBizScene("DIRECT_TRANSFER"); + /** 转账业务的标题,用于在支付宝用户的账单里显示 **/ + model.setOrderTitle("转账标题"); + Participant participant = new Participant(); + /** 参与方的唯一标识,收款支付宝账号或者支付宝吧账号唯一会员ID **/ + participant.setIdentity(uid); + /** 参与方的标识类型:ALIPAY_USER_ID 支付宝的会员ID **/ + participant.setIdentityType("ALIPAY_USER_ID"); + model.setPayeeInfo(participant); + /** 业务备注 **/ + model.setRemark("单笔转账--"+orderOutNumber); + request.setBizModel(model); + AlipayFundTransUniTransferResponse response = alipayClient.certificateExecute(request); + /** 获取接口调用结果,如果调用失败,可根据返回错误信息到该文档寻找排查方案:https://opensupport.alipay.com/support/helpcenter/107 **/ if (response.isSuccess()) { - System.out.println("调用成功"); + Map appUserInfo1 = xhpcUserAccountStatementMapper.appUserInfo(Long.parseLong(userId)); + //退款成功修改订单 + if (StringUtils.isNotNull(appUserInfo1)) { + String balance1 = StringUtils.valueOf(appUserInfo1.get("balance")); + //减少用户余额 + XhpcAppUser xhpcAppUser = new XhpcAppUser(); + xhpcAppUser.setAppUserId(Long.parseLong(userId)); + BigDecimal surplus1 =new BigDecimal(balance1).subtract(BigDecimal.valueOf(amount)); + xhpcAppUser.setBalance(surplus1); + xhpcUserAccountStatementMapper.updateAppUserBalance(xhpcAppUser); + + updateXhpcRefundOrder(refundOrderId,1); + } + return AjaxResult.success("退款成功"); } else { System.out.println("调用失败"); + } + }catch (Exception e){ + e.printStackTrace(); + } + updateXhpcRefundOrder(refundOrderId,2); + + return AjaxResult.error("退款失败"); + } + + public void updateXhpcRefundOrder(Long refundOrderId,Integer status){ + XhpcRefundOrder refundOrder =new XhpcRefundOrder(); + refundOrder.setRefundOrderId(refundOrderId); + refundOrder.setStatus(status); + iXhpcRefundOrderService.update(refundOrder); } } diff --git a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java index ba84b1d7..924b94fe 100644 --- a/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java +++ b/xhpc-modules/xhpc-payment/src/main/java/com/xhpc/payment/service/impl/XhpcRefundAuditServiceImpl.java @@ -42,7 +42,10 @@ public class XhpcRefundAuditServiceImpl implements IXhpcRefundAuditService { XhpcRefundOrder xhpcRefundOrder = new XhpcRefundOrder(); xhpcRefundOrder.setRefundOrderId(xhpcRefundAudit.getRefundOrderId()); xhpcRefundOrder.setExamineStatus(xhpcRefundAudit.getStatus()); + xhpcRefundOrder.setStatus(StatusConstants.REFUND_ORDER_STATUS_WAIT); + + int updateStatus = xhpcRefundOrderMapper.updateExamineStatus(xhpcRefundOrder); if (updateStatus == 0) { return AjaxResult.error(); diff --git a/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml index 29514896..339e2e7c 100644 --- a/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-payment/src/main/resources/bootstrap.yml @@ -23,6 +23,10 @@ spring: # 共享配置 shared-configs: - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension} +logging: + level: + com.xhpc.order.mapper: debug + ##获取微信openid地址 WXGETJSCODE: "https://api.weixin.qq.com/sns/jscode2session?appid=wxb14ef93e9b7901f3&secret=b5c5672141b5930c30a1abee95a2dcbf&js_code=" ##阿里云身份证验证地址 @@ -45,8 +49,14 @@ WXTRANSFERS: "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfer #支付宝支付回调地址 ALIPAYPSERVERDOMAIN: "https://www.scxhua.cn/prod-api/xhpc-payment/alipay/notifyUrl" #支付宝公钥 -ALIPAYPUBLICKEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjHDksTgZTpf0wh7oeTVRp0h3SqzTM2smjEJnx9jF1+q3WSXLRB4OzSzq7VsJ/szcyK10ZGO5PxeQ4u9GAG/U+7xhs7ei1cJB/Er55Sg9SbjfkTpwlDv181UJCRJJ/IAcqyqezwTpB8e2trYmHKovUdt0KR9/tVkGa7hsNd5GfxTOUaAFc3zADqRVM+wGimtG0NYfOF2f8tkmBEAiMMLKq5pbAnHU723a1cm/nfVp7gvXfsnO0k2GvRuHzb8mxIhWLiAnwdK9gEu5za/jWxo/xIvf2sdJPYdWj+yfyzA2e1fJkx4uRUzX31CXxZvP2/tfEcnTdI0gxN+OH2eAMiPVswIDAQAB" +ALIPAYPUBLICKEY: #应用私钥 -ALIPAYPRIVATEKEY: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6goPD1M6MqF31hS9+hnzXDvILjaw2AFLhgbXUp4UD+8N1pvx7PkzMzPj9OWLBl0GZyDOwSJnboan4Gw/DGwekHVcgnGJWmlojquqE9ZB0Nu69AkhIs9KnHsYe5QnjLSwa7e+InoRKqB4/XscQ4GnKG8Wpq8UH9O9lqgKdnY9+ShcsEJkY88AzmlMIQtluXlweXfEUnfPVxOCZwX0yEaLYdoJMLgcp6QD+IBpJ049vpPFzzsCzp4j7agInzPlNkG+euOEkC+EWMmLd6P0hXN4OJ4dNSo8IwUcV1cbXHL8FmtnavWnk0pykNZYqeKQdCh+JdhU50t/dmXhuM1ejEe5RAgMBAAECggEAZRo230NOrETgmiUWd9njdpjtcIHd5nAKfZ/Yt2wP2PbzH6Xjm9NLwoEiP/KJrDOYJgq2qkrQzJQ4FPxmcPcID1iwUEc1r4iAcHFIK8cKBVV52Q+Rq4d/G4S9FSZHU9S64eY1QLPdNrMnomZ4NpfQAPVJEw7AAe4uj8e3H0W38Va+4QBVYgov1UAJxbsE9jue8NeBMoLRCol/lu/lXH2ndYK4EpCgiK7xNdg8SuIt5hIoYqmQ3Pbd6Fn64AL8cZqiLiFjVoMTBfYbuv99UwyYrm12WAqJ4fAnzwJvozYbBvZPqZYeor8L0Qv1RJUy0KDnWciRgSJQ+Vo3kXlLH7DK2QKBgQDrqUNZnAL0V+RttCkwF2m0GXgplZXVfC1dIXxNsrJaEQ/4/Q3mYI52cMFOd7T09PCGXw4MU9b90srzPTbxSzUCXUfGeNimr+Ivhz5sDiVkJEv5DdowJaos0/yH4kSBFGPN8DOiDoGBBfAUBojZl0gS3eHMGmjwkXGkWZ3O3WE43wKBgQDKm0sa5LIP1/bfP5JmanNuGBOjTsBhApGEavjBtEzSqhIkj2IrlglQ6b2ckfubAsDhoMtYE32gDBnPiFOAlwmrTuB72XWoAnzdkJupklEH1dafBuT20JIRQXjeTD2kl1Ffa3+IN2miDXJ4slaNiEDYo1YPUYLaL7Kfoy84JP9OzwKBgEjWaBqqPb+H6vJ9XL2gfutLc/hmY4k4eEzwrJrXQIjV/TnX/RPXhDDXaOf319ZeXnkpqA3nW+vX2yKTKQgrVpcEfcq6Tzw14JMQGhsLxELPdSvlPCrleVOhscvOA55hzvc35r2P/jcCvtFxs5qNR5mNOtz6zLSOP7GsgToO8p3BAoGBAKzk9KSQgHsQurUsVMxdDv/mP+veakDepjsv5fO23s/vHehhC09Si8Smko4n7WQMZ3ijdKNGjq+jY+s71LYpLbEocFx/5+1lohSZMJz2JXvgOXQfuAf/WIatLm3U9c2c623YGE6vqs8FVqg017OTkHLOf8Q2tMloZq/f24231L71AoGALwpnQdJG11G/IVb5D8YA1LbASOztW1M5RX9YeVkqISIOFzM+872PUgUq04Qa0QB+P+BOo3TS58o+Q8R6ErTiYF84X2z6nX0dgDzIB3pV6t+VQFCBO5PtsYaSgJQ4H3i5y9i2e5Zt34s9dZ5rdm2BD/RoGijVM9U+ccrNId4wWRE=" +ALIPAYPRIVATEKEY: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGHX1s315EKjoIBkNiF3IxCAmvtVg+TdCDL/XmJZWdcZ23tEWmmIMsLRCLUKsaPfTEhnqD6EFJnmpJu4teDImo3aDbOoO31YFEXjMXUnTTS/dtDVEo1OecsRL+Re43KSohOkIL1TMyTuNfeIglQTuhCSZ3LOEOx4OHpYwcrLp8p1ORvAS7x35nsmjLp3oQTJo9RWfzfEaKbm6cxsWLKyr5/5eGDXrUHNC5hIDLjoJbe6iqNKyIiPJHtPZfJ36PcWa7PFvx4X+Ded32KZb2AA3p9w/HX7gn1MnRfT5NGH0k3ggxLNarDU8g6JjQYgNtmE/R8gbp99BudZNfDoSF1llNAgMBAAECggEAaTa9bSoXM/bErALt3ghyx1B8+OGVpts5F5IKoVEe/PNjPfkpIzdGwONhtUnF0cKFQaAWgWE1xuGGlO2Sumevn1Cvnw1axF+1F8Om5UcE67cPFvh5kUTlpyGrutt1tMSQjpy7r7jEf1UwP3e5pzBz7TPWf2wv635OC56uOtivPJZ+8vg7VYon/mNXQuL4AavoxfSDtvo0ad30X2fK1WKeeBtgiT4UzV6ZGZh5igKQHM4lVvmbo/jOeQD0KAod7pRe/h4FBFmCVIWwgW+I+Hnzp8A/nJezoowJ3jiTt0FodC9uBCT64ZCz5dVCryD62LDVjKBxB7cfIoQA+PxCiXr9QQKBgQD+2v38J/MlfK/XCYldclzumizwIw6T0Mv6XvYwXQHYgYDKYNF6k1LhMEUo7fP3EsPdV8h/nXmdU4qadOVm6QSJ/rGEl22yGlO7woUzTY/Ls9eknoqfMYuyI1+ICMnNxmesQbWyc0cOHh44cEF+icfJxEDAmrHGLmBVsKuLUJUuVQKBgQCGt663TF7mixghiUOcT11zC1fqG+dIcvAwHpCHfdxsniYRqnv+SLf6eC5PCkQ5aNAAl/ywOLQAWS0XgYti3LyZ4iuGIYcUE0IDDmhWl68V27iXcLIK+rBRqBGxSdk8xR+zSE8fpO4mXpxn8SH0Butex8PJ+oHTbmdXIUAXdn6HGQKBgQCvAB1rqtsRoL72ADxtCHy78u5srwXxhmyqrc6LgzIjQzn2vejaLJO6wfSbmFnwDNimAwNQbgf2ekkwqphjxBozz8qB66GNrPpWccoZYmcdT48CIUO68MCmQBf3R2GbhWPnKu/ja7kc/p1tz9eJVn70E2kLWK4+EdZgwQHqlhj6SQKBgF4AmbdpYOb5s9Li1vyhHJIEHkpLQi15lkPdb/g7SK26BNJa5b5fu5DYf2fDwCtXCZ0AcN/+EQwVLbOzPzGy2R9/g+NKTdkiPvOnAAM8QH2+HaX+ix3CI3o3DnFpGF6hJieRkzR/f3Ximryks451rZMrTWEIncKMzSstFm3Izy0xAoGBAJQaMqlzpM+QaJiytJNeqRpPWRsi0Dkf4XqJXPWLOrApSISsafZF5vk2ZOeIqRsVCBH3LdfVIJxEBAF4l/Sd2q7xC9JHawJDqa4ea7VwL68ANH2w3jcJ3j6DQqf7NIe/lSGxYF6Jt+74oRFHxN3GDSf+z91DYfZz8hQnyphKDNEJ" #支付宝appid ALIPAYAPPID: "2021002156615717" +#应用公钥证书路径 +CERTPATH: "/www/wwwroot/scxhua.cn/xhpc-payment/appCertPublicKey.crt" +#支付宝公钥证书路径 +PUBLICCERTPATH: "/www/wwwroot/scxhua.cn/xhpc-payment/alipayCertPublicKey_RSA2.crt" +#支付宝根证书路径 +ROOTCRETPATH: "/www/wwwroot/scxhua.cn/xhpc-payment/alipayRootCert.crt" diff --git a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java index 0b58be85..ef20586e 100644 --- a/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java +++ b/xhpc-modules/xhpc-user/src/main/java/com/xhpc/user/controller/XhpcAppUserController.java @@ -2,7 +2,9 @@ package com.xhpc.user.controller; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; +import com.alipay.api.AlipayApiException; import com.alipay.api.AlipayClient; +import com.alipay.api.CertAlipayRequest; import com.alipay.api.DefaultAlipayClient; import com.alipay.api.request.AlipaySystemOauthTokenRequest; import com.alipay.api.response.AlipaySystemOauthTokenResponse; @@ -20,6 +22,12 @@ import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.*; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.security.PublicKey; +import java.security.cert.Certificate; +import java.security.cert.CertificateException; +import java.security.cert.CertificateFactory; import javax.crypto.Cipher; import javax.crypto.spec.IvParameterSpec; @@ -219,11 +227,36 @@ public class XhpcAppUserController extends BaseController { @ApiOperation("支付宝授权") @PostMapping("/alipayEmpower") public AjaxResult alipayEmpower(@RequestParam String code) throws Exception { - AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do", environment.getProperty("ALIPAYAPPID"), environment.getProperty("ALIPAYPRIVATEKEY"), "json", "utf-8", environment.getProperty("ALIPAYPUBLICKEY"), "RSA2"); + + /** 初始化 **/ + CertAlipayRequest certAlipayRequest = new CertAlipayRequest(); + /** 支付宝网关 **/ + certAlipayRequest.setServerUrl("https://openapi.alipay.com/gateway.do"); + /** 应用id,如何获取请参考:https://opensupport.alipay.com/support/helpcenter/190/201602493024 **/ + certAlipayRequest.setAppId(environment.getProperty("ALIPAYAPPID")); + /** 应用私钥, 如何获取请参考:https://opensupport.alipay.com/support/helpcenter/207/201602471154?ant_source=antsupport **/ + certAlipayRequest.setPrivateKey(environment.getProperty("ALIPAYPRIVATEKEY")); + /** 应用公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setCertPath(environment.getProperty("CERTPATH")); + /** 支付宝公钥证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setAlipayPublicCertPath(environment.getProperty("PUBLICCERTPATH")); + /** 支付宝根证书路径,下载后保存位置的绝对路径 **/ + certAlipayRequest.setRootCertPath(environment.getProperty("ROOTCRETPATH")); + /** 设置签名类型 **/ + certAlipayRequest.setSignType("RSA2"); + /** 设置请求格式,固定值json **/ + certAlipayRequest.setFormat("json"); + /** 设置编码格式 **/ + certAlipayRequest.setCharset("UTF-8"); + AlipayClient alipayClient = new DefaultAlipayClient(certAlipayRequest); AlipaySystemOauthTokenRequest request = new AlipaySystemOauthTokenRequest(); request.setGrantType("authorization_code"); + // auth_code 前端授权后得到的授权码 request.setCode(code); - AlipaySystemOauthTokenResponse response = alipayClient.execute(request); + AlipaySystemOauthTokenResponse response = alipayClient.certificateExecute(request); + //服务端请求返回,RSA2密钥和公钥证书请求方式不同,如当面付 + // RSA2密钥请求response = alipayClient.execute(request); + // 公钥证书请求请求response = alipayClient.certificateExecute(request); if (response.isSuccess()) { System.out.println("调用成功"); } else { @@ -242,4 +275,15 @@ public class XhpcAppUserController extends BaseController { return iXhpcAppUserUserService.logout(phone, code); } + + public static void main(String[] args) { + try { + + }catch (Exception e){ + e.printStackTrace(); + } + } + + + } diff --git a/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml b/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml index aa8fbaf5..c570dc4f 100644 --- a/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml +++ b/xhpc-modules/xhpc-user/src/main/resources/bootstrap.yml @@ -26,8 +26,14 @@ spring: #获取微信openid地址 WXGETJSCODE: "https://api.weixin.qq.com/sns/jscode2session?appid=wxd0a48e00319ef8a7&secret=e26d9088b58e24af69411d5933cece47&js_code=" #支付宝公钥 -ALIPAYPUBLICKEY: "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAjHDksTgZTpf0wh7oeTVRp0h3SqzTM2smjEJnx9jF1+q3WSXLRB4OzSzq7VsJ/szcyK10ZGO5PxeQ4u9GAG/U+7xhs7ei1cJB/Er55Sg9SbjfkTpwlDv181UJCRJJ/IAcqyqezwTpB8e2trYmHKovUdt0KR9/tVkGa7hsNd5GfxTOUaAFc3zADqRVM+wGimtG0NYfOF2f8tkmBEAiMMLKq5pbAnHU723a1cm/nfVp7gvXfsnO0k2GvRuHzb8mxIhWLiAnwdK9gEu5za/jWxo/xIvf2sdJPYdWj+yfyzA2e1fJkx4uRUzX31CXxZvP2/tfEcnTdI0gxN+OH2eAMiPVswIDAQAB" +ALIPAYPUBLICKEY: #应用私钥 -ALIPAYPRIVATEKEY: "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC6goPD1M6MqF31hS9+hnzXDvILjaw2AFLhgbXUp4UD+8N1pvx7PkzMzPj9OWLBl0GZyDOwSJnboan4Gw/DGwekHVcgnGJWmlojquqE9ZB0Nu69AkhIs9KnHsYe5QnjLSwa7e+InoRKqB4/XscQ4GnKG8Wpq8UH9O9lqgKdnY9+ShcsEJkY88AzmlMIQtluXlweXfEUnfPVxOCZwX0yEaLYdoJMLgcp6QD+IBpJ049vpPFzzsCzp4j7agInzPlNkG+euOEkC+EWMmLd6P0hXN4OJ4dNSo8IwUcV1cbXHL8FmtnavWnk0pykNZYqeKQdCh+JdhU50t/dmXhuM1ejEe5RAgMBAAECggEAZRo230NOrETgmiUWd9njdpjtcIHd5nAKfZ/Yt2wP2PbzH6Xjm9NLwoEiP/KJrDOYJgq2qkrQzJQ4FPxmcPcID1iwUEc1r4iAcHFIK8cKBVV52Q+Rq4d/G4S9FSZHU9S64eY1QLPdNrMnomZ4NpfQAPVJEw7AAe4uj8e3H0W38Va+4QBVYgov1UAJxbsE9jue8NeBMoLRCol/lu/lXH2ndYK4EpCgiK7xNdg8SuIt5hIoYqmQ3Pbd6Fn64AL8cZqiLiFjVoMTBfYbuv99UwyYrm12WAqJ4fAnzwJvozYbBvZPqZYeor8L0Qv1RJUy0KDnWciRgSJQ+Vo3kXlLH7DK2QKBgQDrqUNZnAL0V+RttCkwF2m0GXgplZXVfC1dIXxNsrJaEQ/4/Q3mYI52cMFOd7T09PCGXw4MU9b90srzPTbxSzUCXUfGeNimr+Ivhz5sDiVkJEv5DdowJaos0/yH4kSBFGPN8DOiDoGBBfAUBojZl0gS3eHMGmjwkXGkWZ3O3WE43wKBgQDKm0sa5LIP1/bfP5JmanNuGBOjTsBhApGEavjBtEzSqhIkj2IrlglQ6b2ckfubAsDhoMtYE32gDBnPiFOAlwmrTuB72XWoAnzdkJupklEH1dafBuT20JIRQXjeTD2kl1Ffa3+IN2miDXJ4slaNiEDYo1YPUYLaL7Kfoy84JP9OzwKBgEjWaBqqPb+H6vJ9XL2gfutLc/hmY4k4eEzwrJrXQIjV/TnX/RPXhDDXaOf319ZeXnkpqA3nW+vX2yKTKQgrVpcEfcq6Tzw14JMQGhsLxELPdSvlPCrleVOhscvOA55hzvc35r2P/jcCvtFxs5qNR5mNOtz6zLSOP7GsgToO8p3BAoGBAKzk9KSQgHsQurUsVMxdDv/mP+veakDepjsv5fO23s/vHehhC09Si8Smko4n7WQMZ3ijdKNGjq+jY+s71LYpLbEocFx/5+1lohSZMJz2JXvgOXQfuAf/WIatLm3U9c2c623YGE6vqs8FVqg017OTkHLOf8Q2tMloZq/f24231L71AoGALwpnQdJG11G/IVb5D8YA1LbASOztW1M5RX9YeVkqISIOFzM+872PUgUq04Qa0QB+P+BOo3TS58o+Q8R6ErTiYF84X2z6nX0dgDzIB3pV6t+VQFCBO5PtsYaSgJQ4H3i5y9i2e5Zt34s9dZ5rdm2BD/RoGijVM9U+ccrNId4wWRE=" +ALIPAYPRIVATEKEY: "MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCGHX1s315EKjoIBkNiF3IxCAmvtVg+TdCDL/XmJZWdcZ23tEWmmIMsLRCLUKsaPfTEhnqD6EFJnmpJu4teDImo3aDbOoO31YFEXjMXUnTTS/dtDVEo1OecsRL+Re43KSohOkIL1TMyTuNfeIglQTuhCSZ3LOEOx4OHpYwcrLp8p1ORvAS7x35nsmjLp3oQTJo9RWfzfEaKbm6cxsWLKyr5/5eGDXrUHNC5hIDLjoJbe6iqNKyIiPJHtPZfJ36PcWa7PFvx4X+Ded32KZb2AA3p9w/HX7gn1MnRfT5NGH0k3ggxLNarDU8g6JjQYgNtmE/R8gbp99BudZNfDoSF1llNAgMBAAECggEAaTa9bSoXM/bErALt3ghyx1B8+OGVpts5F5IKoVEe/PNjPfkpIzdGwONhtUnF0cKFQaAWgWE1xuGGlO2Sumevn1Cvnw1axF+1F8Om5UcE67cPFvh5kUTlpyGrutt1tMSQjpy7r7jEf1UwP3e5pzBz7TPWf2wv635OC56uOtivPJZ+8vg7VYon/mNXQuL4AavoxfSDtvo0ad30X2fK1WKeeBtgiT4UzV6ZGZh5igKQHM4lVvmbo/jOeQD0KAod7pRe/h4FBFmCVIWwgW+I+Hnzp8A/nJezoowJ3jiTt0FodC9uBCT64ZCz5dVCryD62LDVjKBxB7cfIoQA+PxCiXr9QQKBgQD+2v38J/MlfK/XCYldclzumizwIw6T0Mv6XvYwXQHYgYDKYNF6k1LhMEUo7fP3EsPdV8h/nXmdU4qadOVm6QSJ/rGEl22yGlO7woUzTY/Ls9eknoqfMYuyI1+ICMnNxmesQbWyc0cOHh44cEF+icfJxEDAmrHGLmBVsKuLUJUuVQKBgQCGt663TF7mixghiUOcT11zC1fqG+dIcvAwHpCHfdxsniYRqnv+SLf6eC5PCkQ5aNAAl/ywOLQAWS0XgYti3LyZ4iuGIYcUE0IDDmhWl68V27iXcLIK+rBRqBGxSdk8xR+zSE8fpO4mXpxn8SH0Butex8PJ+oHTbmdXIUAXdn6HGQKBgQCvAB1rqtsRoL72ADxtCHy78u5srwXxhmyqrc6LgzIjQzn2vejaLJO6wfSbmFnwDNimAwNQbgf2ekkwqphjxBozz8qB66GNrPpWccoZYmcdT48CIUO68MCmQBf3R2GbhWPnKu/ja7kc/p1tz9eJVn70E2kLWK4+EdZgwQHqlhj6SQKBgF4AmbdpYOb5s9Li1vyhHJIEHkpLQi15lkPdb/g7SK26BNJa5b5fu5DYf2fDwCtXCZ0AcN/+EQwVLbOzPzGy2R9/g+NKTdkiPvOnAAM8QH2+HaX+ix3CI3o3DnFpGF6hJieRkzR/f3Ximryks451rZMrTWEIncKMzSstFm3Izy0xAoGBAJQaMqlzpM+QaJiytJNeqRpPWRsi0Dkf4XqJXPWLOrApSISsafZF5vk2ZOeIqRsVCBH3LdfVIJxEBAF4l/Sd2q7xC9JHawJDqa4ea7VwL68ANH2w3jcJ3j6DQqf7NIe/lSGxYF6Jt+74oRFHxN3GDSf+z91DYfZz8hQnyphKDNEJ" #支付宝appid ALIPAYAPPID: "2021002156615717" +#应用公钥证书路径 +CERTPATH: "/www/wwwroot/scxhua.cn/xhpc-user/appCertPublicKey.crt" +#支付宝公钥证书路径 +PUBLICCERTPATH: "/www/wwwroot/scxhua.cn/xhpc-user/alipayCertPublicKey_RSA2.crt" +#支付宝根证书路径 +ROOTCRETPATH: "/www/wwwroot/scxhua.cn/xhpc-user/alipayRootCert.crt"