puzhibing
2023-10-20 11e778f72b830a4050c293d78694417d32055727
对接第三方分账接口
3个文件已添加
17个文件已修改
517 ■■■■■ 已修改文件
ruoyi-gateway/src/main/resources/bootstrap.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-file/src/main/resources/bootstrap.yml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/bootstrap.yml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-member/src/main/resources/bootstrap.yml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/controller/miniapp/NotifyController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/WechatPaymentRefundDto.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/domain/dto/WeixinPaymentNotifyDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/fliter/ParamsAuthFilter.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/order/OrderServiceImpl.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/java/com/ruoyi/order/util/HuiFuTianXiaUtil.java 61 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-order/src/main/resources/bootstrap.yml 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/domain/dto/MerchantBasicDataNotifyDto.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/fliter/ParamsAuthFilter.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 29 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/util/HuiFuTianXiaUtil.java 172 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/bootstrap.yml 20 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/test/java/com/ruioyi/shop/shopTest.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/bootstrap.yml 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
        # 共享配置