wechatpay-apache-httpclient实战教程:从环境搭建到JSAPI下单完整流程
wechatpay-apache-httpclient实战教程从环境搭建到JSAPI下单完整流程【免费下载链接】wechatpay-apache-httpclient微信支付 APIv3 Apache HttpClient装饰器decorator项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-apache-httpclientwechatpay-apache-httpclient是微信支付APIv3的Apache HttpClient装饰器能帮助开发者自动处理请求签名生成和应答签名验证轻松对接微信支付接口。本文将带你从环境搭建开始逐步掌握使用该工具实现JSAPI下单的完整流程。一、环境准备与安装1.1 环境要求使用wechatpay-apache-httpclient需要满足以下环境要求Java 1.8及以上版本Apache HttpClient相关依赖1.2 安装方式Gradle安装在项目的build.gradle文件中添加以下依赖implementation com.github.wechatpay-apiv3:wechatpay-apache-httpclient:0.5.0Maven安装在项目的pom.xml文件中添加以下依赖dependency groupIdcom.github.wechatpay-apiv3/groupId artifactIdwechatpay-apache-httpclient/artifactId version0.5.0/version /dependency二、核心概念与参数说明2.1 必要参数解释使用wechatpay-apache-httpclient需要准备以下核心参数merchantId商户号merchantSerialNumber商户API证书的证书序列号merchantPrivateKey商户API私钥wechatPayCertificates微信支付平台证书列表2.2 密钥与证书获取商户API私钥申请商户API证书时生成保存在本地证书文件夹的apiclient_key.pem文件中商户API证书序列号可在证书文件中查看具体方法参考微信支付官方文档微信支付平台证书通过调用获取平台证书列表接口下载API v3密钥在商户平台的【API安全】页面设置三、快速上手初始化HttpClient3.1 基础初始化方法如果你使用HttpClientBuilder或HttpClients#custom()构造HttpClient可以直接替换为WechatPayHttpClientBuilderimport com.wechat.pay.contrib.apache.httpclient.WechatPayHttpClientBuilder; //... WechatPayHttpClientBuilder builder WechatPayHttpClientBuilder.create() .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) .withWechatPay(wechatPayCertificates); // ... 可以通过builder设置各种参数配置HttpClient // 构造的HttpClient会自动处理签名和验签 CloseableHttpClient httpClient builder.build(); // 像使用普通Apache HttpClient一样使用 CloseableHttpResponse response httpClient.execute(...);3.2 加载商户私钥使用PemUtil.loadPrivateKey()方法加载商户私钥// 从文件加载私钥 PrivateKey merchantPrivateKey PemUtil.loadPrivateKey( new FileInputStream(/path/to/apiclient_key.pem)); // 从字符串加载私钥 PrivateKey merchantPrivateKey PemUtil.loadPrivateKey( new ByteArrayInputStream(privateKey.getBytes(utf-8)));四、定时更新平台证书功能4.1 功能介绍版本≥0.4.0可使用CertificatesManager.getVerifier(merchantId)得到的验签器替代默认验签器它会定时下载和更新商户对应的微信支付平台证书默认下载间隔为UPDATE_INTERVAL_MINUTE。4.2 使用示例// 获取证书管理器实例 certificatesManager CertificatesManager.getInstance(); // 向证书管理器增加需要自动更新平台证书的商户信息 certificatesManager.putMerchant(merchantId, new WechatPay2Credentials(merchantId, new PrivateKeySigner(merchantSerialNumber, merchantPrivateKey)), apiV3Key.getBytes(StandardCharsets.UTF_8)); // ... 若有多个商户号可继续调用putMerchant添加商户信息 // 从证书管理器中获取verifier verifier certificatesManager.getVerifier(merchantId); WechatPayHttpClientBuilder builder WechatPayHttpClientBuilder.create() .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) .withValidator(new WechatPay2Validator(verifier)) // ... 配置HttpClient的其他参数 // 构造的HttpClient会自动处理签名和验签并进行证书自动更新 CloseableHttpClient httpClient builder.build();五、JSAPI下单完整实现5.1 接口说明JSAPI下单接口用于创建微信支付订单请求地址为https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi5.2 实现步骤步骤1构造请求参数使用JSON库如jackson-databind构造请求参数HttpPost httpPost new HttpPost(https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi); httpPost.addHeader(Accept, application/json); httpPost.addHeader(Content-type,application/json; charsetutf-8); ByteArrayOutputStream bos new ByteArrayOutputStream(); ObjectMapper objectMapper new ObjectMapper(); ObjectNode rootNode objectMapper.createObjectNode(); rootNode.put(mchid,1900009191) // 替换为你的商户号 .put(appid, wxd678efh567hg6787) // 替换为你的appid .put(description, Image形象店-深圳腾大-QQ公仔) // 订单描述 .put(notify_url, https://www.weixin.qq.com/wxpay/pay.php) // 回调通知地址 .put(out_trade_no, 1217752501201407033233368018); // 商户订单号 rootNode.putObject(amount) .put(total, 1); // 订单金额单位为分 rootNode.putObject(payer) .put(openid, oUpF8uMuAJO_M2pxb1Q9zNjWeS6o); // 用户openid objectMapper.writeValue(bos, rootNode); httpPost.setEntity(new StringEntity(bos.toString(UTF-8), UTF-8));步骤2发送请求并处理响应使用初始化好的HttpClient发送请求CloseableHttpResponse response httpClient.execute(httpPost); String bodyAsString EntityUtils.toString(response.getEntity()); System.out.println(bodyAsString);步骤3解析返回结果成功调用后会返回包含prepay_id的结果用于后续调起支付{ prepay_id: wx201410272009395522657a690389285100 }六、订单查询与关闭6.1 订单查询通过订单号查询订单状态URIBuilder uriBuilder new URIBuilder(https://api.mch.weixin.qq.com/v3/pay/transactions/id/4200000889202103303311396384?mchid1230000109); HttpGet httpGet new HttpGet(uriBuilder.build()); httpGet.addHeader(Accept, application/json); CloseableHttpResponse response httpClient.execute(httpGet); String bodyAsString EntityUtils.toString(response.getEntity()); System.out.println(bodyAsString);6.2 订单关闭关闭未支付的订单HttpPost httpPost new HttpPost(https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/1217752501201407033233368018/close); httpPost.addHeader(Accept, application/json); httpPost.addHeader(Content-type,application/json; charsetutf-8); ByteArrayOutputStream bos new ByteArrayOutputStream(); ObjectMapper objectMapper new ObjectMapper(); ObjectNode rootNode objectMapper.createObjectNode(); rootNode.put(mchid,1900009191); // 商户号 objectMapper.writeValue(bos, rootNode); httpPost.setEntity(new StringEntity(bos.toString(UTF-8), UTF-8)); CloseableHttpResponse response httpClient.execute(httpPost); String bodyAsString EntityUtils.toString(response.getEntity()); System.out.println(bodyAsString);七、回调通知处理7.1 通知处理流程版本≥0.4.2可使用NotificationHandler.parse(request)对回调通知进行验签和解密// 构建request传入必要参数 NotificationRequest request new NotificationRequest.Builder().withSerialNumber(wechatPaySerial) .withNonce(nonce) .withTimestamp(timestamp) .withSignature(signature) .withBody(body) .build(); NotificationHandler handler new NotificationHandler(verifier, apiV3Key.getBytes(StandardCharsets.UTF_8)); // 验签和解析请求体 Notification notification handler.parse(request); // 从notification中获取解密报文 System.out.println(notification.getDecryptData());7.2 异常处理parse(request)可能返回以下异常建议对异常打日志或上报监控ValidationException验签失败检查参数是否被篡改ParseException解析失败检查包体是否被篡改或AES密钥是否正确八、常见问题解决8.1 如何下载平台证书第一次下载平台证书时可以临时跳过应答签名验证CloseableHttpClient httpClient WechatPayHttpClientBuilder.create() .withMerchant(merchantId, merchantSerialNumber, merchantPrivateKey) .withValidator(response - true) // 临时跳过验签不要用在业务请求 .build();注意业务请求请使用标准的初始化流程务必验证应答签名。8.2 如何解决依赖冲突如果项目中出现Jackson等依赖冲突可通过引入bom来统一版本Gradleimplementation(platform(com.fasterxml.jackson:jackson-bom:2.13.2.20220328))Mavenparent groupIdcom.fasterxml.jackson/groupId artifactIdjackson-bom/artifactId version2.13.2.20220328/version /parent九、总结wechatpay-apache-httpclient极大简化了微信支付APIv3的对接流程通过自动处理签名和验签让开发者可以更专注于业务逻辑实现。本文从环境搭建到JSAPI下单完整流程进行了详细介绍涵盖了初始化、证书管理、订单操作和回调处理等核心功能。通过使用该工具开发者可以快速、安全地集成微信支付功能减少对接过程中的安全风险和开发成本。如需了解更多细节可参考项目中的测试代码如NotificationHandlerTest等。希望本教程能帮助你顺利使用wechatpay-apache-httpclient实现微信支付功能如有任何问题欢迎通过项目issue进行反馈。【免费下载链接】wechatpay-apache-httpclient微信支付 APIv3 Apache HttpClient装饰器decorator项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-apache-httpclient创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

