Java接入微信支付超级详细教程【保姆级】

在当前网络支付日益普及的时代,微信支付作为其中的佼佼者,已经成为了商家和开发者们无法忽视的支付方式。本文将为大家提供一个详细的Java接入微信支付的教程,从准备工作到代码示例,力求做到通俗易懂,便于初学者参考。

一、准备工作

  1. 注册微信商户账号: 首先,你需要在微信支付官方网站(https://pay.weixin.qq.com)申请一个商户账号,并通过审核。

  2. 获取API密钥: 进入商户平台后,生成并记录下你的API密钥,这个密钥在后面的代码中会用到。

  3. 获取商户号: 商户号是每个商户唯一的标识,也需要记录下来,后续会用到。

  4. 开通APIv3和证书(如果使用的是企业支付需要): 如果需要进行一些特殊的支付操作,例如企业支付,需申请APIv3和下载相关证书。

二、引入依赖

在你的Java项目中,引入相关的HTTP请求库,例如Apache HttpClient。以下是使用Maven的依赖示例:

<dependencies>
    <dependency>
        <groupId>org.apache.httpcomponents</groupId>
        <artifactId>httpclient</artifactId>
        <version>4.5.13</version>
    </dependency>
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.8.6</version>
    </dependency>
</dependencies>

三、创建支付订单

接下来,我们将编写代码来生成一个预支付订单。以下是一个简单的示例代码:

import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.StringReader;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;

public class WeChatPay {

    private static final String APPID = "你的APPID";
    private static final String MCHID = "你的商户号";
    private static final String KEY = "你的API密钥";
    private static final String PAY_URL = "https://api.mch.weixin.qq.com/v3/transactions/jsapi";

    public static void main(String[] args) throws Exception {
        String orderId = "订单编号";
        String body = "商品描述";
        String totalFee = "支付金额";

        String nonceStr = generateNonceStr();
        String sign = generateSign(orderId, body, totalFee, nonceStr);

        // 创建XML请求体
        String xml = createXml(orderId, body, totalFee, nonceStr, sign);

        // 发送请求
        String response = doPost(PAY_URL, xml);
        System.out.println("响应结果: " + response);
    }

    private static String doPost(String url, String xml) throws Exception {
        CloseableHttpClient client = HttpClients.createDefault();
        HttpPost post = new HttpPost(url);
        post.setHeader("Content-Type", "application/xml");
        post.setEntity(new StringEntity(xml, "UTF-8"));

        return EntityUtils.toString(client.execute(post).getEntity(), "UTF-8");
    }

    private static String createXml(String orderId, String body, String totalFee, String nonceStr, String sign) throws Exception {
        DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
        DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
        Document document = documentBuilder.newDocument();

        Element root = document.createElement("xml");
        document.appendChild(root);

        Element appid = document.createElement("appid");
        appid.appendChild(document.createTextNode(APPID));
        root.appendChild(appid);

        Element mchid = document.createElement("mchid");
        mchid.appendChild(document.createTextNode(MCHID));
        root.appendChild(mchid);

        Element nonce_str = document.createElement("nonce_str");
        nonce_str.appendChild(document.createTextNode(nonceStr));
        root.appendChild(nonce_str);

        Element signElement = document.createElement("sign");
        signElement.appendChild(document.createTextNode(sign));
        root.appendChild(signElement);

        Element bodyElement = document.createElement("body");
        bodyElement.appendChild(document.createTextNode(body));
        root.appendChild(bodyElement);

        Element total_fee = document.createElement("total_fee");
        total_fee.appendChild(document.createTextNode(totalFee));
        root.appendChild(total_fee);

        TransformerFactory transformerFactory = TransformerFactory.newInstance();
        Transformer transformer = transformerFactory.newTransformer();
        DOMSource source = new DOMSource(document);
        StreamResult result = new StreamResult(new StringWriter());
        transformer.transform(source, result);
        return result.getWriter().toString();
    }

    private static String generateNonceStr() {
        return Long.toHexString(System.currentTimeMillis());
    }

    private static String generateSign(String orderId, String body, String totalFee, String nonceStr) {
        // 此处进行签名处理,返回签名字符串
        // 签名算法需要根据微信支付文档来进行调整

        // 示例为MD5签名
        try {
            String str = "appid=" + APPID + "&mch_id=" + MCHID + "&nonce_str=" + nonceStr + "&body=" + body + "&total_fee=" + totalFee + "&key=" + KEY;
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] result = md.digest(str.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : result) {
                sb.append(String.format("%02x", b));
            }
            return sb.toString().toUpperCase();
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
}

四、注意事项

  1. SSL证书:在进行HTTPS请求时,如果需要证书的支持,需使用Java的SSL/TLS配置,或者通过HttpClient配置SSL。

  2. 测试环境:建议在微信支付提供的测试环境中进行开发和测试,避免影响真实的交易。

  3. 错误处理:实际开发中,需要加强错误处理和异常捕获,确保支付流程的安全和可用性。

  4. 文档参考:具体的接口文档、参数说明和签名算法,请参考反对微信支付的官方文档(https://pay.weixin.qq.com/wiki/doc/api/index.html)。

通过以上内容,您应该能够顺利地将微信支付接入到您的Java项目中。希望这篇教程对您有所帮助!

点赞(0) 打赏

微信小程序

微信扫一扫体验

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部