java对接微信支付V2接口,单文件可以直接运行

浏览数(1163)

java对接微信支付V2接口,单文件可以直接运行

0

今天在整理电脑资料的时候,发现一个我很久之前写的java调用微信支付V2接口的联调代码,当时写这个,是用于接口测试,现在分享出来(此接口为发起预支付联调代码,拿到了接口返回的数据之后,还要进行相关的处理,然后通过app、网站或者小程序之类的,在用户前端发起支付

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * LCSAY TENCENT WECHAT PAY V2 预支付发起
 * 建议使用IntelliJ IDEA来运行,这样前面调用的类,如果本身没有,就会自动下载。
 * WECHAT AND QQ : 516519782
 */

public class testwechatpayapi {
    public static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            byte[] digest = md.digest(input.getBytes());
            StringBuilder sb = new StringBuilder();
            for (byte b : digest) {
                sb.append(String.format("%02x", b & 0xff));
            }
            return sb.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }

    public static void main(String[] args) {
        // 你的微信支付相关信息
        String appID = "";  //公众号或者小程序的appid
        String mchID = "";    //微信商户id,这个在微信支付的商户平台可以获取
        String apiKey = ""; //这个key,也是在商户平台获取的

        // 统一下单接口URL
        String unifiedOrderURL = "https://api.mch.weixin.qq.com/pay/unifiedorder";

        // 构建请求参数
        Map<String, String> parameters = new HashMap<>();
        parameters.put("appid", appID);
        parameters.put("mch_id", mchID);
        parameters.put("nonce_str", generateNonceString());
        parameters.put("body", "商品描述");
        parameters.put("out_trade_no", generateOutTradeNo());
        parameters.put("total_fee", "100"); // 金额以分为单位,这里表示1元
        parameters.put("spbill_create_ip", "127.0.0.1");
        parameters.put("notify_url", "");  //异步回调的地址(用户支付成功或者支付异常的情况下,都会给这个地址发送支付成功或者异常数据,异步回调的数据需要验签,如果验签成功要返回SUCCESS给微信支付的接口,告诉微信,不然会一直发数据过来,微信会检测异常和风控。)
        parameters.put("trade_type", "JSAPI");
        parameters.put("openid", "");   //发起微信支付的openid,如果是公众号,就用公众号的openid,如果是小程序,就用小程序的openid

        // 生成签名
        String sign = generateSign(parameters, apiKey);
        parameters.put("sign", sign);

        // 发起请求
        try {
            URL url = new URL(unifiedOrderURL);
            HttpURLConnection connection = (HttpURLConnection) url.openConnection();
            connection.setRequestMethod("POST");
            connection.setDoOutput(true);
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(mapToXml(parameters).getBytes(StandardCharsets.UTF_8));
            outputStream.flush();
            outputStream.close();

            // 读取响应
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            StringBuilder response = new StringBuilder();
            String line;
            while ((line = reader.readLine()) != null) {
                response.append(line);
            }
            reader.close();

            // 处理响应
            System.out.println("微信支付统一下单接口返回结果:" + response.toString());
            // 在这里根据返回结果进行后续处理,如解析XML、获取prepay_id等

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    // 生成随机字符串
    private static String generateNonceString() {
        // 在实际应用中,可以使用更加复杂的随机字符串生成方式
        return UUID.randomUUID().toString().replaceAll("-", "");
    }

    // 生成商户订单号
    private static String generateOutTradeNo() {
        // 在实际应用中,可以使用更加复杂的订单号生成方式
        return String.valueOf(System.currentTimeMillis());
    }

    // 生成签名
    private static String generateSign(Map<String, String> parameters, String apiKey) {
        List<String> keys = new ArrayList<>(parameters.keySet());
        Collections.sort(keys);
        StringBuilder sb = new StringBuilder();
        for (String key : keys) {
            String value = parameters.get(key);
            sb.append(key).append("=").append(value).append("&");
        }
        sb.append("key=").append(apiKey);
        return md5(sb.toString()).toUpperCase();
    }

// 将Map转换为XML格式

    private static String mapToXml(Map<String, String> parameters) {
        StringBuilder xmlBuilder = new StringBuilder();
        xmlBuilder.append("<xml>");
        for (Map.Entry<String, String> entry : parameters.entrySet()) {
            xmlBuilder.append("<").append(entry.getKey()).append(">")
                    .append(entry.getValue())
                    .append("</").append(entry.getKey()).append(">");
        }
        xmlBuilder.append("</xml>");
        return xmlBuilder.toString();
    }
}

如果顺利运行,返回的是xml格式的数据,如下图:

微信截图_20240721154323.jpg

拿到了这个数据之后,就可以在前端处理,发起支付了。

注:本文由www.lcsay.com发表,如需转载或已侵权,请联系我。

✎﹏𝓁𝒸𝓈𝒶𝓎﹍﹍·

评论0