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日

相关文章

  • C/C++合并两个升序链表的方式

    当合并两个已按升序排列的链表时,可以使用指针遍历两个链表,并选择合适的节点插入到一个新链表中。以下是一般的步骤: 创建一个新链表的头结点,并用指针指向它。 使用两个指针,一个指向第一个链表的头结点,另一个指向第二个链表的头结点。 遍历两个链表直到其中一个链表已到达结尾。在每次遍历时选择相对较小的节点并插入到新链表。 如果其中一个链表到达结尾而另一个链表仍然有…

    other 2023年6月27日
    00
  • Python尾递归优化实现代码及原理详解

    Python尾递归优化实现代码及原理详解 什么是尾递归 递归是计算机编程中常用的一种算法。在递归中,函数在调用自身之前会执行一些操作。递归调用链会在一定条件下结束,如达到了某个递归深度,或者某个函数返回了终止条件。 尾递归是一种特殊的递归形式,即函数的最后一个操作是它的递归调用。在尾递归中,递归调用不会造成新的堆栈空间,它会用当前的堆栈替换掉调用它的堆栈(这…

    other 2023年6月27日
    00
  • java-尽管未选中该开关 但ischecked()返回true

    在Java中,isChecked()方法通常用于检查复选框是否被选中。但是,有时候即使未选中该开关,isChecked()方法也会返回true。以下是解决这个问题的攻略: 检查复选框的状态 在使用isChecked()方法之前,我们需要先检查复选框的状态。可以使用以下代码检查复选框的状态: if (checkBox.isSelected()) { // 复选…

    other 2023年5月8日
    00
  • 关于javascript:data:image/jpeg;base64如何获取其宽度

    关于javascript:data:image/jpeg;base64如何获取其宽度 在Web开发中,经常会使用Base64编码的图片。在JavaScript中,可以使用data:image/jpeg;base64格式来表示Base64编码的JPEG图片。本文将详细讲解如何获取这种格式的图片的宽度,包括两个示例。 示例1:使用Image对象获取宽度 可以使用…

    other 2023年5月8日
    00
  • php生成curl命令行的方法

    生成curl命令行是一个非常常见的需求,在PHP中可以通过cURL扩展来实现。下面是 PHP 生成curl命令行的方法的完整攻略。 步骤一:安装cURL扩展 在PHP中使用cURL扩展需要先安装。可以通过在服务器端运行以下命令来获取最新版的cURL和php-curl扩展: $ sudo apt-get install curl libcurl3 libcur…

    other 2023年6月26日
    00
  • 魔兽世界wlk怀旧服熊德堆什么属性 熊德属性优先级选择推荐

    魔兽世界WLK怀旧服熊德属性优先级选择推荐 简介 熊德是魔兽世界中一个强大的职业,具有出色的肉盾和输出能力。在WLK怀旧服中,熊德依然是一个非常重要的职业,但是属性优先级的选择对于熊德的输出、生存能力至关重要。本篇攻略将为大家介绍熊德的属性优先级选择以及推荐。 属性优先级选择 熊形态 在熊形态下,熊德需要优先关注以下属性: 装备强度:熊德的装备强度非常重要,…

    other 2023年6月27日
    00
  • Python3.7.0 Shell添加清屏快捷键的实现示例

    Python 3.7.0 Shell添加清屏快捷键的实现示例攻略 在Python 3.7.0 Shell中,我们可以通过添加自定义的快捷键来实现清屏操作。下面是一个详细的攻略,包含了两个示例说明。 步骤一:创建Python Startup文件 打开文本编辑器,创建一个新的Python Startup文件。可以将文件命名为pythonstartup.py,保存…

    other 2023年8月3日
    00
  • Android编程实现应用程序开机自启动的方法

    首先我们要明确一下,Android系统本身并没有提供开机自启动的接口,但可以通过以下方法实现: 使用BroadcastReceiver接收系统广播,启动应用程序 在Android系统中有一些系统级别的广播,例如系统启动完成的广播、应用程序安装完成的广播等,我们可以通过监听这些广播,来自动启动我们的应用程序。 具体实现步骤如下: 创建一个BroadcastRe…

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