liujie
2025-11-17 c9a7a6565932e024b96cdf39f99de1aba8e0b794
update
1个文件已修改
122 ■■■■■ 已修改文件
UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DouGongPayUtil.java 122 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
UserJYXTravel/guns-admin/src/main/java/com/stylefeng/guns/modular/system/util/DouGongPayUtil.java
@@ -3,10 +3,24 @@
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.huifu.bspay.sdk.opps.core.BasePay;
import com.huifu.bspay.sdk.opps.core.config.MerConfig;
import com.huifu.bspay.sdk.opps.core.utils.DateTools;
import com.huifu.bspay.sdk.opps.core.utils.SequenceTools;
import com.stylefeng.guns.core.util.HttpUtils;
import com.stylefeng.guns.modular.huifu.biz.DouGongBasicDataBiz;
import com.stylefeng.guns.modular.huifu.properties.HuiFuProperties;
import org.springframework.beans.factory.annotation.Autowired;
import java.security.KeyFactory;
import java.security.PrivateKey;
import java.security.Signature;
import java.security.spec.PKCS8EncodedKeySpec;
import java.util.Base64;
import java.util.TreeMap;
import static com.aliyun.oss.model.RoutingRule.Protocol.Http;
@@ -17,17 +31,51 @@
    @Autowired
    private HuiFuProperties huiFuProperties;
    public static void main(String[] args) {
    public static void main(String[] args) throws Exception {
//        MerConfig merConfig = new MerConfig();
//        merConfig.setProcutId("KAZX");
//        merConfig.setSysId("6666000182995771");
//        merConfig.setRsaPrivateKey("MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4=");
//        merConfig.setRsaPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAsWrruP9JBxrUd8uEX5Z8y7pg/UIr5RNHSgDnHqNI1hbi2MfTzB5vZ275wSFFaLDD9BesgDWqsUepPS/opROlDCg9y6WYH8mkN23NmHL9F8kT48OMmH722am+Hp0XVMMwXqA0oNt4f7oW6kDemjZW8/RT4vIE7cyxoxSsVRvjqSpx9wDgFLPWh3o0pHQaoxLyeUsGBATHFrxEDlosBvsuXjMcgjPKXALrcemzKOhBmBkLgyxNVmh61ZK+FNXd+/X4PeZlnWf54NRQAUKe1308E6IIaszo+CjneKuhj1m/X4f7AIvxAqlhuCV5E/DfKRmGopxaWqdtE960Y/H4SmBh2wIDAQAB");
//        BasePay.initWithMerConfig(merConfig);
//        request.setReqDate(DateTools.getCurrentDateYYYYMMDD());// 请求日期
//        request.setReqSeqId(SequenceTools.getReqSeqId32()); // 请求流水号
//        request.setHuifuId("6666000109111111"); // 商户号
//        request.setGoodsDesc("上海合力批发站(货款)");// 商品描述
//        request.setTransAmt("20.00"); // 交易金额
//        request.setRemark("JSPAY:ID:102");//交易备注
//// 设置超时时间
//        request.setTimeExpire("20250916202931");
//// 设置异步通知地址
//        request.setNotifyUrl("https:/www.demoSite.com/api/public/hf/smstorecallback");
//// 延迟交易能力 延迟入账标识
//        request.setDelayAcctFlag("N");
//// 实时分账能力 设置分账信息,需要分账权限
//// request.setAcctSplitBunch("{\"acct_infos\":[{\"div_amt\":\"4.00\",\"huifu_id\":\"666600016871111\"}," +
////                           "{\"div_amt\":\"16.00\",\"huifu_id\":\"6666000169391112\"}]}");
//
////以下为微信小程序需要的参数
//        ObjectMapper objectMapper = JacksonUtils.getInstance();
//        String wxDataString="";
//// {"sub_appid":"wxa350b4c0fd003192","sub_openid":"o4n3E6q8MOEQefCsGKVOAh40spNw"}
//        WxData wxData = new WxData();
//        wxData.setSubOpenid("o8jhotzittQSeFF-N0Yj4Hz91Rqc");
//        wxData.setSubAppid("wx4f4f5a5f5a5f5aFF");
////微信相关参数可参考官方文档 https://pay.weixin.qq.com/doc/v2/merchant/4011935214
////复杂{"body":"香土鸡餐馆:线下支付","detail":{"cost_price":"1.0","goods_detail":[{"goods_id":"1967776038541551111","goods_name":"香土鸡餐馆:线下支付","price":"1.0","quantity":1}],"receipt_id":"1970743410445500000"},"scene_info":{"store_info":{"id":"1967776038541550000","name":"香土鸡餐馆:线下支付"}},"sub_appid":"wx969f2ef2df1111","sub_openid":"oqVX87O2I2U3rT-BBBBBBBB-YsU"}
//        wxDataString = objectMapper.writeValueAsString(wxData);
//        request.setTradeType("T_MINIAPP"); // 交易类型 - 微信小程序
//        Map<String, Object> response = Factory.Payment.Common()
//                .optional("method_expand",wxDataString).create(request);
//        System.out.println("T_JSAPI返回数据:" + JacksonUtils.convert2JsonString(response));
        HttpRequest post = HttpUtil.createPost("https://api.huifu.com/v4/trade/payment/create");
        post.body("{\n" +
                "  \"sys_id\": \"ACWILL\",\n" +
                "  \"product_id\": \"JCTEST\",\n" +
                "  \"sign\": \"\",\n" +
                "  \"data\": {\n" +
                "    \"req_seq_id\": \"202508281506304989897129zz\",\n" +
                "    \"req_date\": \"20250828\",\n" +
                "    \"huifu_id\": \"6666000108604566\",\n" +
                "    \"trade_type\": \"U_MICROPAY\",\n" +
        String a ="{\n" +
                "    \"req_seq_id\": \"20250828150630498989712913\",\n" +
                "    \"req_date\": \"20251117\",\n" +
                "    \"huifu_id\": \"6666000182995771\",\n" +
                "    \"trade_type\": \"A_JSAPI\",\n" +
                "    \"combinedpay_data\": \"\",\n" +
                "    \"trans_amt\": \"0.01\",\n" +
                "    \"goods_desc\": \"支付宝Native\",\n" +
@@ -38,13 +86,63 @@
                "    \"acct_split_bunch\": \"\",\n" +
                "    \"terminal_device_data\": \"{\\\"device_ip\\\":\\\"172.28.52.52\\\",\\\"devs_id\\\":\\\"SPINTP104120617260257\\\"}\",\n" +
                "    \"notify_url\": \"\",\n" +
                "    \"method_expand\": \"{\\\"auth_code\\\":\\\"6220888888888208\\\"}\"\n" +
                "    \"method_expand\": \"{\\\"buyer_logon_id\\\":\\\"17828262728\\\"}\"\n" +
                "  }";
        // 去掉换行、空格等格式字符
        a = a.replaceAll("\\s", "");
        a = JSON.toJSONString(JSONObject.parseObject(a, TreeMap.class));
        String sign = sign(a, "MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCR6W3ynQJL7f2C8vFYMcQkcirpkif9ZhLq1374jIlV87nv0T9uIm6DoW8LyNEl9w2Yc5qoBv70tt/oVpemA6IZY6NXzE2USNi/sv2qUTtapcIRYxe4acCfY8K+x+p7W2e6wUWIpl9qgZA+UnFmHQ0HT6Ywzq2jJL92JdIs147Ud1aVi3aX8LYItj0z3ZKwZQkaJawZSWQk2+EdPfN059L2qFkPtnT7JIthAdUTJYZA13K4tzw6mXp/DbgwVmLhrlmwl/ccSv2Q0ABfEk7jIxF1nZmCmSy3HrEw9xWyrg1BC+DgXBdyF0OEtpNfv+UW080syUVBNN0irHVuDP81BaAjAgMBAAECggEAGlBZprZQErdxz6rWgYxADj6UpJjaI2XEJZwFZveZUOnqb2hyIv+MpKp5Z0upBErApey7SHAyjJlqWfE72hGvqxp/+7Z5izNz+2ZhPtT1ekyIajBPt89CkLwiA9vz2plKZLC0RIeUj5WcGNEvaDX3AomHtCehwtk+uiTp+XJKbOBtkkQszcdCGY1DVoQ0ppFoINnM9VLbEzaFaG7VS3eFkU4cf2CwcrnJB1RncyPFK+bGFvjkLM/eQbsh8YxkBqaGz/8UM1Na1SEidqdyUF71ltqnI0u8pLe0V+5jugVW+3lPL/p1C3i7mAbQOs4yqRWlFaGVTzOawoQUOPVwDpzeeQKBgQDs1P7F4wURqX1qZR0hSTqOigg48ychaOF66new3SuWk2CVBy8Q8b7odGSPyxJSGZvFLoznPYuSaXCtQ935WWfjB7Z5JpSWCi9BmJnkh41k/KvgMqAEGkZP6ul/zFnDWj94VwXEBz3TuRk574vK2coWoxjM6h1dlJjRBVVTs8dnrQKBgQCduKCjPDUuOHbcNn3VsaHEZX1XyiXN5gds08o61PjiHM42wYXxfUt59nBJmg2yAVRIrKYHfswJcxb5XUTDI5ZhCBnIPrdrQzj7FNadm/7mKDvSsvZdpfTiHY341XnvCq7OcNNj8g5fVsWF769strepQReSug7xgX7ojPvVcAZhDwKBgD57KwP2Er5IIuhQ6NCBS0uTqvurWqV70BDnjtBAaWF+XDq0/HvR63XUTzuIbbrvOqNY1p+jIxFrc+iiQQupxLimrkNkJEs5QKJjqiYahPkhmA68DG9Ip0gqR5QJy5y4UIplGwZOiscyzC72vcC0mJZETSSylzC7JV3vtEUy5ua5AoGAEwlDqjAMIyYBgpa5HV+xLKkrNbtaUL2gy8vMLsmhuHjNkuJMrlb3EyNhbiC/4moyqArehy0Qp1tSvIo7UGotLkzx/69CKBoW+IcNWDyJyXG1trqO7cKoCdqTViM98lIRwyzu9rMydONeN8o0HCT5id4nYDhAsXl1vc+2XY6F1pUCgYEA0dxGHBTKD/WzIvTYGYD6Xx224Y84mO6x2Mu16zFoq/NjuIdKi2O+92yrKDCMMCqaY77fXvWD3eI7QYYlbKAOqdLKVipTbhnBccDyNbtYHVg59t4xS+K6HyD+quVkL9n40UkxSZbKZBQhqt+vlQy0FUgONFii1ACZO0A8Sc/bvn4=");
        System.out.println(a);
        String p ="{\n" +
                "  \"sys_id\": \"6666000182995771\",\n" +
                "  \"product_id\": \"KAZX\",\n" +
                "  \"sign\": \""+sign+"\",\n" +
                "  \"data\": {\n" +
                "    \"req_seq_id\": \"20250828150630498989712913\",\n" +
                "    \"req_date\": \"20251117\",\n" +
                "    \"huifu_id\": \"6666000182995771\",\n" +
                "    \"trade_type\": \"A_JSAPI\",\n" +
                "    \"combinedpay_data\": \"\",\n" +
                "    \"trans_amt\": \"0.01\",\n" +
                "    \"goods_desc\": \"支付宝Native\",\n" +
                "    \"remark\": \"交易备注\",\n" +
                "    \"time_expire\": \"\",\n" +
                "    \"delay_acct_flag\": \"N\",\n" +
                "    \"fee_flag\": \"\",\n" +
                "    \"acct_split_bunch\": \"\",\n" +
                "    \"terminal_device_data\": \"{\\\"device_ip\\\":\\\"172.28.52.52\\\",\\\"devs_id\\\":\\\"SPINTP104120617260257\\\"}\",\n" +
                "    \"notify_url\": \"\",\n" +
                "    \"method_expand\": \"{\\\"buyer_logon_id\\\":\\\"17828262728\\\"}\"\n" +
                "  }\n" +
                "}\n");
                "}\n";
        System.out.println(p);
        post.body(p);
        HttpResponse execute = post.execute();
        System.out.println(execute.body());
    }
    public static String sign(String data, String privateKeyBase64) {
        // Base64 --> Key
        try {
            byte[] bytes = Base64.getDecoder().decode(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;
        }
    }
}