Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款

Java后端对接微信支付攻略

1. 准备工作

在开始对接微信支付之前,我们需要准备一些材料:

  • 商户号(mchId)和商户的API密钥(apiKey),在微信支付商户平台中获取。
  • 在微信支付平台中创建支付应用,获取应用ID(appId)和应用密钥(appSecret)。

2. 配置微信支付参数

在项目中添加微信支付相关的配置,这个配置需要存储在项目的配置文件中,比如:application.properties。

以下是配置信息参考:

# 微信支付配置
wxpay.appId=YOUR_APP_ID
wxpay.appSecret=YOUR_APP_SECRET
wxpay.mchId=YOUR_MCH_ID #商户号id
wxpay.key=YOUR_API_KEY #商户API密钥
wxpay.spbillCreateIp=YOUR_IP #服务器公网IP地址
wxpay.tradeType=JSAPI
wxpay.notifyUrl=YOUR_NOTIFY_URL # 支付回调接口
wxpay.refundUrl=YOUR_REFUND_URL # 退款回调接口

3. 实现支付功能

3.1 统一下单

统一下单接口是使用微信支付的第一个接口,由微信服务器生成预支付交易单,返回的数据包含官方SDK中的PayInfo类。

下面是示例代码:

public PayInfo createOrder(WxPayData data) {
    String url = WxPayConfig.UNIFIED_ORDER_URL;
    WxPayData result = WxPayApi.getInstance().unifiedOrder(data);
    if (result != null) {
        String prepayId = result.getValue("prepay_id");
        if (StringUtils.isNotBlank(prepayId)) {
            PayInfo payInfo = new PayInfo();
            payInfo.setAppId(result.getValue("appid"));
            payInfo.setTimeStamp(String.valueOf(System.currentTimeMillis() / 1000));
            payInfo.setNonceStr(StringUtils.generateStr());
            payInfo.setPackageStr("prepay_id=" + prepayId);
            payInfo.setSignType("MD5");
            payInfo.setPaySign(WxPaySignature.sign(payInfo, WxPayConfig.API_KEY));
            return payInfo;
        }
    }
    return null;
}

3.2 处理支付回调

微信支付回调是微信支付系统用来通知开发者支付结果的机制,开发者需要在接收到支付回调时进行签名验证,以确保数据完整和正确性。

以下是示例代码:

/**
 * 处理微信支付回调
 * @param xml 微信支付系统发来的回调xml数据
 * @throws Exception
 */
@RequestMapping(value = "/payNotify", method = RequestMethod.POST)
public void processPayNotify(@RequestBody String xml) throws Exception {
    WxPayData data = new WxPayData();
    // 转换回调数据为WxPayData对象
    data.fromXml(xml);
    String return_code = data.getValue("return_code");
    if (return_code.equalsIgnoreCase("success")) { // 支付成功
        String result_code = data.getValue("result_code");
        if (result_code.equalsIgnoreCase("success")) { // 付款成功
            String out_trade_no = data.getValue("out_trade_no")); // 商户订单号
            // 处理订单逻辑
        }
    }
    // 响应微信系统
    WxPayData result = new WxPayData();
    result.setValue("return_code", "SUCCESS");
    result.setValue("return_msg", "OK");
    response.getWriter().write(result.toXml());
}

4. 实现退款功能

4.1 申请退款

申请退款是在订单支付成功后,由于各种原因需要退还用户支付的金额。在微信支付中,开发者需要使用商户API密钥进行退款操作的解密认证和加密签名。

以下是示例代码:

public WxPayData refund(WxPayData data) {
    String url = WxPayConfig.REFUND_URL;
    WxPayData result = WxPayApi.getInstance().refund(data);
    if (result != null) {
        String returnCode = result.getValue("return_code");
        if ("SUCCESS".equals(returnCode)) {
            String resultCode = result.getValue("result_code");
            if ("SUCCESS".equals(resultCode)) {
                return result;
            }
        }
    }
    return null;
}

4.2 处理退款回调

微信支付退款回调功能会在退款成功后向开发者的notify_url发送一个XML格式的数据,开发者需要对其进行解析,并按照微信要求返回特定的XML信息。

以下是示例代码:

/**
 * 处理微信退款回调
 * @param xml 微信支付系统发来的回调xml数据
 * @throws Exception
 */
@RequestMapping(value = "/refundNotify", method = RequestMethod.POST)
public void processRefundNotify(@RequestBody String xml) throws Exception {
    WxPayData data = new WxPayData();
    // 转换回调数据为WxPayData对象
    data.fromXml(xml);
    String return_code = data.getValue("return_code");
    if (return_code.equalsIgnoreCase("success")) { // 支付成功
        String result_code = data.getValue("result_code");
        if (result_code.equalsIgnoreCase("success")) { // 付款成功
            String out_refund_no = data.getValue("out_refund_no")); // 商户退款单号
            // 处理退款逻辑
        }
    }
    // 响应微信系统
    WxPayData result = new WxPayData();
    result.setValue("return_code", "SUCCESS");
    result.setValue("return_msg", "OK");
    response.getWriter().write(result.toXml());
}

5. 实现查询订单功能

5.1 查询订单

查询订单功能可以在稍有延迟的情况下查询订单支付状态,以确保订单的完成情况。

