Java微信支付开发之扫码支付模式一

5

Java微信支付开发之扫码支付模式一

Java微信支付开发之扫码支付模式一

准备工作

在开始开发微信扫码支付功能之前,需要确保以下准备工作已经完成:

1. 已通过微信认证的公众号: 公众号必须已经通过微信认证,并且获得了相应的认证信息。

2. ICP备案域名: 公众号所在的域名必须经过ICP备案,否则会报支付失败。

扫码支付模式一

扫码支付模式一是最常见的一种支付方式。商户后台系统根据微信支付规定格式生成二维码,并展示给用户扫码。用户扫描二维码后,会跳转到微信支付页面进行支付。

步骤一:生成二维码

商户后台系统需要根据微信支付规定格式生成二维码。以下是生成二维码的规则:

* appid: 公众号的appid。

* mch_id: 商户ID。

* nonce_str: 随机字符串,用于防止重复请求。

* body: 商品描述。

* amount:金额。

* spbill_create_ip: 用户端IP。

生成二维码的示例代码如下:

```javaimport javax.xml.parsers.DocumentBuilderFactory;

import javax.xml.parsers.ParserConfigurationException;

import org.w3c.dom.Document;

import org.w3c.dom.Element;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.Random;

public class WeChatPayUtil {

public static String generateNonceStr() {

Random random = new Random();

return MD5(random.nextLong() + "");

}

public static String getTradeNo() {

return System.currentTimeMillis() + "";

}

public static String getSign(String appid, String mch_id, String nonce_str, String body, String amount) throws NoSuchAlgorithmException {

String[] keys = {appid, mch_id, nonce_str, body, amount};

StringBuilder sb = new StringBuilder();

for (String key : keys) {

sb.append(key);

}

return MD5(sb.toString());

}

public static Document getTradeXml(String appid, String mch_id, String nonce_str, String body, String amount) throws ParserConfigurationException {

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

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

document.appendChild(root);

Element tradeNoElement = document.createElement("trade_no");

tradeNoElement.setTextContent(getTradeNo());

root.appendChild(tradeNoElement);

Element appidElement = document.createElement("appid");

appidElement.setTextContent(appid);

root.appendChild(appidElement);

Element mch_idElement = document.createElement("mch_id");

mch_idElement.setTextContent(mch_id);

root.appendChild(mch_idElement);

Element nonce_strElement = document.createElement("nonce_str");

nonce_strElement.setTextContent(nonce_str);

root.appendChild(nonce_strElement);

Element bodyElement = document.createElement("body");

bodyElement.setTextContent(body);

root.appendChild(bodyElement);

Element amountElement = document.createElement("amount");

amountElement.setTextContent(amount);

root.appendChild(amountElement);

return document;

}

public static String getTradeXmlString(String appid, String mch_id, String nonce_str, String body, String amount) throws ParserConfigurationException {

Document document = getTradeXml(appid, mch_id, nonce_str, body, amount);

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

try {

document.write(outputStream, "UTF-8");

} catch (IOException e) {

throw new RuntimeException(e);

}

return outputStream.toString();

}

public static String MD5(String str) throws NoSuchAlgorithmException {

MessageDigest md = MessageDigest.getInstance("MD5");

byte[] bytes = md.digest(str.getBytes());

StringBuilder sb = new StringBuilder();

for (byte b : bytes) {

sb.append(Integer.toHexString(0xff & b));

}

return sb.toString();

}

}

```

步骤二:展示二维码

商户后台系统需要展示生成的二维码给用户。可以使用HTML和CSS来实现。

示例代码如下:

```html

扫码支付

```

步骤三:用户扫码

用户扫描二维码后,会跳转到微信支付页面进行支付。

示例代码如下:

```javaimport javax.servlet. javax.servlet. javax.servlet. class WeChatPayServlet extends HttpServlet {

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {

String appid = request.getParameter("appid");

String mch_id = request.getParameter("mch_id");

String nonce_str = request.getParameter("nonce_str");

String body = request.getParameter("body");

String amount = request.getParameter("amount");

try {

Document document = getTradeXml(appid, mch_id, nonce_str, body, amount);

response.setContentType("text/xml");

response.getWriter().write(document.toString());

} catch (ParserConfigurationException e) {

throw new RuntimeException(e);

}

}

}

```

步骤四:支付结果

用户完成支付后,会跳转到商户后台系统的回调页面。

示例代码如下:

```javaimport javax.servlet. javax.servlet. javax.servlet. class WeChatPayCallbackServlet extends HttpServlet {

@Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException {

String appid = request.getParameter("appid");

String mch_id = request.getParameter("mch_id");

String nonce_str = request.getParameter("nonce_str");

String body = request.getParameter("body");

String amount = request.getParameter("amount");

try {

Document document = getTradeXml(appid, mch_id, nonce_str, body, amount);

response.setContentType("text/xml");

response.getWriter().write(document.toString());

} catch (ParserConfigurationException e) {

throw new RuntimeException(e);

}

}

}

```

以上就是Java微信支付开发之扫码支付模式一的详细描述。

支付模式支付二维码模式一扫码支付

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

上一篇 微信WeChat“被扫支付SDK”

下一篇 微信扫码支付交易流程分析 开发