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
qrcode {
width:200px;
height:200px;
margin:20px auto;
}
```
步骤三:用户扫码
用户扫描二维码后,会跳转到微信支付页面进行支付。
示例代码如下:
```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微信支付开发之扫码支付模式一的详细描述。