Java实现对接微信支付功能接口详解(二)

本系列文章简介:

        微信支付是一种在线支付解决方案,允许用户通过微信内的支付功能进行付款。它提供了多种支付方式,包括扫码支付、公众号支付、小程序支付等。在Java应用程序中实现微信支付功能,可以为用户提供方便快捷的支付体验。本文详细讲解了如何从0到1实现对接微信支付功能,包括注册开发者账号、导入微信支付的Java SDK、创建配置类、实现支付服务类、与微信支付服务器进行交互等详细步骤,并配有图文解析,欢迎大家订阅《支付系列开发攻略》专栏,一起学习,一起涨分!

目录

一、引言

二、查询微信支付订单接口

三、撤销订单接口

四、关闭订单接口

五、结语


一、引言

        接上篇文章《Java实现对接微信支付详解(一)》详解的进度,我们继续来看微信支付的其他功能接口👇👇👇

二、查询微信支付订单接口

实现查询微信支付订单的步骤及代码示例如下:

步骤:

  1. 引入微信支付SDK相关依赖;
  2. 创建微信支付配置类,配置商户号、appid、appkey等;
  3. 创建查询订单请求类,封装查询订单的请求参数;
  4. 发起查询订单请求,获取查询结果;
  5. 解析查询结果,获取订单信息。

代码示例:

  1. 引入微信支付SDK依赖,例如在pom.xml文件中添加以下依赖:
<dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-sdk</artifactId><version>3.0.0</version>
</dependency>

        2. 创建微信支付配置类,例如:

public class WxPayConfig {public static final String APPID = "your_appid"; // 微信支付分配的公众账号ID(企业号corpid即为此appId)public static final String MCHID = "your_mchid"; // 微信支付分配的商户号public static final String APIKEY = "your_apikey"; // API密钥// 其他配置参数...
}

        3. 创建查询订单请求类,例如:

public class OrderQueryRequest {private String appid; // 公众账号IDprivate String mchId; // 商户号private String nonceStr; // 随机字符串private String transactionId; // 微信订单号private String outTradeNo; // 商户订单号private String sign; // 签名// 其他请求参数的getter和setter...public Map<String, String> toMap() {Map<String, String> map = new HashMap<>();map.put("appid", this.appid);map.put("mch_id", this.mchId);map.put("nonce_str", this.nonceStr);map.put("transaction_id", this.transactionId);map.put("out_trade_no", this.outTradeNo);map.put("sign", this.sign);return map;}
}

        4. 发起查询订单请求,获取查询结果,例如:

public String queryOrder(OrderQueryRequest request) throws Exception {WXPay wxPay = new WXPay(WxPayConfig.APPID, WxPayConfig.MCHID, WxPayConfig.APIKEY);Map<String, String> map = request.toMap();Map<String, String> resultMap = wxPay.orderQuery(map); // 发起查询订单请求String returnCode = resultMap.get("return_code");String resultCode = resultMap.get("result_code");if ("SUCCESS".equals(returnCode) && "SUCCESS".equals(resultCode)) {// 查询成功,处理订单信息String transactionId = resultMap.get("transaction_id"); // 微信订单号String outTradeNo = resultMap.get("out_trade_no"); // 商户订单号// 其他订单信息的处理...return "查询成功";} else {// 查询失败,处理错误信息String errCode = resultMap.get("err_code"); // 错误码String errCodeDes = resultMap.get("err_code_des"); // 错误描述// 其他错误信息的处理...return "查询失败:" + errCodeDes;}
}

        5. 在业务代码中调用查询订单方法,并处理查询结果,例如:

