ruoyi-gateway/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@ # Tomcat server: port: 1500 port: 8020 # Spring spring: ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml
@@ -19,20 +19,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 ruoyi-modules/ruoyi-goods/src/main/resources/bootstrap.yml
@@ -14,20 +14,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 ruoyi-modules/ruoyi-member/src/main/resources/bootstrap.yml
@@ -14,20 +14,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java
@@ -14,6 +14,8 @@ import com.google.gson.GsonBuilder; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.controller.BaseController; import com.ruoyi.order.domain.dto.WechatPaymentRefundDto; import com.ruoyi.order.domain.dto.WeixinPaymentNotifyDto; import com.ruoyi.order.domain.pojo.account.OrderRefund; import com.ruoyi.order.domain.vo.ProfitSharingNotifyNewResult; import com.ruoyi.order.domain.vo.WeixinPaymentNotifyVo; @@ -229,8 +231,8 @@ @RequestMapping(value = "/wechatPaymentCallback", method = RequestMethod.POST) @ApiOperation(value = "微信支付通知(汇付天下)") public void wechatPaymentCallback(@RequestBody JSONObject jsonObject, HttpServletResponse response){ R<WeixinPaymentNotifyVo> r = HuiFuTianXiaUtil.weixinPaymentNotify(jsonObject); public void wechatPaymentCallback(WeixinPaymentNotifyDto dto, HttpServletResponse response){ R<WeixinPaymentNotifyVo> r = HuiFuTianXiaUtil.weixinPaymentNotify(dto); if(r.getCode() == 200){ WeixinPaymentNotifyVo data = r.getData(); String transStat = data.getTransStat(); @@ -260,8 +262,8 @@ @RequestMapping(value = "/wechatPaymentRefundCallback", method = RequestMethod.POST) @ApiOperation(value = "微信支付退款通知(汇付天下)") public void wechatPaymentRefundCallback(@RequestBody JSONObject jsonObject, HttpServletResponse response){ R<WeixinPaymentRefundVo> r = HuiFuTianXiaUtil.weixinPaymentRefundNotify(jsonObject); public void wechatPaymentRefundCallback(WechatPaymentRefundDto dto, HttpServletResponse response){ R<WeixinPaymentRefundVo> r = HuiFuTianXiaUtil.weixinPaymentRefundNotify(dto); if(r.getCode() == 200){ WeixinPaymentRefundVo data = r.getData(); String transStat = data.getTransStat(); @@ -269,7 +271,7 @@ //开始处理业务数据 String reqSeqId = data.getReqSeqId(); OrderRefund orderRefund = orderRefundService.getById(reqSeqId); if(null != orderRefund){ if(null != orderRefund && orderRefund.getRefundStatus() != 2){ orderRefund.setWxRefundId(data.getPartyOrderId()); orderRefund.setBackTime(data.getTransDate() + data.getTransTime()); orderRefund.setRefundStatus(2); ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/WechatPaymentRefundDto.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.order.domain.dto; import com.alibaba.fastjson.JSONObject; import lombok.Data; /** * @author zhibing.pu * @date 2023/10/20 18:40 */ @Data public class WechatPaymentRefundDto { /** * 签名 */ private String sign; /** * 业务数据 */ private String resp_data; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/WeixinPaymentNotifyDto.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.order.domain.dto; import lombok.Data; /** * @author zhibing.pu * @date 2023/10/20 18:10 */ @Data public class WeixinPaymentNotifyDto { /** * 网关返回码 */ private String resp_code; /** * 网关返回信息 */ private String resp_desc; /** * 签名 */ private String sign; /** * 返回业务数据 */ private String resp_data; } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/ParamsAuthFilter.java
@@ -17,7 +17,7 @@ import java.util.HashMap; import java.util.Map; @Component //@Component @Log4j2 public class ParamsAuthFilter implements Filter { @@ -81,7 +81,7 @@ } String requestBodyStr = stringBuilder.toString(); if(StringUtils.isNotBlank(requestBodyStr)){ try { try { return JSONObject.parseObject(stringBuilder.toString(), Map.class); }catch (Exception e){ e.printStackTrace(); ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java
@@ -952,6 +952,9 @@ request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentCallback"); R<com.alibaba.fastjson.JSONObject> r = HuiFuTianXiaUtil.weixinPayment(outTradeNo, description, payMoney.doubleValue(), openid, request.getNotifyUrl()); if(r.getCode() != 200){ throw new ServiceException(r.getMsg()); } com.alibaba.fastjson.JSONObject data = r.getData(); String mainMchId = WxPayConfiguration.getPlatformTyMacId(); // 支付相关信息返回 @@ -2089,18 +2092,16 @@ // 分账完成 request.setFinish(true); NumberFormat numberFormat = NumberFormat.getInstance(); numberFormat.setMaximumFractionDigits(2); //分账对象 JSONArray acctInfos = new JSONArray(); JSONObject jsonObject = new JSONObject(); jsonObject.put("div_amt", numberFormat.format(multiply.doubleValue())); jsonObject.put("div_amt", String.format("%.2f", multiply.doubleValue())); jsonObject.put("huifu_id", vo.getHuifuId()); //平台商户 double pt_amount = orderMoney.subtract(multiply).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); JSONObject jsonObject1 = new JSONObject(); jsonObject1.put("div_amt", numberFormat.format(pt_amount)); jsonObject1.put("huifu_id", HuiFuTianXiaUtil.huifu_id); jsonObject1.put("div_amt", String.format("%.2f", pt_amount)); jsonObject1.put("huifu_id", "6666000141216769"); acctInfos.add(jsonObject1); R<PaymentDelaytransHFTXVo> hftxVoR = HuiFuTianXiaUtil.paymentDelaytrans(request.getOutOrderNo(), outTradeNo, acctInfos); if(hftxVoR.getCode() != 200){ @@ -5114,6 +5115,9 @@ // 更新订单状态 outTradeNo String outTradeNo = transaction.getOutTradeNo(); Order order = this.getByOutTradeNo(outTradeNo); if(order.getOrderStatus() != 1){ return; } String orderId = order.getOrderId(); order.setOrderStatus(2); order.setPayTime(new Date()); @@ -5522,10 +5526,10 @@ log.info("调用微信退款---发起退款"); String subMchId = orderPayment.getSubMchId(); WxPayConfig config = wxService.getConfig(); // WxPayConfig config = wxService.getConfig(); RefundsRequest request = new RefundsRequest(); request.setSpAppid(config.getAppId()); // request.setSpAppid(config.getAppId()); request.setSubMchid(subMchId); request.setTransactionId(orderPayment.getTransactionId()); request.setOutRefundNo(outRefundNo); @@ -5537,7 +5541,7 @@ request.setAmount(amount); request.setNotifyUrl(callbackPath + "/order/app/notify/wechatPaymentRefundCallback"); RefundsResult result = wxService.getEcommerceService().refunds(request); // RefundsResult result = wxService.getEcommerceService().refunds(request); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); String org_req_date = sdf.format(orderPayment.getCreateTime()); @@ -5554,14 +5558,14 @@ Gson gson = new Gson(); String refundRequestJson = gson.toJson(request); // 返回参数 String refundResponseJson = gson.toJson(result); // String refundResponseJson = gson.toJson(result); log.info("调用微信退款返回参数---{}", refundResponseJson); // log.info("调用微信退款返回参数---{}", refundResponseJson); // 保存支付订单统一下单日志 paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson); // paymentMessageService.savePaymentMessage("3", orderId, refundRequestJson, refundResponseJson); } catch (WxPayException e) { } catch (Exception e) { throw new ServiceException(e.getMessage()); } } ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/HuiFuTianXiaUtil.java
@@ -7,6 +7,8 @@ import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.domain.R; import com.ruoyi.order.domain.dto.WechatPaymentRefundDto; import com.ruoyi.order.domain.dto.WeixinPaymentNotifyDto; import com.ruoyi.order.domain.vo.PaymentDelaytransHFTXVo; import com.ruoyi.order.domain.vo.WeixinPaymentNotifyVo; import com.ruoyi.order.domain.vo.WeixinPaymentRefundVo; @@ -18,7 +20,6 @@ import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.*; @@ -55,9 +56,6 @@ */ public static R<JSONObject> weixinPayment(String req_seq_id, String goods_desc, Double trans_amt, String sub_openid, String notify_url){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); NumberFormat numberInstance = NumberFormat.getInstance(); //最大两位小数 numberInstance.setMaximumFractionDigits(2); String url = "https://api.huifu.com/v2/trade/payment/jspay"; JSONObject data = new JSONObject(); data.put("req_date", sdf.format(new Date())); @@ -65,7 +63,7 @@ data.put("huifu_id", huifu_id); data.put("goods_desc", goods_desc); data.put("trade_type", "T_MINIAPP"); data.put("trans_amt", numberInstance.format(trans_amt)); data.put("trans_amt", String.format("%.2f", trans_amt)); JSONObject wx_data = new JSONObject(); wx_data.put("sub_appid", sub_appid); @@ -84,18 +82,13 @@ headers.put("Content-type","application/json; charset=utf-8"); headers.put("Accept", "application/json"); post.addHeaders(headers); System.err.println(JSON.toJSONString(body)); post.body(body.toJSONString()); HttpResponse execute = post.execute(); String result1 = execute.body(); execute.close(); if(StringUtils.hasLength(result1)){ JSONObject result = JSONObject.parseObject(result1); String result_data = result.getString("data"); String result_sign = result.getString("sign"); boolean verify = verify(result_data, result_sign); if(!verify){ return R.fail("结果验签失败"); } JSONObject resultData = result.getJSONObject("data"); String resp_code = resultData.getString("resp_code"); String resp_desc = resultData.getString("resp_desc"); @@ -114,18 +107,17 @@ /** * 微信支付回调数据处理 * @param jsonObject * @return */ public static R<WeixinPaymentNotifyVo> weixinPaymentNotify(JSONObject jsonObject){ String sign = jsonObject.getString("sign"); JSONObject resp_data = jsonObject.getJSONObject("resp_data"); String resp_code = jsonObject.getString("resp_code"); String resp_desc = jsonObject.getString("resp_desc"); public static R<WeixinPaymentNotifyVo> weixinPaymentNotify(WeixinPaymentNotifyDto dto){ String sign = dto.getSign(); JSONObject resp_data = JSON.parseObject(dto.getResp_data()); String resp_code = dto.getResp_code(); String resp_desc = dto.getResp_desc(); if("00000000".equals(resp_code)){ String code = resp_data.getString("resp_code"); String desc = resp_data.getString("resp_desc"); if("00000000".equals(code)){ if(!"00000000".equals(code)){ return R.fail(desc); } WeixinPaymentNotifyVo vo = new WeixinPaymentNotifyVo(); @@ -148,23 +140,20 @@ * @param req_seq_id 请求流水号 * @param ord_amt 退款金额 * @param org_req_date 原交易请求日期yyyyMMdd * @param org_party_order_id 原交易微信支付宝的商户单号 * @param org_req_seq_id 原交易请求流水号 * @param notify_url 异步通知地址 * @return */ public static R<String> weixinPaymentRefund(String req_seq_id, Double ord_amt, String org_req_date, String org_party_order_id, String notify_url){ public static R<String> weixinPaymentRefund(String req_seq_id, Double ord_amt, String org_req_date, String org_req_seq_id, String notify_url){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); NumberFormat numberInstance = NumberFormat.getInstance(); //最大两位小数 numberInstance.setMaximumFractionDigits(2); String url = "https://api.huifu.com/v2/trade/payment/scanpay/refund"; JSONObject data = new JSONObject(); data.put("req_date", sdf.format(new Date())); data.put("req_seq_id", req_seq_id); data.put("huifu_id", huifu_id); data.put("ord_amt", ord_amt); data.put("ord_amt", String.format("%.2f", ord_amt)); data.put("org_req_date", org_req_date); data.put("org_party_order_id", org_party_order_id); data.put("org_req_seq_id", org_req_seq_id); data.put("notify_url", notify_url); JSONObject body = new JSONObject(); @@ -178,23 +167,20 @@ headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.err.println(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result1 = execute.body(); execute.close(); if(StringUtils.hasLength(result1)){ JSONObject result = JSONObject.parseObject(result1); String result_data = result.getString("data"); String result_sign = result.getString("sign"); boolean verify = verify(result_data, result_sign); if(!verify){ return R.fail("结果验签失败"); } JSONObject resultData = result.getJSONObject("data"); String resp_code = resultData.getString("resp_code"); String resp_desc = resultData.getString("resp_desc"); String trans_stat = resultData.getString("trans_stat"); //交易受理成功;注:交易状态以trans_stat为准; String success1 = "00000000"; if(success1.equals(resp_code)){ String success2 = "00000100"; if(success1.equals(resp_code) || success2.equals(resp_code)){ String req_seq_id1 = resultData.getString("req_seq_id"); return R.ok(req_seq_id1); } @@ -206,14 +192,13 @@ /** * 微信支付退款回调通知 * @param jsonObject * @return */ public static R<WeixinPaymentRefundVo> weixinPaymentRefundNotify(JSONObject jsonObject){ String sign = jsonObject.getString("sign"); JSONObject data = jsonObject.getJSONObject("data"); String resp_code = data.getString("resp_code"); String resp_desc = data.getString("resp_desc"); public static R<WeixinPaymentRefundVo> weixinPaymentRefundNotify(WechatPaymentRefundDto dto){ String sign = dto.getSign(); JSONObject data = JSON.parseObject(dto.getResp_data()); String resp_code = data.getString("sub_resp_code"); String resp_desc = data.getString("sub_resp_desc"); if("00000000".equals(resp_code)){ WeixinPaymentRefundVo vo = new WeixinPaymentRefundVo(); vo.setReqSeqId(data.getString("req_seq_id")); ruoyi-modules/ruoyi-order/src/main/resources/bootstrap.yml
@@ -14,20 +14,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 @@ -46,6 +46,6 @@ apiV3Key: J8v9JDHKJYDHW9bdk30o2bdjy6z9mn1A privateKeyPath: /home/cert/apiclient_key.pem privateCertPath: /home/cert/apiclient_cert.pem callbackPath: http://221.182.45.100:1500 callbackPath: https://wxapp.hhhrt.cn ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java
@@ -15,6 +15,8 @@ import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -39,6 +41,8 @@ @RestController @RequestMapping("/mgt/shop") public class MgtShopController { Logger logger = LoggerFactory.getLogger(MgtShopController.class); @Resource private ShopService shopService; @@ -342,8 +346,8 @@ @RequestMapping(value = "/merchantBasicdataNotify", method = RequestMethod.POST) @Log(title = "商户进件回调通知(汇付天下)", businessType = BusinessType.UPDATE,operContent = "商户进件") public void merchantBasicdataNotify(@Validated @RequestBody JSONObject jsonObject, HttpServletResponse response){ R<String> r = shopService.merchantBasicdataNotify(jsonObject); public void merchantBasicdataNotify(MerchantBasicDataNotifyDto dto, HttpServletResponse response){ R<String> r = shopService.merchantBasicdataNotify(dto); if(r.getCode() == 200){ response.setStatus(200); PrintWriter out = null; ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerchantBasicDataNotifyDto.java
New file @@ -0,0 +1,27 @@ package com.ruoyi.shop.domain.dto; import lombok.Data; /** * @author zhibing.pu * @date 2023/10/20 18:47 */ @Data public class MerchantBasicDataNotifyDto { /** * 网关返回码 */ private String resp_code; /** * 网关返回描述 */ private String resp_desc; /*** * 签名 */ private String sign; /** * 业务数据 */ private String data; } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/ParamsAuthFilter.java
@@ -4,6 +4,7 @@ import com.alibaba.fastjson2.JSONObject; import com.ruoyi.common.core.utils.StringUtils; import lombok.extern.log4j.Log4j2; import org.apache.http.HttpEntity; import org.springframework.stereotype.Component; import javax.servlet.*; @@ -16,8 +17,9 @@ import java.net.URLDecoder; import java.util.HashMap; import java.util.Map; import java.util.Set; @Component //@Component @Log4j2 public class ParamsAuthFilter implements Filter { @@ -59,7 +61,6 @@ String requestUrl = request.getRequestURI(); Map<String, String> urlParams = getUrlParams(request); Map<String, String> bodyParams = getBodyParams(request); params.putAll(urlParams); params.putAll(bodyParams); log.info("-------------------- request header ----------------------"); @@ -90,6 +91,18 @@ return new HashMap<>(); } private Map<String, String> getFormParams(HttpServletRequest request) throws IOException { Map<String, String[]> parameterMap = request.getParameterMap(); Set<String> keySet = parameterMap.keySet(); Map<String, String> map = new HashMap<>(); for (String s : keySet) { String parameter = request.getParameter(s); map.put(s, parameter); } return map; } private Map<String, String> getUrlParams(HttpServletRequest request){ String queryParams = ""; try { ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -1140,24 +1140,28 @@ /** * 商户进件异步通知 * @param jsonObject * @return */ @Override public R<String> merchantBasicdataNotify(JSONObject jsonObject) { R<MerchantBasicdataVo> merchantBasicdataVoR = HuiFuTianXiaUtil.merchantBasicDataNotify(jsonObject); public R<String> merchantBasicdataNotify(MerchantBasicDataNotifyDto dto) { R<MerchantBasicdataVo> merchantBasicdataVoR = HuiFuTianXiaUtil.merchantBasicDataNotify(dto); if(merchantBasicdataVoR.getCode() != 200){ return R.fail(merchantBasicdataVoR.getMsg()); } MerchantBasicdataVo data = merchantBasicdataVoR.getData(); ShopAuthenticationHftx shopAuthenticationHftx = shopAuthenticationHftxService.getOne(new QueryWrapper<ShopAuthenticationHftx>().eq("req_seq_id", data.getReqSeqId())); if(!org.springframework.util.StringUtils.hasLength(shopAuthenticationHftx.getAuditStatus())){ if("U".equals(shopAuthenticationHftx.getAuditStatus())){ shopAuthenticationHftx.setAuditStatus(data.getAuditStatus()); shopAuthenticationHftx.setAuditDesc(data.getAuditDesc()); shopAuthenticationHftx.setHuifuId(data.getHuifuId()); shopAuthenticationHftx.setTokenNo(data.getTokenNo()); shopAuthenticationHftx.setApplyNo(data.getApplyNo()); shopAuthenticationHftxService.updateById(shopAuthenticationHftx); if("Y".equals(data.getAuditStatus())){ Shop shop = this.getByShopId(shopAuthenticationHftx.getShopId()); shop.setShopStatus(1); this.updateById(shop); } } return R.ok(data.getReqSeqId()); } @@ -1575,6 +1579,23 @@ List<ShopAuthentication> list = shopAuthenticationService.getShopAuthNeedUpdateStatus(); log.info("定时检查微信二级商户"+list.toString()); list.forEach(item -> queryApplyStatusByApplymentId(item.getApplymentId(), item.getShopId())); List<ShopAuthenticationHftx> list1 = shopAuthenticationHftxService.list(new QueryWrapper<ShopAuthenticationHftx>().eq("audit_status", "U").eq("is_delete", 0)); for (ShopAuthenticationHftx shopAuthenticationHftx : list1) { R<MerchantBasicdataVo> r = HuiFuTianXiaUtil.queryMerchantBasicdata(IdUtils.simpleUUID(), shopAuthenticationHftx.getHuifuId()); if(r.getCode() == 200){ MerchantBasicdataVo data = r.getData(); if(org.springframework.util.StringUtils.hasLength(data.getTokenNo())){ shopAuthenticationHftx.setTokenNo(data.getTokenNo()); shopAuthenticationHftx.setAuditStatus("Y"); shopAuthenticationHftx.setAuditDesc("成功"); Shop shop = this.getByShopId(shopAuthenticationHftx.getShopId()); shop.setShopStatus(1); this.updateById(shop); shopAuthenticationHftxService.updateById(shopAuthenticationHftx); } } } } /** ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java
@@ -233,10 +233,9 @@ /** * 商户进件回调异步通知 * @param jsonObject * @return */ R<String> merchantBasicdataNotify(JSONObject vo); R<String> merchantBasicdataNotify(MerchantBasicDataNotifyDto dto); ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java
@@ -6,6 +6,7 @@ import com.alibaba.fastjson.JSONObject; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.shop.domain.dto.MerchantBasicDataNotifyDto; import com.ruoyi.shop.domain.dto.MgtShopHFTXAuthDto; import com.ruoyi.shop.domain.pojo.shop.ShopAuthenticationHftx; import com.ruoyi.shop.domain.vo.MerchantBasicdataSettlementVo; @@ -23,7 +24,6 @@ import java.io.File; import java.io.IOException; import java.io.InputStream; import java.nio.charset.Charset; import java.security.KeyFactory; import java.security.PrivateKey; @@ -31,7 +31,6 @@ import java.security.Signature; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.text.NumberFormat; import java.text.SimpleDateFormat; import java.util.*; @@ -49,15 +48,24 @@ private static String publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAral1nmqS1vswaeFp3dAfUY4a/ql07382AMH4NOwewtf9iuiZa608hDVzGYIXYAr+mxj1WwJpSCp9Sn+zSJs4+9iGodMa9qfUQ4oi32zGKR1ND7OZwpXYZudqQrUfC8/0j1DjOWBlKWyqwIh2JLXOiJLrU+dbDJxCqyHv+rO55egjD5yVLEJLkB/n1peIsfbqozKu7rpkx4bUAP1PvMmP913np2gYKsTrjGo7B/NqzkQ98mtL/VMOIbha0qN+MpEWImT/mOlgxvmr7YnTr3e7Iu/gSm8HR/5kLqmO4WmHALnoq7vDnOWpyM7c+awIxRTwoT8mwCuxPTLBUZ5UEmpIYwIDAQAB"; //商户号 private static String huifu_id = "6666000141279152"; //控制台地址https://dashboard.huifu.com/customers/login,用户名为hh_hrt,最新密码为xw123456 //私钥(Base64编码) private static String channel_privateKeyBase64 = "MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQCB7Flp+4FuRBvW4FLx5FoR/Hbj1UWJbgt9JAgO5iCFR9MhxXu783hvP88STFWyNkCeAh9EIwVcJxm80Kmt87KH4Nwo1ejfqF8kUkK02byVby39fqTJlyqeDYKjqqc04GpnL7vi4iD4rKGvjyJIFxekCcOSTFWVl879fbPn9+ljsVrrjoyzbPMvPJHPuc2dzkWP98C+y5QFDIdjyS8NrVOpJcwVFrcxkmCmK6azTi6LJeI/wH9MsJHmnF9ZilqY1x00XbTMxE4EfTgXgmv6dvRac6VrqQowUCqIrHpVJIdet1w56vmz3IpxORIOPzU2nY9ziZrMIgGkJ1bLQRbLK2RXAgMBAAECggEAKA4i/u7AV6t93cBpMhRRxIvOZ61/87/OoPUz2swOKKkdKaNF44tLjRjiEWUhYoEhaNWEqDAX3fJcF/9I4M1qNEQZ/Cj+072IH52Q3UrnvjZ5ulaKHXCSfgnyRd0+EapCg6+OwIMw4Rnv+z0ot4sPCc7M0dTg6e7UrQhNJ+4hsU8yZAMzmQyUu7pE6tvbE+u5QdRZRMQIYPgzwpy5Yta0gtRSmMQ9jneUYwEJ5eu8ZhAXRzEWqAA9GgOLgAwC2Ma1xkVyiBS/7pfd0fwbxapzMZMQMbCsv+UrYGYkXDp/1XwrpNWavfHpSCc9fkK2auEqYJtYlhELoa87+WrBOHhkkQKBgQDMi73gDw47XH0T6zuJn2ieDDc7IU1DV9RXXNJNxgcB0yBM8HaI8lv27eThphlEU13KWKTHAylm/q7v4dp88aC+iA3GhIbmE1sWxiSJvwGR2xqmWvIHTadJtQFdXJN+/GmG1fJuCRwkZSyGdUXUdmx3PBATEqUwuSQQDQkMvxYjrwKBgQCimxdXNEZrZKHCbHWTHx0nUu0lF7skgi8x+xLbDT096WvqpeNxOZXVZVhU7yHn2ePF9iFipg8uHviUIJyB2Rzr1M2busY3yoRutXlugZJ9ZVUlxpIpNI94ntcOZUctgfd1quhlgqEwcF1PJ5lkogrKHvLoV30fvgkYpA763ZNr2QKBgDgDkKS6GsCgzFPXGD/Q2pplZ/6WWQ03ERw3fBP2Rdb3FSJcu2k3TX3qmcI9dS/j0IxoB//D2uOsnQVuCSIsHUPwCC2z/ykkZc5vxnO+TdS+dqbVwu/DESu7GLuTbYTZ5KAbGL+PWRiSaEYN+Wh8YampVhGTCo+0M679ktvdvFdbAoGACtCz+bnhYS09URgzrchpAP+UBF6StPfvuaxQcb9srlyDMAU+nn5NB/eIq4WIRMqKStV3HP+cjN3EfN26ayyMrublkhEXNAjFTDPH0uDNZIfD5RJTEGiNjmFKPovf8xfs5Kesc2v/2p/upOAmZLoea5kpYOjIyr6yDjCDSo5ISukCgYBtOo2AgFXyzW1ti8MCsz77BtCJ9MgVoPF4y4Ah8l/6Dwe+cevdlWuOYckIAJqJ9g2FYwp9AAevK7k17xsgBgrdqlI77p3wQb7p/znJnNU6qz78FwUzd8t5WvqFh+3mTxjG7Iyj6brLzEUt8McdmGlwbFJqKgUxBKS4mY7T399L5Q=="; //公钥(Base64编码) private static String channel_publicKeyBase64 = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgexZafuBbkQb1uBS8eRaEfx249VFiW4LfSQIDuYghUfTIcV7u/N4bz/PEkxVsjZAngIfRCMFXCcZvNCprfOyh+DcKNXo36hfJFJCtNm8lW8t/X6kyZcqng2Co6qnNOBqZy+74uIg+Kyhr48iSBcXpAnDkkxVlZfO/X2z5/fpY7Fa646Ms2zzLzyRz7nNnc5Fj/fAvsuUBQyHY8kvDa1TqSXMFRa3MZJgpiums04uiyXiP8B/TLCR5pxfWYpamNcdNF20zMROBH04F4Jr+nb0WnOla6kKMFAqiKx6VSSHXrdcOer5s9yKcTkSDj81Np2Pc4mazCIBpCdWy0EWyytkVwIDAQAB"; //汇付公钥 private static String channel_publicKey = "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAgmGZVY0i5r17BnHiLeL7TbqojpuOmR947JIUB5zYcc/TTYijkCsjtshmvxWslZBdkV6K8/1CmHRAY92+4GZnem6MVO34xn1wTCq65+wMC1oypjJy9T6N0WXoGaf+Wn0nxPdJLvnwpOo6epEES3kQKx+i/Qar7oDwlXMQ6b2QwR/id9cYudN0RmdRLzkmrwEOkjv+WcWCQdoAXv4JWJwU+iwJffoJrWn5pGeVFWFrH1fRJ0IB4YdaL9aWMn2YM5pu+/mcOKQogmNYzsHkZDapX3AF+es0TN+v/qOCgU3OVTVa7ltDAiLuPtMeu/72pQiM0nxunRVnAJDo2BQ5mu6z4wIDAQAB"; //渠道号 private static String channel_id = "6666000140729384"; //控制台地址https://dashboard.huifu.com/partners/login,用户名为hongrt,最新密码为xw123456 //产品号 private static String product_id = "KAZX"; //微信小程序appid private static String sub_appid = "wxb7f0ea286fc4e535"; //本地文件存储位置 private static String path = "D:\\file"; //控制台地址https://dashboard.huifu.com/customers/login,用户名为hongruitang,最新密码为xw123456 //接口文档https://paas.huifu.com/partners/api/#/ @@ -70,11 +78,8 @@ * @param sub_openid 微信小程序用户openid * @param notify_url 异步通知回调地址 */ public static R weixinPayment(String req_seq_id, String goods_desc, Double trans_amt, String sub_openid, String notify_url){ public static R<JSONObject> weixinPayment(String req_seq_id, String goods_desc, Double trans_amt, String sub_openid, String notify_url){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); NumberFormat numberInstance = NumberFormat.getInstance(); //最大两位小数 numberInstance.setMaximumFractionDigits(2); String url = "https://api.huifu.com/v2/trade/payment/jspay"; JSONObject data = new JSONObject(); data.put("req_date", sdf.format(new Date())); @@ -82,7 +87,7 @@ data.put("huifu_id", huifu_id); data.put("goods_desc", goods_desc); data.put("trade_type", "T_MINIAPP"); data.put("trans_amt", numberInstance.format(trans_amt)); data.put("trans_amt", String.format("%.2f", trans_amt)); JSONObject wx_data = new JSONObject(); wx_data.put("sub_appid", sub_appid); @@ -96,7 +101,7 @@ body.put("product_id", product_id); body.put("sign", sign(data.toJSONString())); body.put("data", data); System.out.print(JSON.toJSONString(body)); System.err.println(JSON.toJSONString(body)); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); @@ -108,12 +113,6 @@ execute.close(); if(StringUtils.hasLength(result1)){ JSONObject result = JSONObject.parseObject(result1); String result_data = result.getString("data"); String result_sign = result.getString("sign"); boolean verify = verify(result_data, result_sign); if(!verify){ return R.fail("结果验签失败"); } JSONObject resultData = result.getJSONObject("data"); String resp_code = resultData.getString("resp_code"); String resp_desc = resultData.getString("resp_desc"); @@ -121,7 +120,8 @@ String success1 = "00000000"; String success2 = "00000100"; if(success1.equals(resp_code) || success2.equals(resp_code)){ JSONObject pay_info = resultData.getJSONObject("pay_info"); return R.ok(pay_info); } return R.fail(resp_desc); } @@ -140,15 +140,12 @@ */ public static R<String> weixinPaymentRefund(String req_seq_id, Double ord_amt, String org_req_date, String org_party_order_id, String notify_url){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); NumberFormat numberInstance = NumberFormat.getInstance(); //最大两位小数 numberInstance.setMaximumFractionDigits(2); String url = "https://api.huifu.com/v2/trade/payment/scanpay/refund"; JSONObject data = new JSONObject(); data.put("req_date", sdf.format(new Date())); data.put("req_seq_id", req_seq_id); data.put("huifu_id", huifu_id); data.put("ord_amt", ord_amt); data.put("ord_amt", String.format("%.2f", ord_amt)); data.put("org_req_date", org_req_date); data.put("org_party_order_id", org_party_order_id); data.put("notify_url", notify_url); @@ -246,6 +243,33 @@ } /** * RSA私钥签名:签名方式SHA256WithRSA * @param data 待签名字符串 * @return 签名byte[] * @throws Exception */ public static String channel_sign(String data) { //先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。 data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class)); // Base64 --> Key try { byte[] bytes = Base64.getDecoder().decode(channel_privateKeyBase64); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(bytes); KeyFactory keyFactory; keyFactory = KeyFactory.getInstance("RSA"); PrivateKey privateKey = keyFactory.generatePrivate(keySpec); // Sign Signature signature = Signature.getInstance("SHA256WithRSA"); signature.initSign(privateKey); signature.update(data.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(signature.sign()); } catch (Exception e) { return null; } } /** * 使用汇付RSA公钥验签 @@ -272,7 +296,34 @@ e.printStackTrace(); return false; } } /** * 使用汇付RSA公钥验签 * @param data 待签名字符串 * @return 验签结果 * @throws Exception */ public static boolean channel_verify(String data, String sign) { //先对该json对象数据按照参数字典顺序(参数名ASCII码从小到大排序,参数名区分大小写)排序生成字符串,再进行加签和验签。 data = JSON.toJSONString(JSONObject.parseObject(data, TreeMap.class)); // Base64 --> Key try { byte[] bytes = Base64.getDecoder().decode(channel_publicKeyBase64); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(bytes); KeyFactory keyFactory; keyFactory = KeyFactory.getInstance("RSA"); PublicKey publicKey = keyFactory.generatePublic(keySpec); // verify Signature signature = Signature.getInstance("SHA256WithRSA"); signature.initVerify(publicKey); signature.update(data.getBytes("UTF-8")); return signature.verify(Base64.getDecoder().decode(sign)); } catch (Exception e) { e.printStackTrace(); return false; } } @@ -376,12 +427,14 @@ }else{ return R.fail(r.getMsg()); } r = supplementaryPicture(dto.getSettleCardFrontPic(), IdUtils.simpleUUID(), "F13"); if(r.getCode() == 200){ data.put("settle_card_front_pic", r.getData()); shopAuthenticationHftx.setSettleCardFrontPicNo(r.getData()); }else{ return R.fail(r.getMsg()); if(!"0".equals(dto.getCardType())){ r = supplementaryPicture(dto.getSettleCardFrontPic(), IdUtils.simpleUUID(), "F13"); if(r.getCode() == 200){ data.put("settle_card_front_pic", r.getData()); shopAuthenticationHftx.setSettleCardFrontPicNo(r.getData()); }else{ return R.fail(r.getMsg()); } } r = supplementaryPicture(dto.getSettleCertBackPic(), IdUtils.simpleUUID(), "F56"); if(r.getCode() == 200){ @@ -425,7 +478,7 @@ }else{ return R.fail(r.getMsg()); } if(!dto.getLegalName().equals(dto.getCardName())){ if(!"0".equals(dto.getCardType()) && !dto.getLegalName().equals(dto.getCardName())){ r = supplementaryPicture(dto.getAuthEnturstPic(), IdUtils.simpleUUID(), "F15"); if(r.getCode() == 200){ data.put("auth_enturst_pic", r.getData()); @@ -473,7 +526,7 @@ headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.out.println(JSON.toJSONString(body)); System.err.println(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result = execute.body(); execute.close(); @@ -504,15 +557,14 @@ /** * 企业进件通知回调处理 * @param jsonObject * @return */ public static R<MerchantBasicdataVo> merchantBasicDataNotify(JSONObject jsonObject){ public static R<MerchantBasicdataVo> merchantBasicDataNotify(MerchantBasicDataNotifyDto dto){ String ok = "200"; String success = "10000"; String resp_code = jsonObject.getString("resp_code"); String resp_code = dto.getResp_code(); if(ok.equals(resp_code) || success.equals(resp_code)){ JSONObject data = jsonObject.getJSONObject("data"); JSONObject data = JSON.parseObject(dto.getData()); String sub_resp_code = data.getString("sub_resp_code"); String sub_resp_desc = data.getString("sub_resp_desc"); //处理成功 @@ -534,7 +586,7 @@ } return R.fail(sub_resp_desc); } return R.fail(jsonObject.getString("resp_desc")); return R.fail(dto.getResp_desc()); } @@ -664,7 +716,7 @@ body.put("product_id", product_id); body.put("sign", sign(data.toJSONString())); body.put("data", data); System.out.println(JSON.toJSONString(body)); System.err.println(JSON.toJSONString(body)); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); @@ -699,6 +751,56 @@ } /** * 查询商户信息 * @param huifuId * @return */ public static R<MerchantBasicdataVo> queryMerchantBasicdata(String req_seq_id, String huifuId){ String url = "https://api.huifu.com/v2/merchant/basicdata/query"; SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); JSONObject data = new JSONObject(); data.put("req_seq_id", req_seq_id); data.put("req_date", sdf.format(new Date())); data.put("huifu_id", huifuId); JSONObject body = new JSONObject(); body.put("sys_id", channel_id); body.put("product_id", product_id); body.put("sign", channel_sign(data.toJSONString())); body.put("data", data); HttpRequest post = HttpUtil.createPost(url); Map<String, String> headers = new HashMap<>(); headers.put("Content-type","application/json; charset=utf-8"); headers.put("Accept", "application/json"); post.addHeaders(headers); post.body(body.toJSONString()); System.err.println(JSON.toJSONString(body)); HttpResponse execute = post.execute(); String result = execute.body(); execute.close(); if(!StringUtils.hasLength(result)){ return R.fail("请求异常"); } JSONObject jsonObject = JSON.parseObject(result); JSONObject resultData = jsonObject.getJSONObject("data"); String resp_code = resultData.getString("resp_code"); String resp_desc = resultData.getString("resp_desc"); //处理成功 String success1 = "00000000"; //交易正在处理中 String success2 = "00000100"; //审核中 String success3 = "90000000"; MerchantBasicdataVo vo = new MerchantBasicdataVo(); if(success1.equals(resp_code) || success2.equals(resp_code) || success3.equals(resp_code)){ JSONArray qry_cash_card_info_list = resultData.getJSONArray("qry_cash_card_info_list"); JSONObject jsonObject1 = qry_cash_card_info_list.getJSONObject(0); vo.setTokenNo(jsonObject1.getString("token_no")); return R.ok(vo); } return R.fail(resp_desc); } @@ -740,7 +842,7 @@ if (statusCode == org.apache.http.HttpStatus.SC_OK) { HttpEntity resEntity = response.getEntity(); result = EntityUtils.toString(resEntity); System.out.print(result); System.err.println(result); } if(!StringUtils.hasLength(result)){ return R.fail("请求异常"); ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml
@@ -1,4 +1,4 @@ # Tomcat # Tomcatde server: port: 10063 @@ -14,20 +14,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置 @@ -47,4 +47,4 @@ privateKeyPath: /home/cert/apiclient_key.pem privateCertPath: /home/cert/apiclient_cert.pem callback_path: http://221.182.45.100:1500 callback_path: https://wxapp.hhhrt.cn ruoyi-modules/ruoyi-shop/src/test/java/com/ruioyi/shop/shopTest.java
@@ -5,6 +5,7 @@ import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.shop.RuoYiShopApplication; import com.ruoyi.shop.domain.vo.MerchantBasicdataSettlementVo; import com.ruoyi.shop.domain.vo.MerchantBasicdataVo; import com.ruoyi.shop.service.task.AgencyTaskService; import com.ruoyi.shop.util.HuiFuTianXiaUtil; import org.junit.Test; @@ -31,8 +32,8 @@ @Test public void test(){ R r = HuiFuTianXiaUtil.weixinPayment(IdUtils.simpleUUID(), "支付测试", 0.01D, "oRett5nJInl1AsxEEwHGPBpRKwzw", ""); // R r = HuiFuTianXiaUtil.weixinPayment(IdUtils.simpleUUID(), "支付测试", 0.01D, "oRett5nJInl1AsxEEwHGPBpRKwzw", ""); // R<List<MerchantBasicdataSettlementVo>> merchantBasicdataSettlement = HuiFuTianXiaUtil.getMerchantBasicdataSettlement(IdUtils.simpleUUID(), "6666000140729384", "20231001", "20231015", "1", "10"); R<MerchantBasicdataVo> merchantBasicdataVoR = HuiFuTianXiaUtil.queryMerchantBasicdata(IdUtils.simpleUUID(), "6666000141286934"); } } ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml
@@ -18,20 +18,20 @@ nacos: discovery: # 服务注册地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f config: # 配置中心地址 # server-addr: 47.109.78.184:5000 server-addr: 127.0.0.1:8848 server-addr: 47.109.78.184:5000 # server-addr: 127.0.0.1:8848 #pro # namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 namespace: 9591ef9f-a49a-4900-be35-d77258bdd639 #dev namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # namespace: 6857cbd9-6088-4fe8-bb58-2b516d99876f # 配置文件格式 file-extension: yml # 共享配置