以下是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;
}
}
本文档提供了Java调用微信支付接口的详细步骤,包括配置支付参数、发起支付请求及使用工具类辅助操作的示例代码。
607

被折叠的 条评论
为什么被折叠?



