java实现微信支付(服务端)

Java实现微信支付(服务端)完整攻略

简介

随着电子商务和移动支付的快速发展,微信支付也逐渐成为了重要的支付方式之一。本文将详细讲解Java实现微信支付(服务端)的完整攻略,涉及微信支付API的调用、签名与验签、回调通知处理等关键操作。

步骤

  1. 准备工作

在进行微信支付前,需要先在微信支付开发文档中进行开发者认证申请,并获取到应用的AppID、商户号、API密钥、证书等必要配置信息。

  1. 统一下单

统一下单是微信支付的第一个步骤,在客户端完成下单后,需要调用微信支付的统一下单API来生成预支付交易单并返回预支付ID(prepay_id)。

Java代码示例:

public String unifiedOrder(String appid, String mch_id, String nonce_str, String body, String out_trade_no, int total_fee, String spbill_create_ip, String notify_url, String trade_type, String openid, String sign_type, String key) throws Exception {
    SortedMap<String, String> parameters = new TreeMap<String, String>();
    parameters.put("appid", appid);
    parameters.put("mch_id", mch_id);
    parameters.put("nonce_str", nonce_str);
    parameters.put("body", body);
    parameters.put("out_trade_no", out_trade_no);
    parameters.put("total_fee", Integer.toString(total_fee));
    parameters.put("spbill_create_ip", spbill_create_ip);
    parameters.put("notify_url", notify_url);
    parameters.put("trade_type", trade_type);
    parameters.put("openid", openid);
    parameters.put("sign_type", sign_type);
    String sign = PaymentKit.createSign(parameters, key);
    parameters.put("sign", sign);
    String xml = PaymentKit.toXML(parameters);
    String result = HttpsUtil.postXmlSSL("https://api.mch.weixin.qq.com/pay/unifiedorder", xml, mch_id);
    Map<String, String> resultMap = PaymentKit.xmlToMap(result);
    String return_code = resultMap.get("return_code");
    if("SUCCESS".equals(return_code)){
        String result_code = resultMap.get("result_code");
        if("SUCCESS".equals(result_code)){
            String prepay_id = resultMap.get("prepay_id");
            return prepay_id;
        }else{
            String err_code_des = resultMap.get("err_code_des");
            throw new Exception(err_code_des);
        }
    }else{
        String return_msg = resultMap.get("return_msg");
        throw new Exception(return_msg);
    }
}
  1. 生成支付签名

支付签名是验证支付请求合法性的关键信息,必须按照规定的签名算法进行生成,并确保签名信息的正确性。

Java代码示例:

public String paySign(String appid, String timeStamp, String nonceStr, String packageStr, String signType, String key) {
    SortedMap<String, String> parameters = new TreeMap<String, String>();
    parameters.put("appId", appid);
    parameters.put("timeStamp", timeStamp);
    parameters.put("nonceStr", nonceStr);
    parameters.put("package", packageStr);
    parameters.put("signType", signType);
    return PaymentKit.createSign(parameters, key);
}
  1. 支付回调通知处理

在进行支付过程中,若支付成功,微信支付会通过支付回调通知的形式将结果返回给商户。商户需要对回调通知进行处理,对支付结果做出相应的处理。

Java代码示例:

public void payNotify(HttpServletRequest request) throws Exception {
    String inputLine;
    String notityXml = "";
    BufferedReader reader = request.getReader();
    while ((inputLine = reader.readLine()) != null) {
        notityXml += inputLine;
    }
    reader.close();
    Map<String, String> resultMap = PaymentKit.xmlToMap(notityXml);
    if("SUCCESS".equals(resultMap.get("return_code"))){
        if("SUCCESS".equals(resultMap.get("result_code"))){
            String out_trade_no = resultMap.get("out_trade_no");
            //  TODO: 处理支付结果
            //  注意:需要进行签名验证和支付结果校验,确保支付结果的安全准确
        }
    }
}

结论

