微信支付请求(带证书)
import cn.hutool.core.lang.Pair; import cn.hutool.crypto.SecureUtil; import com.dtyunxi.exchange.biz.model.ApiChannelType; import com.dtyunxi.exchange.biz.utils.OkHttpUtil; import okhttp3.OkHttpClient; import org.apache.http.HttpEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpPost; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; import org.apache.http.util.EntityUtils; import org.apache.tomcat.util.http.fileupload.IOUtils; import org.springframework.http.HttpMethod; import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; import javax.net.ssl.SSLContext; import java.io.*; import java.security.KeyStore; import java.util.HashMap; import java.util.Map; import java.util.TreeMap; private static final String SslContentKey = "certBase64Content"; private Map<String, CloseableHttpClient> OkHttpClientMap = new HashMap<>(); public Pair<Integer, String> execute(Map<String, Object> requestContext, HttpMethod httpMethod, String url, Map<String, String> headers, Object postData) throws IOException { String base64Content = requestContext.get(SslContentKey).toString(); String mchId = requestContext.get("mchId").toString(); String key = mchId; CloseableHttpClient httpClient = OkHttpClientMap.get(key); if (httpClient == null) { SSLContext sslContext = initSSLContext(mchId, base64Content); SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, null,//new String[]{"TLSv1"}, (String[]) null, SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER); httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build(); ; OkHttpClientMap.put(key, httpClient); } String result = null; try { HttpPost httpost = new HttpPost(url); httpost.addHeader("Connection", "keep-alive"); httpost.addHeader("Accept", "*/*"); httpost.addHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8"); httpost.addHeader("Host", "api.mch.weixin.qq.com"); httpost.addHeader("X-Requested-With", "XMLHttpRequest"); httpost.addHeader("Cache-Control", "max-age=0"); httpost.addHeader("User-Agent", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0) "); httpost.setEntity(new StringEntity(postData.toString(), "UTF-8")); CloseableHttpResponse response = null; try { response = httpClient.execute(httpost); HttpEntity entity = response.getEntity(); String jsonStr = EntityUtils.toString(response.getEntity(), "UTF-8"); EntityUtils.consume(entity); result = jsonStr; } catch (Exception ex) { ex.printStackTrace(); return Pair.of(500, ex.getMessage()); } finally { if (response != null) { response.close(); } } } finally { //httpClient.close(); } return Pair.of(200, result); //return OkHttpUtil.execute(httpMethod, url, headers, postData); }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)