Java接入微信支付超级详细教程【保姆级】
在当前网络支付日益普及的时代,微信支付作为其中的佼佼者,已经成为了商家和开发者们无法忽视的支付方式。本文将为大家提供一个详细的Java接入微信支付的教程,从准备工作到代码示例,力求做到通俗易懂,便于初学者参考。
一、准备工作
-
注册微信商户账号: 首先,你需要在微信支付官方网站(https://pay.weixin.qq.com)申请一个商户账号,并通过审核。
-
获取API密钥: 进入商户平台后,生成并记录下你的API密钥,这个密钥在后面的代码中会用到。
-
获取商户号: 商户号是每个商户唯一的标识,也需要记录下来,后续会用到。
-
开通APIv3和证书(如果使用的是企业支付需要): 如果需要进行一些特殊的支付操作,例如企业支付,需申请APIv3和下载相关证书。
二、引入依赖
在你的Java项目中,引入相关的HTTP请求库,例如Apache HttpClient。以下是使用Maven的依赖示例:
<dependencies>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.13</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
</dependencies>
三、创建支付订单
接下来,我们将编写代码来生成一个预支付订单。以下是一个简单的示例代码:
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import java.io.StringReader;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
public class WeChatPay {
private static final String APPID = "你的APPID";
private static final String MCHID = "你的商户号";
private static final String KEY = "你的API密钥";
private static final String PAY_URL = "https://api.mch.weixin.qq.com/v3/transactions/jsapi";
public static void main(String[] args) throws Exception {
String orderId = "订单编号";
String body = "商品描述";
String totalFee = "支付金额";
String nonceStr = generateNonceStr();
String sign = generateSign(orderId, body, totalFee, nonceStr);
// 创建XML请求体
String xml = createXml(orderId, body, totalFee, nonceStr, sign);
// 发送请求
String response = doPost(PAY_URL, xml);
System.out.println("响应结果: " + response);
}
private static String doPost(String url, String xml) throws Exception {
CloseableHttpClient client = HttpClients.createDefault();
HttpPost post = new HttpPost(url);
post.setHeader("Content-Type", "application/xml");
post.setEntity(new StringEntity(xml, "UTF-8"));
return EntityUtils.toString(client.execute(post).getEntity(), "UTF-8");
}
private static String createXml(String orderId, String body, String totalFee, String nonceStr, String sign) throws Exception {
DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder();
Document document = documentBuilder.newDocument();
Element root = document.createElement("xml");
document.appendChild(root);
Element appid = document.createElement("appid");
appid.appendChild(document.createTextNode(APPID));
root.appendChild(appid);
Element mchid = document.createElement("mchid");
mchid.appendChild(document.createTextNode(MCHID));
root.appendChild(mchid);
Element nonce_str = document.createElement("nonce_str");
nonce_str.appendChild(document.createTextNode(nonceStr));
root.appendChild(nonce_str);
Element signElement = document.createElement("sign");
signElement.appendChild(document.createTextNode(sign));
root.appendChild(signElement);
Element bodyElement = document.createElement("body");
bodyElement.appendChild(document.createTextNode(body));
root.appendChild(bodyElement);
Element total_fee = document.createElement("total_fee");
total_fee.appendChild(document.createTextNode(totalFee));
root.appendChild(total_fee);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
DOMSource source = new DOMSource(document);
StreamResult result = new StreamResult(new StringWriter());
transformer.transform(source, result);
return result.getWriter().toString();
}
private static String generateNonceStr() {
return Long.toHexString(System.currentTimeMillis());
}
private static String generateSign(String orderId, String body, String totalFee, String nonceStr) {
// 此处进行签名处理,返回签名字符串
// 签名算法需要根据微信支付文档来进行调整
// 示例为MD5签名
try {
String str = "appid=" + APPID + "&mch_id=" + MCHID + "&nonce_str=" + nonceStr + "&body=" + body + "&total_fee=" + totalFee + "&key=" + KEY;
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] result = md.digest(str.getBytes());
StringBuilder sb = new StringBuilder();
for (byte b : result) {
sb.append(String.format("%02x", b));
}
return sb.toString().toUpperCase();
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
}
四、注意事项
-
SSL证书:在进行HTTPS请求时,如果需要证书的支持,需使用Java的SSL/TLS配置,或者通过HttpClient配置SSL。
-
测试环境:建议在微信支付提供的测试环境中进行开发和测试,避免影响真实的交易。
-
错误处理:实际开发中,需要加强错误处理和异常捕获,确保支付流程的安全和可用性。
-
文档参考:具体的接口文档、参数说明和签名算法,请参考反对微信支付的官方文档(https://pay.weixin.qq.com/wiki/doc/api/index.html)。
通过以上内容,您应该能够顺利地将微信支付接入到您的Java项目中。希望这篇教程对您有所帮助!