今天在整理电脑资料的时候,发现一个我很久之前写的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