java对接微信支付:JSAPI支付(微信公众号支付)

0

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 = new HashMap<>();

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 params) throws ParserConfigurationException {

Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

Element root = document.createElement("xml");

document.appendChild(root);

for (Map.Entry entry : params.entrySet()) {

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 = new HashMap<>();

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 = new HashMap<>();

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 = new HashMap<>();

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 = new HashMap<>();

params.put("appid", appId);

params.put("mch_id", m

支付公众号微信java

版权声明:除非特别标注,否则均为网络文章,侵权请联系站长删除。

上一篇 Android微信支付彻底扫坑

下一篇 Java对接微信支付实现微信APP支付