今天在整理电脑资料的时候,发现一个我很久之前写的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格式的数据,如下图:
拿到了这个数据之后,就可以在前端处理,发起支付了。
评论0