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

yizhihongxing

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日

相关文章

  • 无线路由器的ip地址忘了的解决办法

    无线路由器的IP地址忘了的解决办法攻略 如果你忘记了无线路由器的IP地址,不用担心,以下是一份详细的解决办法攻略,帮助你找回路由器的IP地址。 步骤1:查找路由器的默认IP地址 大多数无线路由器都有一个默认的IP地址,你可以通过以下几种方式来查找它: 查找路由器的用户手册:在路由器的用户手册中,你可以找到关于默认IP地址的信息。手册通常会提供一个默认的管理网…

    other 2023年7月30日
    00
  • 鸿蒙 HarmonyOS 3.1 开发者 Beta 版本开启公测招募 首批仅限华为 P50 / Pro

    下面是针对“鸿蒙 HarmonyOS 3.1 开发者 Beta 版本开启公测招募 首批仅限华为 P50 / Pro”的完整攻略: 一、首先了解鸿蒙 HarmonyOS 3.1 鸿蒙 HarmonyOS 3.1 是华为公司推出的新一代分布式操作系统,其最大的特点是可以支持多种设备类型和平台,包括手机、平板电脑、电视、可穿戴设备、智能家居等,可在不同的设备之间进…

    other 2023年6月26日
    00
  • C++继承与菱形继承详细介绍

    当然!下面是关于\”C++继承与菱形继承详细介绍\”的完整攻略,包含两个示例说明。 C++继承与菱形继承详细介绍 继承是面向对象编程中的重要概念,它允许一个类继承另一个类的属性和方法。在C++中,我们可以使用继承来创建新的类,并从已有的类中继承属性和方法。菱形继承是继承中的一种特殊情况,它指的是一个派生类同时继承了两个基类,而这两个基类又继承自同一个基类。 …

    other 2023年8月20日
    00
  • PHP中的Trait 特性及作用

    PHP中的Trait 特性及作用 什么是Trait Trait是PHP中一种代码复用机制,它允许开发者在不使用继承的情况下,将方法集合应用到一个类中。Trait可以被多个类使用,提供了一种解决多继承问题的方式。 Trait的作用 Trait的主要作用是解决PHP单继承的限制,它可以在不引入多继承的复杂性的情况下,实现代码的复用。Trait可以定义一组方法,然…

    other 2023年7月28日
    00
  • Win11加密功能怎么添加到右键菜单? Win11加密解密右键快捷添加方法

    以下是“Win11加密功能怎么添加到右键菜单? Win11加密解密右键快捷添加方法”的完整攻略: 添加Win11加密解密右键菜单 首先打开“注册表编辑器”,可以在Win11系统中按下Win + R快捷键打开“运行”窗口,输入regedit命令并回车即可。 导航到HKEY_CLASSES_ROOT\*\shell节点。 右键单击“shell”节点,并选择“新建…

    other 2023年6月27日
    00
  • js中indexOf()的简单使用示例

    当在JavaScript中需要查找一个元素在数组中的索引时,可以使用indexOf()方法。下面是indexOf()方法的简单使用示例: 示例1: // 创建一个数组 var fruits = [‘apple’, ‘banana’, ‘orange’, ‘grape’]; // 使用indexOf()方法查找元素的索引 var index = fruits.…

    other 2023年8月19日
    00
  • Python 多继承中的一个诡异现象 既是 Father又是grandfather

    针对Python多继承中的一个诡异现象,我会给出完整的攻略,包括示例说明。在Python中,多继承是一种同时继承多个父类的方式。然而,在多继承的情况下,可能会出现某个类同时继承了它的父类和祖先类的某个方法或属性的情况,导致代码执行结果不符合预期。 这个诡异现象的根本原因在于Python的MRO算法(multiple inheritance resolutio…

    other 2023年6月26日
    00
  • react中context传值和生命周期详解

    我们来详细讲解一下“React中Context传值和生命周期详解”的完整攻略。 1. 什么是Context Context允许我们不必通过逐层传递props,就可以在组件树中共享数据,并在其中任何地方访问该数据。Context 的主要应用场景是在跨多个层级的组件传递数据。 2. 创建Context // 创建一个名为 MyContext 的context c…

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