以下是示例代码:

public WxPayData queryOrder(WxPayData data) {
    String url = WxPayConfig.QUERY_ORDER_URL;
    WxPayData queryResult = WxPayApi.getInstance().orderQuery(data);
    if (queryResult != null) {
        String returnCode = queryResult.getValue("return_code");
        if ("SUCCESS".equals(returnCode)) {
            String resultCode = queryResult.getValue("result_code");
            if ("SUCCESS".equals(resultCode)) {
                return queryResult;
            }
        }
    }
    return null;
}

5.2 查询退款

查询退款是查询退款到微信账户上的金额时使用的接口。

以下是示例代码:

public WxPayData queryRefund(WxPayData data) {
    String url = WxPayConfig.QUERY_REFUND_URL;
    WxPayData result = WxPayApi.getInstance().refundQuery(data);
    if (result != null) {
        String returnCode = result.getValue("return_code");
        if ("SUCCESS".equals(returnCode)) {
            String resultCode = result.getValue("result_code");
            if ("SUCCESS".equals(resultCode)) {
                return result;
            }
        }
    }
    return null;
}

至此,涵盖了Java后端对接微信支付包含查单、退款的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java后端对接微信支付(小程序、APP、PC端扫码)包含查单退款 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • 一文搞懂Java JDBC中的SQL注入问题

    一文搞懂Java JDBC中的SQL注入问题 什么是SQL注入? SQL注入是指攻击者利用客户端向服务器传递的SQL语句中的漏洞,注入恶意的查询语句或其他可执行的操作,从而获得非法的访问或者篡改数据的行为。SQL注入攻击是应用程序中最常见的攻击之一。 为什么要防止SQL注入? SQL注入攻击会使应用程序不按照设计来执行SQL语句,因而破坏了应用程序的安全性。…

    Java 2023年6月16日
    00
  • Java List转换成String数组几种实现方式详解

    Java List转换成String数组几种实现方式详解 问题描述 在Java开发中,我们经常会遇到将List转换成String数组的需求,比如将数据库查询结果转换为字符串数组进行后续处理。那么如何实现List转换为String数组呢?本文将详细介绍几种实现方式,以供大家参考使用。 方案一:使用循环遍历 最基本的实现方式是使用循环遍历List,逐个转换为字符…

    Java 2023年5月26日
    00
  • java分布式面试CAP分别代表含义分析

    下面是详细的讲解: 简介 CAP理论是分布式系统设计理论中重要的一个理论,其英文全称是Consistency(一致性)、Availability(可用性)、Partition Tolerance(分区容错性)。所谓的分区容错性指的是分布式系统中节点之间由于网络传输原因或其他意外情况,造成节点之间无法相互通信时,整个系统仍能正常运行。 三个含义 一致性(Con…

    Java 2023年5月24日
    00
  • Java线程池详细解读

    Java线程池详细解读 什么是线程池? 线程池是一种用于多线程管理的机制,它可以有效管理将要执行的任务,减轻了创建和销毁线程的负担。通过复用现有线程,避免了大量线程创建和销毁过程中的开销,从而提高了应用程序的性能和可伸缩性。 线程池的优势 线程池的优势主要体现在以下几个方面: 更好的利用 CPU 资源和减少上下文切换的时间开销。 可以根据需要创建和回收线程,…

    Java 2023年5月26日
    00
  • jsp实现cookie的使用

    下面我来详细讲解如何使用JSP实现Cookie的使用攻略: 一、什么是Cookie Cookie是存放在客户端的一组键值对数据,它是由服务器发给客户端的一小段信息,通常存储在客户端的浏览器上,用于维护会话状态、跟踪用户行为等。通过Cookie技术,我们可以把用户的个性化设置、购物车中的商品信息等存储在客户端,从而达到精准的个性化服务。 二、实现Cookie的…

    Java 2023年6月15日
    00
  • springBoot2.6.2自动装配之注解源码解析

    Spring Boot 2.6.2 自动装配之注解源码解析 Spring Boot 2.6.2 是一个快速构建 Spring 应用程序的框架,它提供了许多便利的功能,例如自动配置、嵌入式 Web 服务器和健康检查等。在本文中,我们将详细讲解 Spring Boot 2.6.2 自动装配之注解源码解析。 @SpringBootApplication 注解 在 …

    Java 2023年5月15日
    00
  • JSP迅速入门

    以下是JSP迅速入门的完整攻略: JSP介绍 Java服务器页面(Java Server Pages,JSP)是一种动态网页技术,JSP和PHP、ASP相似,JSP由HTML、Java代码、JSP标签和表达式组成,它允许Java代码和命令直接插入HTML页面中。 JSP环境搭建 要使用JSP技术,需要一台运行Web应用程序的Web服务器,比如Tomcat、J…

    Java 2023年5月20日
    00
  • Maven项目中resources配置总结

    下面我将详细讲解“Maven项目中resources配置总结”的完整攻略。 一、resources配置概述 在 Maven 中,main 目录中的 resources 目录代表应用程序 resources 路径,resources 目录下的内容会被打包进最终的 JAR 或 WAR 包中,因此在项目中需要合理地进行 resources 的管理。 二、resou…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部