以上就是Java实现微信支付(服务端)的完整攻略,涵盖了微信支付的核心操作,并提供了多条Java代码示例供参考。在进行微信支付时,需要注意签名规则、证书安装等细节问题,并确保支付结果的准确性和安全性。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:java实现微信支付(服务端) - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • PHP静态成员变量和非静态成员变量详解

    PHP静态成员变量和非静态成员变量详解 在PHP中,我们可以使用静态成员变量和非静态成员变量来存储和访问对象的数据。这两种类型的成员变量在使用和作用上有一些区别。 非静态成员变量 非静态成员变量是属于类的实例的,每个对象都有自己的一份非静态成员变量。它们在对象创建时被初始化,并且可以通过对象来访问和修改。 下面是一个示例,演示了如何定义和使用非静态成员变量:…

    other 2023年7月29日
    00
  • html5服务器推送_动力节点Java学院整理

    HTML5服务器推送攻略 什么是HTML5服务器推送 HTML5服务器推送,也称为HTML5 Server-Sent Events,是一种通过HTTP连接从服务器端持续获取更新的技术。它类似于WebSockets,但不同之处在于它是单向的,只允许服务器端向客户端发送数据。它的主要优点是非常轻量级、易于使用,也比WebSockets更安全。 如何使用HTML5…

    other 2023年6月27日
    00
  • Linux文件查找命令总结(下篇)

    来详细讲解一下“Linux文件查找命令总结(下篇)”的完整攻略。 标题 Linux文件查找命令总结(下篇) 内容概述 本文主要介绍了Linux系统下常用的文件查找命令,包括find、which、whereis、locate等命令。这些命令可以在命令行中快速查找指定文件、目录和程序的位置。对于需要查找文件的任务,这些工具可以极大地提高我们的工作效率。本文将详细…

    other 2023年6月26日
    00
  • input标签checkbox选中触发事件的方法

    input标签checkbox选中触发事件的方法详解 在本攻略中,我们将详细讲解如何使用JavaScript监听input标签中的checkbox选中事件,并提供两个示例说明。 步骤1:创建HTML文件 首先,我们需要创建一个HTML文件,并在其中添加一个checkbox元素和一个用于显示结果的元素。例如: <!DOCTYPE html> &lt…

    other 2023年5月8日
    00
  • union的去重机制

    当然,我可以为您提供有关“union的去重机制”的完整攻略,以下是详细说明: 什么是union的去重机制? union的去重机制是在使用union的集合类型时,自动去重同的元素,以避免重复操作相同的元素。这个机制可以提操作效率,减少不必要的操作。 union去重机制的实现方式 union的去重机制是通过使用集合类型的特性来实现的。集合类型是一种无序、不重复的…

    other 2023年5月7日
    00
  • VBS技术内幕:CreateObject函数详解

    VBS技术内幕:CreateObject函数详解 在VBS(Visual Basic Script)中,CreateObject函数是一个非常重要的函数,用于创建并返回一个对COM组件或ActiveX对象的引用。以下是对CreateObject函数的详细讲解: 语法 CreateObject(servername.typename [, location])…

    other 2023年10月14日
    00
  • 总结一下时下流行的浏览器User-Agent大全

    总结一下时下流行的浏览器User-Agent大全攻略 什么是User-Agent? User-Agent是一个HTTP请求头部字段,用于标识发送请求的客户端应用程序、操作系统、设备类型等信息。浏览器User-Agent是指浏览器发送的User-Agent字符串,其中包含了浏览器的相关信息。 流行的浏览器User-Agent大全 以下是一些时下流行的浏览器Us…

    other 2023年8月3日
    00
  • 实例讲解避免javascript冲突的方法

    实例讲解避免 JavaScript 冲突的方法 在开发网页时,经常会遇到多个 JavaScript 库或框架同时使用的情况,这可能导致命名冲突和功能冲突。为了避免这些冲突,我们可以采取一些方法来确保 JavaScript 代码能够正确地运行。下面是两种常见的方法示例: 1. 使用命名空间 命名空间是一种将变量和函数封装在一个对象中的技术,以避免全局命名冲突。…

    other 2023年7月29日
    00
合作推广
合作推广
分享本页
返回顶部