当前位置: 首页 > news >正文

wechatpay-apache-httpclient实战教程:从环境搭建到JSAPI下单完整流程

wechatpay-apache-httpclient实战教程:从环境搭建到JSAPI下单完整流程

【免费下载链接】wechatpay-apache-httpclient微信支付 APIv3 Apache HttpClient装饰器(decorator)项目地址: https://gitcode.com/gh_mirrors/we/wechatpay-apache-httpclient

wechatpay-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.0'
Maven安装

在项目的pom.xml文件中添加以下依赖:

<dependency> <groupId>com.github.wechatpay-apiv3</groupId> <artifactId>wechatpay-apache-httpclient</artifactId> <version>0.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安全】页面设置

三、快速上手:初始化HttpClient

3.1 基础初始化方法

如果你使用HttpClientBuilderHttpClients#custom()构造HttpClient,可以直接替换为WechatPayHttpClientBuilder

import 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/jsapi

5.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; charset=utf-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?mchid=1230000109"); 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; charset=utf-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来统一版本:

Gradle
implementation(platform("com.fasterxml.jackson:jackson-bom:2.13.2.20220328"))
Maven
<parent> <groupId>com.fasterxml.jackson</groupId> <artifactId>jackson-bom</artifactId> <version>2.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),仅供参考

http://www.jsqmd.com/news/1243580/

相关文章:

  • 流动的生产力:2026 武汉智能仓储及物料搬运展览会开启智慧物流新篇章
  • 2026年7月最新百达翡丽大连普兰店万达广场维修保养服务电话 - 百达翡丽官方售后中心
  • 2026武汉甄选靠谱犬舍|皇克莱猫犬舍教你0套路安心买宠 - 同城宠物优选基地
  • Fody开源可持续发展:为什么成为Patron是每位开发者的责任
  • 水基凝胶工艺为什么是高端散热标配?氧化铝陶瓷天花板工艺解析
  • Wine 与 Linux 内核的交互
  • 晚期风格即兴
  • 深入理解wysiwyg.css实现原理:从Sass源码到压缩CSS的完整流程
  • 浪琴石家庄唯一官方售后网点地址及客户服务热线电话2026年7月最新权威声明 - 浪琴服务中心
  • Fody与MSBuild集成指南:让IL编织无缝融入你的开发流程
  • 危重瓣膜病就医抉择:为什么ViV瓣中瓣手术必须选对医院?——基于合肥高心高危病例的技术与护理体系拆解
  • Jellium Desktop视频色彩空间设置:选择适合你的显示设备
  • 2026年7月苏州办公家具厂家推荐:板式/实木/钢制办公桌椅、会议桌服务商选择指南 - 海棠依旧大
  • Vanguard 发布 AI Agent 自主套利基础设施,以多智能体协同推动预测市场进入自动化执行时代 - 资讯报道
  • Hue全局配置文件hue.ini详解与最佳实践
  • 椰林海鲜码头企业愿景是什么?建立严苛品控体系,守住真实经营的 - MXyuyu
  • 如何快速入门Neural Amp Modeler?从gh_mirrors/na/NAM_models开始的完整指南
  • 2026 年更新:汉沽靠谱的装配式箱房订做厂家有哪些,别再租房了!这种模块化结构如何颠覆你的居住体验?-旭华建筑工程 - 企业推荐官【认证官方】
  • 【Python毕业设计】基于 Python 的科研论文文献整理与智能检索系统 数字化学术文献资源聚合管理平台(源码+文档+远程调试,全bao定制等)
  • wechatpay-apache-httpclient常见问题排查:从私钥加载到证书更新全攻略
  • 罗湖区靠谱搬家公司盘点|家庭/企业搬迁均可 推荐:深圳顺风搬迁 - 深圳顺风搬迁
  • 全城关注!欧米茄福州官方客户服务热线及售后网点地址2026年7月最新通告 - 欧米茄官方服务中心
  • 亲身探访深圳萧邦官方售后服务中心|官方热线和维修地址(2026年7月最新) - 萧邦中国官方服务中心
  • 100K带宽回传高清视频:AI通信技术如何做到?
  • 豹图CAD(CAD快速看图软件)
  • Alfred效率神器:从基础到高阶的macOS自动化指南
  • 亲身到店探访广州宝玑官方售后服务中心|最新电话及维修地址(2026年7月最新) - 亨得利官方服务中心
  • 本地教培行业SEO优化公司靠谱推荐,连锁机构/单店门店专属同城获客服务商甄选 - 资讯速览
  • 从0到1:AWS CodeCommit创建与管理代码仓库完全教程
  • 柔性制氢 + 氢冶金:打造稳定的深度脱碳管道 - 蓝色星球