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日

相关文章

  • Spring Security 构建rest服务实现rememberme 记住我功能

    让我来详细讲解一下如何利用Spring Security构建REST服务实现记住我(remember-me)功能。 什么是记住我功能? 记住我是一个常见的Web应用程序功能,允许用户在关闭并重新打开浏览器后继续使用应用程序而无需重新登录。通常,当用户登录时,他们可以选择“记住我”选项。如果选中此选项,则应用程序将在用户关闭并重新打开浏览器时,使用之前提供的凭…

    Java 2023年5月20日
    00
  • mybatis快速入门学习教程新手注意问题小结

    下面是针对“mybatis快速入门学习教程新手注意问题小结”的完整攻略。 1. 简介 MyBatis是一个持久层框架,它可以简化Java对象(POJO)与数据库之间的交互工作。同时,MyBatis还支持调用存储过程和执行高级查询。 在使用MyBatis时,需要注意以下几点: 准确配置MyBatis配置文件 明确SQL语句,并将其写入Mapper 通过Mapp…

    Java 2023年6月1日
    00
  • java数据结构ArrayList详解

    Java数据结构ArrayList详解 什么是ArrayList? ArrayList是Java语言中的一种数据结构,可以用来存储多个元素。它底层采用数组实现,相当于对传统数组的封装,提供了更加便捷的方法来操作数组元素。 ArrayList的特点 以下是ArrayList的特点: 可以存储任何类型的对象,包括基本类型和对象类型。 大小可变,可以动态地添加或删…

    Java 2023年5月26日
    00
  • 利用java监听器实现在线人数统计

    下面是利用Java监听器实现在线人数统计的完整攻略: 1. 创建监听器类 为了监听用户的登录和退出行为,我们需要创建一个实现了ServletContextListener接口的监听器类。这个类中需要实现两个方法:contextInitialized和contextDestroyed,其中contextInitialized方法会在应用启动时被调用,而cont…

    Java 2023年6月15日
    00
  • java使用Nagao算法实现新词发现、热门词的挖掘

    Java使用Nagao算法实现新词发现、热门词的挖掘攻略 本文将介绍如何使用Java实现Nagao算法对文本进行分析,从而实现新词发现和热门词挖掘。攻略分为以下四步: 数据预处理 在使用Nagao算法对文本进行分析前,需要对词语进行切分。Java中常用的中文分词工具有jieba、HanLP等,本文以使用HanLP为例: import com.hankcs.h…

    Java 2023年5月19日
    00
  • java的Hibernate框架报错“ObjectDeletedException”的原因和解决方法

    当使用Java的Hibernate框架时,可能会遇到“ObjectDeletedException”错误。这个错误通常是由于以下原因之一引起的: 对已删除的实体进行操作:如果您尝试对已删除的实体进行操作,则可能会出现此错误。在这种情况下,需要检查实体是否已被删除,并避免对已删除的实体进行操作。 并发访问问题:如果多个线程同时访问同一个实体,则可能会出现此错误…

    Java 2023年5月4日
    00
  • springboot项目整合druid数据库连接池的实现

    下面是 Spring Boot 项目整合 Druid 数据库连接池的实现的完整攻略。 1. 引入 Druid 依赖 在Maven或Gradle项目中,需要在项目依赖中引入 Druid 数据库连接池的依赖: <dependency> <groupId>com.alibaba</groupId> <artifactId&…

    Java 2023年6月16日
    00
  • ajax遍历xml文档的方法

    当需要在网页中展示和操作XML文档时,可以使用ajax来进行操作。以下是ajax遍历XML文档的方法总结: 1. 创建XMLHttpRequest对象 要使用ajax技术,必须创建XMLHttpRequest对象。XMLHttpRequest是浏览器提供的一个对象用来在浏览器和服务器之间进行数据传输。 //创建XMLHttpRequest对象 let xht…

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