获取微信支行
This commit is contained in:
@@ -13,7 +13,7 @@ import com.alipay.v3.util.model.AlipayConfig;
|
||||
/**
|
||||
* 支付宝进件管理
|
||||
*
|
||||
* <a href="https://opendocs.alipay.com/open-v3/b4c46445_alipay.open.agent.create">...</a>
|
||||
* <a href="https://opendocs.alipay.com/isv/03l20p?pathHash=07138a27">...</a>
|
||||
* @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();
|
||||
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 微信支付进件 管理
|
||||
*
|
||||
* 参考地址 <a href="https://pay.weixin.qq.com/doc/v3/partner/4012719997">...</a>
|
||||
* @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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<String, Object> 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 加密后的报文
|
||||
* <p>
|
||||
* 签名方法
|
||||
* 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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user