public static void main(String[] args) {try {OrderQueryRequest request = new OrderQueryRequest();request.setAppid(WxPayConfig.APPID);request.setMchId(WxPayConfig.MCHID);request.setNonceStr(UUID.randomUUID().toString().replaceAll("-", ""));request.setTransactionId("your_transaction_id"); // 设置微信订单号或商户订单号request.setOutTradeNo("your_out_trade_no"); // 设置微信订单号或商户订单号request.setSign(SignUtil.sign(request.toMap(), WxPayConfig.APIKEY)); // 生成签名String result = queryOrder(request);System.out.println(result);} catch (Exception e) {e.printStackTrace();}
}

以上就是基于微信支付SDK实现查询微信支付订单的详细步骤和代码示例。需要注意的是,具体的参数和逻辑可能会根据实际情况有所调整,请根据自己的项目需求进行相应的修改和扩展。

三、撤销订单接口

实现撤销订单接口,需要以下几个步骤:

  1. 通过微信支付SDK配置商户API证书。

  2. 构建请求参数,并生成签名。

  3. 发送HTTP请求至微信支付服务器,调用撤销订单接口。

  4. 解析并处理微信支付服务器的响应结果。

下面是详细的Java代码示例:

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfigImpl;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;import java.util.HashMap;
import java.util.Map;public class WXPayExample {public static void main(String[] args) throws Exception {// 配置商户API证书String certPath = "/path/to/apiclient_cert.p12";  // 商户API证书路径String certPassword = "your_cert_password";  // 商户API证书密码WXPayConfigImpl config = new WXPayConfigImpl();config.setCertPath(certPath);config.setCertPassword(certPassword);// 初始化WXPay对象WXPay wxPay = new WXPay(config, WXPayConstants.SignType.HMACSHA256);// 构建撤销订单接口的请求参数Map<String, String> params = new HashMap<>();params.put("out_trade_no", "your_out_trade_no");  // 商户订单号params.put("nonce_str", WXPayUtil.generateNonceStr());  // 随机字符串params.put("sign_type", WXPayConstants.SignType.HMACSHA256);  // 签名类型// 生成签名String sign = WXPayUtil.generateSignature(params, config.getKey(), WXPayConstants.SignType.HMACSHA256);params.put("sign", sign);// 发送HTTP请求至微信支付服务器Map<String, String> response = wxPay.reverse(params);// 处理响应结果if (WXPayConstants.SUCCESS.equals(response.get("return_code"))) {// 可以通过return_msg字段获取错误信息if (WXPayConstants.SUCCESS.equals(response.get("result_code"))) {// 撤销订单成功System.out.println("撤销订单成功");} else {// 撤销订单失败System.out.println("撤销订单失败,原因:" + response.get("err_code_des"));}} else {// 请求失败System.out.println("请求失败,原因:" + response.get("return_msg"));}}
}

注意事项:替换示例中的 certPathcertPasswordout_trade_no 参数为实际的值。

四、关闭订单接口

要实现关闭订单接口,首先需要引入微信支付SDKV3的依赖。可以在项目的pom.xml文件中添加以下依赖:

<dependency><groupId>com.github.wxpay</groupId><artifactId>wxpay-java</artifactId><version>3.0.0</version>
</dependency>

接下来,可以创建一个工具类来封装关闭订单的逻辑。以下是一个基于微信支付SDKV3版本的关闭订单工具类的实现步骤及代码示例:

步骤一:导入相关的类和包

import com.github.wxpay.sdk.WXPay;
import com.github.wxpay.sdk.WXPayConfig;
import com.github.wxpay.sdk.WXPayConstants;
import com.github.wxpay.sdk.WXPayUtil;

步骤二:定义一个关闭订单的方法

public class CloseOrderUtil {private WXPay wxPay;public CloseOrderUtil(WXPayConfig config) {wxPay = new WXPay(config, WXPayConstants.SignType.HMACSHA256);}public Map<String, String> closeOrder(String orderId) throws Exception {Map<String, String> data = new HashMap<String, String>();data.put("out_trade_no", orderId);String response = wxPay.closeOrder(data);return WXPayUtil.xmlToMap(response);}
}

步骤三:创建一个实现了WXPayConfig接口的配置类,用于配置微信支付的相关参数

public class WXPayConfigImpl implements WXPayConfig {private String appId;         // 应用IDprivate String mchId;         // 商户号private String key;           // 商户密钥private String notifyUrl;     // 异步通知地址public WXPayConfigImpl(String appId, String mchId, String key, String notifyUrl) {this.appId = appId;this.mchId = mchId;this.key = key;this.notifyUrl = notifyUrl;}@Overridepublic String getAppID() {return appId;}@Overridepublic String getMchID() {return mchId;}@Overridepublic String getKey() {return key;}@Overridepublic InputStream getCertStream() {// 如果有需要,可以将商户证书放在resources目录下,并返回证书的输入流return null;}@Overridepublic int getHttpConnectTimeoutMs() {return 8000;}@Overridepublic int getHttpReadTimeoutMs() {return 10000;}@Overridepublic boolean shouldAutoReport() {return true;}@Overridepublic int getReportWorkerNum() {return 6;}@Overridepublic int getReportQueueMaxSize() {return 10000;}@Overridepublic int getReportBatchSize() {return 10;}@Overridepublic String getNotifyUrl() {return notifyUrl;}
}

步骤四:调用关闭订单的方法

public class Main {public static void main(String[] args) {try {// 创建配置类的实例WXPayConfig config = new WXPayConfigImpl("YourAppId", "YourMchId", "YourKey", "YourNotifyUrl");// 创建关闭订单工具类的实例CloseOrderUtil closeOrderUtil = new CloseOrderUtil(config);// 调用关闭订单方法Map<String, String> result = closeOrderUtil.closeOrder("YourOrderId");// 处理关闭订单的结果if ("SUCCESS".equals(result.get("return_code")) && "SUCCESS".equals(result.get("result_code"))) {// 订单关闭成功,继续执行其他业务逻辑System.out.println("订单关闭成功");} else {// 订单关闭失败,处理失败原因System.out.println("订单关闭失败:" + result.get("return_msg"));}} catch (Exception e) {e.printStackTrace();}}
}

以上就是基于微信支付SDKV3版本实现关闭订单接口的详细步骤和代码示例。需要注意的是,具体的配置参数(如appId、mchId、key等)需要根据实际情况进行替换。另外,还可以根据自己的需求进行参数的扩展和修改。

五、结语

        本文至此,已接近尾声!在下篇文章中,会为大家继续讲解对接微信支付的其他功能接口,请大家订阅本专栏《支付系列开发攻略》,紧跟脚步,稳扎稳打学习。希望此文能够对大家有所启发和帮助。同时,感谢大家的耐心阅读和对本文档的信任。在未来的技术学习和工作中,期待与各位大佬共同进步,共同探索新的技术前沿。最后,再次感谢各位的支持和关注

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

爬虫笔记(三):实战qq登录

咳咳&#xff0c;再这样下去会进橘子叭hhhhhh 以及&#xff0c;这个我觉得大概率是成功的&#xff0c;因为测试了太多次&#xff0c;登录并且验证之后&#xff0c;qq提醒我要我修改密码才可以登录捏QAQ 1. selenium 有关selenium具体是啥&#xff0c;这里就不再赘述了&#x…

leetcode c++ 超出内存限制

给两个主要原因&#xff0c;这两个原因&#xff0c;如果在递归或者循环里就很容易导致内存超出限制 首先就是误用 如果只是变量的变化实现的话&#xff0c;或者-就可以了&#xff0c;不需要写成AAx的形式&#xff0c;那样会重新开辟一块内存 其次就是值传递 值传递也是会开辟…

在Linux中对Nginx进行安全加固

准备工作 在IP为x.x.x.x的服务器上安装nginx&#xff0c;确保Linux系统为nginx环境。 检查nginx是否配置nginx账号锁定策略 配置nginx账号锁定策略&#xff0c;降低被攻击概率。 第一步&#xff0c;查看nginx的锁定状态。 命令&#xff1a;passwd -S nginx 若结果出现“P…

【gcc】webrtc发送侧计算 丢包率

大神的分析 : 提到: 每当收到cc-feedback或者收到RR-report的时候就能统计出丢包率,在cc-controller中就会调用SendSideBandwidthEstimation::UpdatePacketsLost()去更新丢包率,同时进行码率预估 G:\CDN\rtcCli\m98\src\modules\congestion_controller\goog_cc\send_side_b…

今日arXiv最热NLP大模型论文:像人一样浏览网页执行任务,腾讯AI lab发布多模态端到端Agent

Agent的发展成为了LLM发展的一个热点。只需通过简单指令&#xff0c;Agent帮你完成从输入内容、浏览网页、选择事项、点击、返回等一系列需要执行多步&#xff0c;才能完成的与网页交互的复杂任务。 比如给定任务&#xff1a;“搜索Apple商店&#xff0c;了解iPad智能保护壳Sm…

数据结构与算法--面试问答

问题与简答 数据结构与算法篇 1. 概述 解决问题的效率 解决问题方法的效率&#xff0c;跟数据的组织方式有关&#xff0c;跟空间的利用效率有关&#xff0c;也跟算法的巧妙程度有关 抽象数据类型 抽象数据类型(Abstract Data Type&#xff0c;ADT)是一种对"数据类型…

Qt中的绝对位置与相对位置

在Qt的开发中&#xff0c;有时候需要获取鼠标点击的位置的坐标。在Qt中坐标分为相对坐标和绝对坐标&#xff1b;相对坐标是以控件的左上角为&#xff08;0&#xff0c;0&#xff09;点的坐标系的坐标&#xff0c;绝对坐标是以显示器屏幕的左上角为&#xff08;0&#xff0c;0&a…

蓝桥杯-常用STL(二)

常用STL &#x1f388;1.集合&#x1f388;2.set的基础使用&#x1f52d;2.1引入库&#x1f52d;2.2插入元素&#x1f52d;2.3删除元素&#x1f52d;2.4判断元素是否存在&#x1f52d;2.5遍历元素&#x1f52d;2.6清空 &#x1f388;3.set与结构体 &#x1f388;1.集合 &#x…

【Algorithms 4】算法(第4版)学习笔记 04 - 2.1 初级排序算法

文章目录 前言参考目录学习笔记1&#xff1a;前置说明1.1&#xff1a;全序关系1.2&#xff1a;Comparable API 实现 demo1.3&#xff1a;排序算法模板2&#xff1a;选择排序2.1&#xff1a;内循环实现过程拆解2.2&#xff1a;代码实现2.3&#xff1a;特点3&#xff1a;插入排序…

【kubernetes】集群网络(二):Flannel的VxLan、Host-GW模式

文章目录 1 Pod的IP地址的分配2 CNI3 Flannel3.1 Flannel的安装3.2 VxLan3.3 Host-GW 4 总结 1 Pod的IP地址的分配 当节点上只安装了docker&#xff0c;则会用veth pairdocker0实现单个节点上容器之间的通信&#xff0c;并且这些容器都在同一个IP段&#xff0c;如果不修改&…

(2024,SaFaRI,双三上采样和 DFT,空间特征和频率特征)基于扩散模型的图像空间和频率感知恢复方法

Spatial-and-Frequency-aware Restoration method for Images based on Diffusion Models 公和众和号&#xff1a;EDPJ&#xff08;进 Q 交流群&#xff1a;922230617 或加 VX&#xff1a;CV_EDPJ 进 V 交流群&#xff09; 目录 0. 摘要 3. 方法 3.1 修改数据保真度 3.2 …

JMeter GUI:测试计划和工作台

什么是测试计划&#xff1f; 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试所需的所有元素&#xff08;如线程组、计时器等&#xff09;及其相应的设置。 下图显示了测试计划的示例 测试计划是您添加 JMeter 测试所需元素的地方。 它存储运行所需测试…

Modbus协议学习第六篇之基于libmodbus库的示例程序(可以联合Modbus模拟仿真软件进行调试)

前置工作 学了这么多Modbus的知识&#xff0c;如果不进行实际的操作&#xff0c;总感觉懂的不透彻。基于此&#xff0c; 本篇博文就带各位读者来了解下如何通过编写程序来模拟与Modbus Slave仿真软件的通讯。当然了&#xff0c;这里有两个前提&#xff0c;如下&#xff1a; 1.请…

【深度强化学习】Python:OpenAI Gym-CarRacing 自动驾驶 | 提供项目完整代码 | 车道检测功能 | 路径训练功能 | 车辆控制功能

💭 写在前面:本篇是关于 OpenAI Gym-CarRacing 自动驾驶项目的博客,面向掌握 Python 并有一定的深度强化学习基础的读者。GYM-Box2D CarRacing 是一种在 OpenAI Gym 平台上开发和比较强化学习算法的模拟环境。它是流行的 Box2D 物理引擎的一个版本,经过修改以支持模拟汽车…

一键部署幻兽帕鲁服务器免费一年方案

一、背景介绍 简单讲一下历程&#xff0c;幻兽帕鲁从在1月19日上线&#xff0c;24小时内在线人数峰值便突破200万&#xff0c;作为2024年第一款现象级游戏&#xff0c;《幻兽帕鲁》上线后&#xff0c;由于人数太多&#xff0c;频现服务器过载导致游戏卡顿掉线的情况。为了能够…

【GitHub项目推荐--大语言模型课程】【转载】

Large Language Model Course Large Language Model Course&#xff08;大型语言模型课程&#xff09;是一个开源项目&#xff0c;该课程分为三个部分&#xff1a; LLM 基础&#xff1a;涵盖了数学、Python 和神经网络的基础知识。 LLM 科学家&#xff1a;专注于学习如何使用…

Linux调优相关命令汇总

Linux调优相关命令汇总 TIPS 本文基于CentOS 7编写&#xff0c;理论支持所有所有版本Linux发行版&#xff0c;部分命令的个别参数在不同版本中可能存在细微的差异。 入门级 # 切换目录 cd # 示例 # 切换到上一层目录 cd .. # 切换到/opt/software cd /opt/software# 显示工作目…

【机器学习】基于K-近邻的车牌号识别

实验四: 基于K-近邻的车牌号识别 1 案例简介 ​ 图像的智能处理一直是人工智能领域广受关注的一类技术&#xff0c;代表性的如人脸识别与 CT 肿瘤识别&#xff0c;在人工智能落地的进程中发挥着重要作用。其中车牌号识别作为一个早期应用场景&#xff0c;已经融入日常生活中&…

LVGL部件7

一.图片部件 1.知识概览 2.函数接口 1.lv_img_set_pivot 在LVGL&#xff08;LittlevGL&#xff09;中&#xff0c;要设置图像对象的旋转中心点&#xff0c;可以使用 lv_img_set_pivot 函数。该函数的原型如下&#xff1a; void lv_img_set_pivot(lv_obj_t * img, lv_coord_…

Flask框架开发学习笔记《5》简易服务器代码

Flask框架开发学习笔记《5》 Flask是使用python的后端&#xff0c;由于小程序需要后端开发&#xff0c;遂学习一下后端开发。 简易服务器代码 接口解析那一块很关键&#xff0c;学后端服务器这一块&#xff0c;感觉主要就是学习相应地址的接口怎么处理。 然后写清楚每个地址…