java调用微信支付的接口的代码

本文档提供了Java调用微信支付接口的详细步骤,包括配置支付参数、发起支付请求及使用工具类辅助操作的示例代码。

以下是Java调用微信支付接口的示例代码:

1.配置微信支付参数

public class WeChatPayConfig {
    // 商户号
    public static final String MCH_ID = "xxxxxxxxxxxxx";
    // 应用ID
    public static final String APP_ID = "xxxxxxxxxxxxx";
    // API密钥,在商户平台设置
    public static final String API_KEY = "xxxxxxxxxxxxx";
    // 统一下单API接口
    public static final String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
}

2.发起微信支付

public class WeChatPay {
    /**
     * 发起微信支付
     *
     * @param body       商品描述
     * @param outTradeNo 商户订单号
     * @param totalFee   订单总金额,单位为分
     * @param spbillCreateIp 用户端实际ip
     * @param notifyUrl  支付成功回调地址
     * @param tradeType  支付类型,JSAPI或NATIVE或APP等
     * @param openid     用户openid,tradeType为JSAPI时必传
     * @return
     */
    public static Map<String, String> weChatPay(String body, String outTradeNo, int totalFee, String spbillCreateIp, String notifyUrl, String tradeType, String openid) {
        // 生成随机字符串
        String nonceStr = UUID.randomUUID().toString().replaceAll("-", "");
        // 组装请求参数
        SortedMap<String, String> params = new TreeMap<>();
        params.put("appid", WeChatPayConfig.APP_ID);
        params.put("mch_id", WeChatPayConfig.MCH_ID);
        params.put("nonce_str", nonceStr);
        params.put("body", body);
        params.put("out_trade_no", outTradeNo);
        params.put("total_fee", String.valueOf(totalFee));
        params.put("spbill_create_ip", spbillCreateIp);
        params.put("notify_url", notifyUrl);
        params.put("trade_type", tradeType);
        if ("JSAPI".equals(tradeType)) {
            params.put("openid", openid);
        }
        // 签名
        String sign = WeChatPayUtil.createSign(params, WeChatPayConfig.API_KEY);
        params.put("sign", sign);
        // 调用统一下单API接口
        String result = WeChatPayUtil.httpRequest(WeChatPayConfig.UNIFIED_ORDER_URL, "POST", WeChatPayUtil.mapToXml(params));
        Map<String, String> resultMap = WeChatPayUtil.xmlToMap(result);
        // 判断返回结果
        if ("SUCCESS".equals(resultMap.get("return_code"))) {
            // 调用成功,判断业务结果
            if ("SUCCESS".equals(resultMap.get("result_code"))) {
                // 生成预支付交易会话标识
                String prepayId = resultMap.get("prepay_id");
                // 根据预支付交易会话标识和API密钥生成签名
                SortedMap<String, String> payParams = new TreeMap<>();
                payParams.put("appId", WeChatPayConfig.APP_ID);
                payParams.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
                payParams.put("nonceStr", nonceStr);
                payParams.put("package", "prepay_id=" + prepayId);
                payParams.put("signType", "MD5");
                String paySign = WeChatPayUtil.createSign(payParams, WeChatPayConfig.API_KEY);
                payParams.put("paySign", paySign);
                return payParams;
            } else {
                // 业务失败,输出错误信息
                System.out.println("err_code:" + resultMap.get("err_code"));
                System.out.println("err_code_des:" + resultMap.get("err_code_des"));
            }
        } else {
            // 调用失败,输出错误信息
            System.out.println("return_msg:" + resultMap.get("return_msg"));
        }
        return null;
    }
}

3.工具类

public class WeChatPayUtil {
    /**
     * 生成签名
     *
     * @param params   请求参数
     * @param apiKey   API密钥
     * @return
     */
    public static String createSign(SortedMap<String, String> params, String apiKey) {
        StringBuilder sb = new StringBuilder();
        for (Map.Entry<String, String> entry : params.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            if (StringUtils.isNotEmpty(value) && !"sign".equals(key) && !"key".equals(key)) {
                sb.append(key).append("=").append(value).append("&");
            }
        }
        sb.append("key=").append(apiKey);
        return DigestUtils.md5Hex(sb.toString()).toUpperCase();
    }

    /**
     * 将Map转换为XML格式的字符串
     *
     * @param params
     * @return
     */
    public static String mapToXml(Map<String, String> params) {
        StringBuilder sb = new StringBuilder("<xml>");
        for (Map.Entry<String, String> entry : params.entrySet()) {
            String key = entry.getKey();
            String value = entry.getValue();
            sb.append("<").append(key).append(">").append(value).append("</").append(key).append(">");
        }
        sb.append("</xml>");
        return sb.toString();
    }

    /**
     * 将XML格式的字符串转换为Map
     *
     * @param xml
     * @return
     */
    public static Map<String, String> xmlToMap(String xml) {
        Map<String, String> map = new HashMap<>();
        try {
            Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new InputSource(new StringReader(xml)));
            NodeList nodeList = document.getDocumentElement().getChildNodes();
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    map.put(node.getNodeName(), node.getTextContent());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }

    /**
     * 发送HTTP请求
     *
     * @param url    请求地址
     * @param method 请求方法
     * @param data   请求数据
     * @return
     */
    public static String httpRequest(String url, String method, String data) {
        String result = null;
        try {
            URLConnection connection = new URL(url).openConnection();
            connection.setConnectTimeout(5000);
            connection.setReadTimeout(5000);
            connection.setDoInput(true);
            connection.setDoOutput(true);
            connection.setRequestProperty("Content-Type", "application/xml");
            connection.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36");
            if ("POST".equals(method)) {
                OutputStream outputStream = connection.getOutputStream();
                outputStream.write(data.getBytes("UTF-8"));
                outputStream.flush();
                outputStream.close();
            }
            InputStream inputStream = connection.getInputStream();
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            byte[] buffer = new byte[1024];
            int len;
            while ((len = inputStream.read(buffer)) != -1) {
                byteArrayOutputStream.write(buffer, 0, len);
            }
            result = byteArrayOutputStream.toString("UTF-8");
            inputStream.close();
            byteArrayOutputStream.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值