java对接微信支付:JSAPI支付(微信公众号支付)
微信JSAPI支付
微信JSAPI支付是一种通过微信公众号进行的在线支付方式。它允许用户在微信公众号中完成支付流程,而无需离开公众号界面。
步骤1:配置微信支付
首先,我们需要在微信支付平台上创建一个商户账号,并且配置好相关信息,如商户ID、密钥等。
1.1 创建商户账号
登录微信支付平台,点击"创建商户账号"按钮,填写相关信息,如商户名称、联系方式等。
1.2 配置API证书
在商户账号中,需要配置API证书,这个证书用于签名和验签请求数据。需要上传商户的营业执照等相关文件。
步骤2:生成预付单
当用户点击支付按钮时,我们需要生成一个预付单(prepay_id),这个预付单包含了支付所需的信息,如订单金额、支付时间等。
2.1生成预付单接口
我们需要调用微信支付的生成预付单接口,传入相关参数,如商户ID、订单金额、支付时间等。
```javaimport java.net.URL;
import java.util.HashMap;
import java.util.Map;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;
public class WechatPayUtil {
public static String getPrepayId(String appId, String mchId, String nonceStr, String packageValue, String signType, String paySign) throws Exception {
Map
params.put("appid", appId);
params.put("mch_id", mchId);
params.put("nonce_str", nonceStr);
params.put("package", packageValue);
params.put("sign_type", signType);
params.put("pay_sign", paySign);
String xml = getXml(params);
URL url = new URL(" HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.getOutputStream().write(xml.getBytes());
int code = connection.getResponseCode();
if (code ==200) {
String responseXml = getResponseXml(connection.getInputStream());
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(responseXml);
NodeList nodeList = document.getElementsByTagName("prepay_id");
return nodeList.item(0).getTextContent();
} else {
throw new Exception("获取预付单失败,状态码:" + code);
}
}
private static String getXml(Map
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();
Element root = document.createElement("xml");
document.appendChild(root);
for (Map.Entry
Element element = document.createElement(entry.getKey());
element.setTextContent(String.valueOf(entry.getValue()));
root.appendChild(element);
}
return getXml(document);
}
private static String getXml(Document document) throws ParserConfigurationException {
TransformerFactory factory = TransformerFactory.newInstance();
Transformer transformer = factory.newTransformer();
StringWriter writer = new StringWriter();
transformer.transform(new DOMSource(document), new StreamResult(writer));
return writer.toString();
}
private static String getResponseXml(InputStream inputStream) throws SAXException, IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
StringBuilder builder = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
builder.append(line);
}
return builder.toString();
}
}
```
步骤3:生成签名
在生成预付单的同时,我们需要生成一个签名(sign),这个签名用于验签请求数据。
3.1生成签名接口
我们需要调用微信支付的生成签名接口,传入相关参数,如商户ID、订单金额、支付时间等。
```javapublic class WechatPayUtil {
public static String getSign(String appId, String mchId, String nonceStr, String packageValue, String signType) throws Exception {
Map
params.put("appid", appId);
params.put("mch_id", mchId);
params.put("nonce_str", nonceStr);
params.put("package", packageValue);
String xml = getXml(params);
URL url = new URL(" HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.getOutputStream().write(xml.getBytes());
int code = connection.getResponseCode();
if (code ==200) {
String responseXml = getResponseXml(connection.getInputStream());
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(responseXml);
NodeList nodeList = document.getElementsByTagName("sign");
return nodeList.item(0).getTextContent();
} else {
throw new Exception("获取签名失败,状态码:" + code);
}
}
// ...
}
```
步骤4:生成支付请求
当用户点击支付按钮时,我们需要生成一个支付请求(request),这个请求包含了支付所需的信息,如订单金额、支付时间等。
4.1生成支付请求接口
我们需要调用微信支付的生成支付请求接口,传入相关参数,如商户ID、订单金额、支付时间等。
```javapublic class WechatPayUtil {
public static String getPayRequest(String appId, String mchId, String nonceStr, String packageValue, String signType, String paySign) throws Exception {
Map
params.put("appid", appId);
params.put("mch_id", mchId);
params.put("nonce_str", nonceStr);
params.put("package", packageValue);
params.put("sign_type", signType);
params.put("pay_sign", paySign);
String xml = getXml(params);
URL url = new URL(" HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.getOutputStream().write(xml.getBytes());
int code = connection.getResponseCode();
if (code ==200) {
String responseXml = getResponseXml(connection.getInputStream());
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(responseXml);
NodeList nodeList = document.getElementsByTagName("prepay_id");
return nodeList.item(0).getTextContent();
} else {
throw new Exception("获取支付请求失败,状态码:" + code);
}
}
// ...
}
```
步骤5:处理支付结果
当用户点击支付按钮时,我们需要处理支付结果(result),这个结果包含了支付所需的信息,如订单金额、支付时间等。
5.1 处理支付结果接口
我们需要调用微信支付的处理支付结果接口,传入相关参数,如商户ID、订单金额、支付时间等。
```javapublic class WechatPayUtil {
public static String handlePayResult(String appId, String mchId, String nonceStr, String packageValue, String signType, String paySign) throws Exception {
Map
params.put("appid", appId);
params.put("mch_id", mchId);
params.put("nonce_str", nonceStr);
params.put("package", packageValue);
params.put("sign_type", signType);
params.put("pay_sign", paySign);
String xml = getXml(params);
URL url = new URL(" HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setDoOutput(true);
connection.getOutputStream().write(xml.getBytes());
int code = connection.getResponseCode();
if (code ==200) {
String responseXml = getResponseXml(connection.getInputStream());
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(responseXml);
NodeList nodeList = document.getElementsByTagName("result");
return nodeList.item(0).getTextContent();
} else {
throw new Exception("处理支付结果失败,状态码:" + code);
}
}
// ...
}
```
步骤6:更新订单状态
当用户点击支付按钮时,我们需要更新订单状态(status),这个状态包含了支付所需的信息,如订单金额、支付时间等。
6.1 更新订单状态接口
我们需要调用微信支付的更新订单状态接口,传入相关参数,如商户ID、订单金额、支付时间等。
```javapublic class WechatPayUtil {
public static String updateOrderStatus(String appId, String mchId, String nonceStr, String packageValue, String signType, String paySign) throws Exception {
Map
params.put("appid", appId);
params.put("mch_id", m