diff --git a/cash-sdk/aggregation-pay/src/main/java/com/czg/alipay/AlipayEntryManager.java b/cash-sdk/aggregation-pay/src/main/java/com/czg/alipay/AlipayEntryManager.java index db63e8645..d33793279 100644 --- a/cash-sdk/aggregation-pay/src/main/java/com/czg/alipay/AlipayEntryManager.java +++ b/cash-sdk/aggregation-pay/src/main/java/com/czg/alipay/AlipayEntryManager.java @@ -13,7 +13,7 @@ import com.alipay.v3.util.model.AlipayConfig; /** * 支付宝进件管理 * - * ... + * ... * @author yjjie * @date 2025/12/29 14:11 */ @@ -24,9 +24,9 @@ public class AlipayEntryManager { // 初始化alipay参数(全局设置一次) AlipayConfig alipayConfig = new AlipayConfig(); alipayConfig.setServerUrl("https://openapi.alipay.com"); - alipayConfig.setAppId("2021004174605036"); + alipayConfig.setAppId("2021006121646825"); alipayConfig.setAlipayPublicKey("MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAiQkrz+emAuS1mB3KKDOMmAZRd/BlPbh7fAIHAqAj1+QCZNcV3o2BTLIIqnuKpSlFXDG3uDzp2VsBxcizXuBbFyPGylnD9CgCj5abyh3+FIHPAZ2IM3TtpqImZ0TSPGXrMli4Nir7MvZktgccCqQKCC4o6iaDGz+UwWwJUIPna8fm2tiTZ+KH150CZbKVj4ZGNpBh5XSV/1dRgyQIV9D/EwSbkZ0n6VgKQLJBi0C2UE3QB17aL1Ir6+gDXIDbknN8O7GUD3aMGdThYdSRUb5wp9CZ5qfV7vCS/CgaRo38nhH3NOzkTL+7v0m1ZDHPmqEkn9VzZN6sCQdL7PoAOjHOCwIDAQAB"); - alipayConfig.setPrivateKey("MIIEvwIBADANBgkqhkiG9w0BAQEFAASCBKkwggSlAgEAAoIBAQD48HaUoV7OH7os+9L01kHgxzwIhJick4OkFq4aHsntsXEJ J3gedhuEZtV8oHKZ30DPW12IJ4S8NXtpr8OWaqrAPFonf4wVaRY1d0yIAea57kfLEn9oOEEy4FzARgMNDkyxC+/3OUdGbLHpTjfVX3gusXsEhUDy1/WewihAkoNYF37+W3W/uVLzeWoPq0EcUbRv/G/t/p6gL69ltsMAiVFG4Q/Yk24YAN6lYgBPNLXUEwQ1Q+T+1omjfavHgvarKOp33z3JOUH+aGOmDsJ5Y9gyGtJzOCipAd8Zcv+T1ygsEzZYO1/gzcbPnfO1ShqStCHzssuw8FBVx2JdfQKXKMMNAgMBAAECggEAVTrO/pg5Q00titU1Jspsh67u6OOs9H605Ws2dI7yB8VmtAGlaJh7V1t14FN2qSP8poHbhhAxq9aLyGV7C3a9u09udnN+3J28EtYjh7VO732bavWMVXxdJjQWzWWrCb9JlpxFrlkYBA6W4w/6ob0sAqCVQ7jzwbEa0R4cde8ztOa5nysKSfr4YTSs0gqvoiC6fmg8eiRJraEQBoYz9VkKFtOhhh/4w5FhVcYQ2gQvZ3kK3QVuD1eJIQKlCtz8qaox9lXKDiZT4SCmnKshdUL0u5TYIcYeBjZmhJz0Q50KHcpZrCs5y7I0+vRBH3hU+TKSQt7ureymwhbwWMHScLV2gQKBgQD+58SHXhr5M8NGagAmTdsgmCnNv2kOYMd4STyPMY10SVwCv1Bk808ZuP+7e558J1b5/OuDLI5dLq6xrZ/1wLv1G++XqxI00hlFuWS5mUGJVcXotT1mw20rVeUILc7Qe3mLvbMGgfyKf4A7Qa5SSZ4bDeDTJYaFxyiQ281hMzDuPQKBgQD6AiL/Na2/uPH4CG6juwpjYvYVUcjK+7gbRwf3wWsWMpk90Z4ju2iUiP5c1J/oK9P+1T3PIr6M4Xjza8JJj+r9KC/PVB0gBv6vVM96cDpKUEy/UMpcn/T81vqj/Z+WEOODU8Ms6NiTTm+u9ldvpCjbu0u8M+9c0JeIyadJvSTFEQKBgQCsxmFyM3nq8YfpgU2qqNjfBeRH3faSVUy+nj1a/YZYjKS+A/i1BCnYUImeBVNN6chNV342ggvY4xxruDiU9Vcw8wd58O09Oi8BEIFSP6upL6cebUI6Fjo3xlegLJRiwV6INkNTJOYM5hD/mSxUACwXQFfkJipBINXBIgraWD1RLQKBgQCj49axWq0F6+WjZVOyPaD3uh37p9trRUxRhWTxw3fB23WdktaKMgbCqHOmwzP4bRLSEVQtf2dOz1gMqu14b8HqJvgAf/F/11YJ9hz09LEhmjZVjE68HZfqT7uK2W5OX8/lfXmK7TFcj6SjG5YB96lZMhTZ0WnufEd6QkdKDZYXIQKBgQD9GDTcIMbFwbEaKHnfZaTD3f876EGRgsgrCxwdEk7LBCRPwWo7yI929M4psIlpNwNeiyjBkBunWIVkpznp6qPtJqagIPUYesU4f5v6/okq5wcpaNKSkWbIvWVLaLGOiA1aeGJtbpMpyClbSr52puHpRRdvAiIEQ74yYh0JX8q96g=="); + alipayConfig.setPrivateKey("MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQCz3FkdffxZibdwis9W7eOW1dEjGAbSvRDL2ikfeCIW5KZNoIjUqxI0mIoUlLRRKO71QLHZS1Vb2aJp8jeOAqIPa8e76HTneQEzk3FGA8gpraSGvbadHWzvxnmYKsts1TBiEZQL82ySJXhQTJvZ6jyDM7s6wHHUnrH+Qi29QpppQ1sxsoJeCtajUgRg3btD6XbBcyFAX3pzM56Kw9eaIjZoD8WToZOM/Y3sqNL2uo8lLqcIpTrI7Pq5ZOspmBQ+t8v3rS9IdDZZMvd0trzS67AXwHz8rKPBT/lL1A4iHnXCHUvktusX1fPs3/RGY/a7PIddaBLnfY0GcueE16K7QcrXAgMBAAECggEAbSdT2eckp75BWoaTcGEs1tRqeM7TDT/6moyKmnOQ1K3tE31SrSYpBUxxuC3LBNo/sw2RIZtrcTOyMnPyLTgB3DP/4lUf5X51MTTQ8LnI1ypvh+pIki9Sdm3QS33lOOZk149tdpdDk6ozyx/DEcvq74EMpoo2SuAIi5LkKVDrXuehvGA/WeXtpmuPgqRFdIA+JBlA3knHk5XEQY/k2Y31gq5oCwNL9iT9OAZqVkukE6EnvCXE9t2rAV4/snYilaf/UaO+ktgEwSbPBQ8YKlovDAarMBbGtgr6E174A9djlPyR+W/fgx8rlTwSWtieb9MkO8LN3KSxgVs0kY5U8OHg8QKBgQDljJq9kTFHare+W/fAXdUy3tJprfNQCAii6s+GuDfTQiviVQDtWmdtHAN+xU3to7MepvVhwHsqtQnZXKTtZuwwxn82FNl7A5RYD3GVFW+wG6AsGLIdESrWxySoL6Kx8QmNpMEVg8acT/ywzW/RnUXS5vU7GIi8GA0vtyBo24R9KQKBgQDIlf/R9+iNk9oXlbB/k4um9eVvBBS7l5cx4E5Id5Dpp4kGZfPZEa7oDsEUstZZM9mgQLJK/noNWbcf0+BohCR5ux7SC12qIoxwN3k4BzTDqrS8BzFuVVp5PELUsf/uCbRn05iMzpiDUhj3Vde04wvjHYIobfKlZO2HeSWXCpUH/wKBgQC8wSuU6ck90pEY5QMKmZ3wYK1g3PsQOirv3Gmde+nbu7PePsuuYQJfBAQTwCZeXJezgtKP+PjOm2Nn6vhrhpB9YxvD2s0ijET1TG23i5L1myHQYNZFdJJnXgXUjqcX7v5ODMYA7QTqEBPXRnbGRK7fx66rU3dMQ/LD46+wyaFeUQKBgA4QTk53dkuu6SSsLyLSwoDjTsHY5Gc+urAZjQORtoxbXcUgEtfOYJgOqMT9wP+iHgkZYCbX7tDO0IMfxOUvFqueTgvmFhwergAUM6CVCMMLTf689l9JBr3nVrw4+rvC3G5HLLP6rEDQ2cVFtIkPPj8fS4fwJYopKGpOOS9843QbAoGBAMoHH8LqoZ50FLsospx/hJe24Cd8wCgQTXSa/hMqNZ1999JDhftMt7R0ZdB1he2LReACe0K9ntBU4H4u225zZ3wZlyOfoyerAHuLK/ysNlgIIzblZlOxbBJ64Kul8leXzlYy3tOZuZ997KqBcWPCE3LUBBNvM6E3blJUnlmJAVoi"); defaultClient.setAlipayConfig(alipayConfig); AlipayOpenAgentApi api = new AlipayOpenAgentApi(); AlipayOpenAgentCreateModel data = new AlipayOpenAgentCreateModel(); diff --git a/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatEntryManager.java b/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatEntryManager.java index 7524b156c..676da7552 100644 --- a/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatEntryManager.java +++ b/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatEntryManager.java @@ -11,7 +11,6 @@ import com.czg.wechat.dto.req.entry.business.sales.WechatEntrySalesInfoReqDto; import com.czg.wechat.dto.req.entry.business.sales.WechatEntryStoreInfoReqDto; import com.wechat.pay.java.core.Config; import com.wechat.pay.java.core.cipher.PrivacyEncryptor; -import com.wechat.pay.java.core.cipher.Signer; import com.wechat.pay.java.service.file.FileUploadService; import com.wechat.pay.java.service.file.model.FileUploadResponse; import lombok.extern.slf4j.Slf4j; @@ -20,24 +19,34 @@ import java.net.URI; import java.net.http.HttpClient; import java.net.http.HttpRequest; import java.net.http.HttpResponse; -import java.util.Arrays; import java.util.List; +import java.util.Map; /** * 微信支付进件 管理 - * + * 参考地址 ... * @author yjjie * @date 2025/12/26 10:57 */ @Slf4j public class WechatEntryManager { + public static void queryBankList(WechatPayConfigDto configDto, Integer offset, Integer limit) { + WechatReqUtils.getReq(configDto, "/v3/capital/capitallhh/banks/personal-banking", Map.of("offset", offset, "limit", limit)); + } + + /** + * 商户进件 + * + * @param configDto 配置 + * @param reqDto 请求参数 + */ public static void entryMerchant(WechatPayConfigDto configDto, WechatEntryReqDto reqDto) { String params = JSONObject.toJSONString(reqDto, JSONWriter.Feature.IgnoreEmpty); -// String string = WechatReqUtils.encryptReqParam(configDto, "POST", "/v3/applyment4sub/applyment/", params); +// String string = WechatReqUtils.encryptReqParam(configDto, "/v3/applyment4sub/applyment/", params); - WechatReqUtils.postReq(configDto, "POST", "/v3/applyment4sub/applyment/", params); + WechatReqUtils.postReq(configDto, "/v3/applyment4sub/applyment/", params); } /** @@ -178,6 +187,8 @@ public class WechatEntryManager { .setPublicKeyId("PUB_KEY_ID_0116437794082025111000382377001000") .setDomain("https://api.mch.weixin.qq.com"); + queryBankList(dto, 0, 10); + // String string = uploadImage(dto, "https://czg-qr-order.oss-cn-beijing.aliyuncs.com/indexs/shuangbackground.png"); // log.info("图片上传成功:{}", string); @@ -253,6 +264,6 @@ public class WechatEntryManager { reqDto.setBankAccountInfo(bankAccountInfo); - entryMerchant(dto, reqDto); +// entryMerchant(dto, reqDto); } } diff --git a/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatReqUtils.java b/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatReqUtils.java index b92fb54fc..7a3a3c7ad 100644 --- a/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatReqUtils.java +++ b/cash-sdk/aggregation-pay/src/main/java/com/czg/wechat/WechatReqUtils.java @@ -1,15 +1,21 @@ package com.czg.wechat; +import cn.hutool.core.util.StrUtil; import cn.hutool.http.HttpRequest; import cn.hutool.http.HttpUtil; +import com.czg.exception.CzgException; import com.czg.wechat.dto.config.WechatPayConfigDto; import com.wechat.pay.java.core.Config; -import com.wechat.pay.java.core.RSAPublicKeyConfig; -import com.wechat.pay.java.core.cipher.PrivacyEncryptor; import com.wechat.pay.java.core.cipher.Signer; import lombok.extern.slf4j.Slf4j; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.Arrays; +import java.util.Map; +import java.util.Objects; import java.util.UUID; +import java.util.stream.Collectors; /** * 微信请求工具类 @@ -20,38 +26,51 @@ import java.util.UUID; @Slf4j public class WechatReqUtils { - public static String postReq(WechatPayConfigDto configDto, String method, String url, String body) { + public static String postReq(WechatPayConfigDto configDto, String url, String body) { + return req(configDto, url, "POST", body); + } + + public static String getReq(WechatPayConfigDto configDto, String url, Map params) { + url = Arrays.stream(params.entrySet().toArray(new Map.Entry[0])) + .map(entry -> entry.getKey() + "=" + URLEncoder.encode(entry.getValue().toString(), StandardCharsets.UTF_8)) + .collect(Collectors.joining("&", url + "?", "")); + return req(configDto, url, "GET", ""); + } + + private static String req(WechatPayConfigDto configDto, String url, String method, String body) { long timestamp = getTimestamp(); String nonce = getNonceStr(); - String signature = encryptReqParam(configDto, method, url, body, timestamp, nonce); - String authorization = String.format("WECHATPAY2-SHA256-RSA2048 mchid=\"%s\",nonce_str=\"%s\",signature=\"%s\",timestamp=\"%d\",serial_no=\"%s\"", - configDto.getMerchantId(), nonce, signature, timestamp, "4DE9BAC2EA584C3F274F694C9753CA814C4E9BF4"); + configDto.getMerchantId(), nonce, signature, timestamp, configDto.getSerialNumber()); - log.info("authorization = {}", authorization); - - HttpRequest request = HttpUtil.createPost(configDto.getDomain() + url) - .header("Authorization", authorization) - .header("Content-Type", "application/json") - .header("Wechatpay-Serial", configDto.getPublicKeyId()) -// .header("Wechatpay-Serial", "4DE9BAC2EA584C3F274F694C9753CA814C4E9BF4") - .body(body); + HttpRequest request = switch (method) { + case "POST" -> HttpUtil.createPost(configDto.getDomain() + url) + .header("Authorization", authorization) + .header("Content-Type", "application/json") + .header("Wechatpay-Serial", configDto.getPublicKeyId()) + .body(body); + case "GET" -> HttpUtil.createGet(configDto.getDomain() + url) + .header("Authorization", authorization) + .header("Content-Type", "application/json") + .header("Wechatpay-Serial", configDto.getPublicKeyId()); + default -> throw new CzgException("不支持的请求方法"); + }; String s = request.execute().body(); - log.info("s = {}", s); - - return ""; + log.info("微信支付请求:url = {}, method: {}, body: {}, resp: {}", url, method, body, s); + return s; } /** * 加密请求参数 - * @param configDto 配置 - * @param method 请求方法 - * @param url 请求地址 - * @param body 请求报文主体 - * @return 加密后的报文 * + * @param configDto 配置 + * @param method 请求方法 + * @param url 请求地址 + * @param body 请求报文主体 + * @return 加密后的报文 + *

* 签名方法 * HTTP请求方法\n * URL\n @@ -62,12 +81,12 @@ public class WechatReqUtils { public static String encryptReqParam(WechatPayConfigDto configDto, String method, String url, String body, long timestamp, String nonce) { String encryptStr = String.format("%s\n%s\n%d\n%s\n%s\n", method, url, timestamp, nonce, body); - System.out.println("encryptStr = \n" + encryptStr); + log.info("encryptStr = {}", encryptStr); Config config = WechatConfig.getRsaConfig(configDto); Signer signer = config.createSigner(); String signature = signer.sign(encryptStr).getSign(); - System.out.println("signature = " + signature); + log.info("签名 signature:{}", signature); return signature; } @@ -82,6 +101,6 @@ public class WechatReqUtils { * 获取时间戳 */ private static long getTimestamp() { - return System.currentTimeMillis()/1000; + return System.currentTimeMillis() / 1000; } }