从原理到实践:react-native-responsive-fontSize实现响应式字体的底层逻辑

从原理到实践:react-native-responsive-fontSize实现响应式字体的底层逻辑

从原理到实践:react-native-responsive-fontSize实现响应式字体的底层逻辑 【免费下载链接】react-native-responsive-fontSize 🔠 Responsive fontSize based on screen-size of the device in React-Native 项目地址: https://gitcode.com/gh_mirror…

2026/10/9 9:32:43 阅读更多 →
解决ExifToolGui常见问题:从安装到使用的全面解答

解决ExifToolGui常见问题:从安装到使用的全面解答

解决ExifToolGui常见问题:从安装到使用的全面解答 【免费下载链接】ExifToolGui A GUI for ExifTool 项目地址: https://gitcode.com/gh_mirrors/ex/ExifToolGui ExifToolGui是一款功能强大的ExifTool图形界面工具,帮助用户轻松查看、编辑和管理图…

2026/10/3 13:48:50 阅读更多 →
别再盲选模型了!基于真实SLO的AI响应延迟分级标准(Tier-0至Tier-4),92%企业仍在用Tier-3模型扛Tier-0业务

别再盲选模型了!基于真实SLO的AI响应延迟分级标准(Tier-0至Tier-4),92%企业仍在用Tier-3模型扛Tier-0业务

更多请点击: https://codechina.net 第一章:别再盲选模型了!基于真实SLO的AI响应延迟分级标准(Tier-0至Tier-4),92%企业仍在用Tier-3模型扛Tier-0业务 在生产环境中,AI服务的“快”不是主观感受…

2026/9/29 23:08:19 阅读更多 →

最新新闻

纯Java手写TopoJSON生成器:从GeoJSON到拓扑压缩的完整实践

纯Java手写TopoJSON生成器:从GeoJSON到拓扑压缩的完整实践

做 WebGIS 的同学这两年应该对 TopoJSON 不陌生,尤其当你需要把全省县级行政区划、全国路网这类动不动几十 MB 的 GeoJSON 塞进浏览器时,TopoJSON 几乎成了绕不开的选项。它的核心价值只有一句话:在拓扑关系上做文章,让共享边界只…

2026/10/10 20:47:31 阅读更多 →
Spring Boot+MyBatis Plus游戏分享网站毕设全流程实战解析

Spring Boot+MyBatis Plus游戏分享网站毕设全流程实战解析

每年的毕业设计季,总能看到一批同学被“选题”折磨得焦头烂额。游戏分享网站这种项目,听起来难度适中、事务清晰,特别适合拿来当计算机专业的毕设项目,但实际动起手来,从技术栈选型到功能模块拆解,再到部署…

2026/10/10 20:47:31 阅读更多 →
给 AI 生成 UI 上“护栏“:json-render 白名单配置从零到生产

给 AI 生成 UI 上“护栏“:json-render 白名单配置从零到生产

给 AI 生成 UI 上"护栏":json-render 白名单配置从零到生产 【免费下载链接】json-render The Generative UI framework 项目地址: https://gitcode.com/GitHub_Trending/js/json-render 2026 年初,Vercel Labs 开源的 json-render 在短…

2026/10/10 20:47:31 阅读更多 →
用NAS把收藏夹文章变成专属播客:搭建指南

用NAS把收藏夹文章变成专属播客:搭建指南

我猜你八成也有这么个毛病:看到一篇好文章先收藏,想着“回头认真读”,结果这个“回头”就是永远。收藏夹里堆了几百篇深度长文,从AI技术、投资分析到历史考据,什么都有,就是没有时间去读。直到有天我在通勤…

2026/10/10 20:47:31 阅读更多 →
把“留痕“当一等公民:金融智能体的审计设计为什么比模型能力更烧钱

把“留痕“当一等公民:金融智能体的审计设计为什么比模型能力更烧钱

把"留痕"当一等公民:金融智能体的审计设计为什么比模型能力更烧钱 【免费下载链接】financial-services 可将 Claude 转变为金融服务专家,适用于投资银行、股票研究等领域。提供核心及专项插件,支持端到端工作流,集成多…

2026/10/10 20:47:31 阅读更多 →
基于Java的校园二手智能交易平台APP开发全攻略

基于Java的校园二手智能交易平台APP开发全攻略

1. 项目到底在做什么:需求与定位拆解每年毕业设计季,“校园二手交易平台”这类题目都是常青树,但今年我带着学生把“基于Java的校园二手智能交易平台APP”完整做成可运行系统时,发现很多人对这个题目的理解还停留在十年前&#xf…

2026/10/10 20:46:30 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起:为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念,很多人会觉得它离自己很远——不就是天上的星星怎么转吗?但如果你正在做航天任务规划、遥感数据接收、星座设计,甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起:为什么你的代码里到处都是重复逻辑刚入行那会儿,我写过一个用户管理模块,注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么,能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介:这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目,以Boss直聘岗位数据为对象,适合用作毕业设计、课程设计或期末大作业。资源包共38个文件,约246KB,以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:25 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 11:14:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 5:23:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 10:38:42 阅读更多 →