SpringBoot 实现微信支付接口调用及回调处理
基于 SpringBoot 框架实现微信支付接口的完整流程。内容涵盖用户下单、后端统一下单、前端唤起支付、微信回调通知及订单状态更新。提供了配置文件设置、依赖引入、核心服务类、控制器及签名工具类的代码示例,并说明了商户参数获取及回调地址配置方法,帮助开发者快速完成支付功能对接。

基于 SpringBoot 框架实现微信支付接口的完整流程。内容涵盖用户下单、后端统一下单、前端唤起支付、微信回调通知及订单状态更新。提供了配置文件设置、依赖引入、核心服务类、控制器及签名工具类的代码示例,并说明了商户参数获取及回调地址配置方法,帮助开发者快速完成支付功能对接。

out_trade_no)。https://api.mch.weixin.qq.com/pay/unifiedorder)。return_code 和 result_code,确保请求成功。prepay_id,并根据它生成支付签名等信息。prepay_id 和其他必要参数(如时间戳、随机字符串、签名等)封装成 JSON 响应返回给前端。https://yourdomain.com/wechat/notify)。result_code 更新数据库中的订单状态。如果支付成功,修改订单状态为'已支付',并进行相应的业务处理(如发货)。<xml><return_code>SUCCESS</return_code></xml>。https://api.mch.weixin.qq.com/pay/orderquery)来确认订单的状态。在 application.properties 中配置微信支付的相关参数:
# 微信支付配置
wechat.pay.appId=your_app_id
wechat.pay.mchId=your_mch_id
wechat.pay.apiKey=your_api_key
wechat.pay.notifyUrl=https://yourdomain.com/wechat/notify
确保你的项目引入了必要的依赖。在 pom.xml 中添加以下内容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
</dependency>
<dependency>
<groupId>com.thoughtworks.xstream</groupId>
<artifactId>xstream</artifactId>
<version>1.4.18</version>
</dependency>
创建一个服务类 WeChatPayService,用于处理订单的创建和签名等操作。
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 org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
@Service
public class WeChatPayService {
@Value("${wechat.pay.appId}")
private String appId;
@Value("${wechat.pay.mchId}")
private String mchId;
@Value("${wechat.pay.apiKey}")
private String apiKey;
@Value("${wechat.pay.notifyUrl}")
private String notifyUrl;
private static final String UNIFIED_ORDER_URL = "https://api.mch.weixin.qq.com/pay/unifiedorder";
public String createOrder(String orderNo, double amount) throws Exception {
String nonceStr = String.valueOf(System.currentTimeMillis());
String xmlData = "<xml>"
+ "<appid>" + appId + "</appid>"
+ "<mch_id>" + mchId + "</mch_id>"
+ + nonceStr +
+
+ + orderNo +
+ + () (amount * ) +
+
+ + notifyUrl +
+
+ ;
WeChatPayUtil.generateSign(xmlData, apiKey);
xmlData = xmlData.replace(, + sign + );
( HttpClients.createDefault()) {
(UNIFIED_ORDER_URL);
post.setEntity( (xmlData, ));
post.setHeader(, );
EntityUtils.toString(client.execute(post).getEntity(), );
response;
}
}
}
创建一个控制器 WeChatPayController,处理用户的下单请求 (@PostMapping("/createOrder")) 和回调 (@PostMapping("/notify"))。
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Map;
@RestController
@RequestMapping("/wechat")
public class WeChatPayController {
@Autowired
private WeChatPayService weChatPayService;
@Value("${wechat.pay.apiKey}")
private String apiKey;
@PostMapping("/createOrder")
public String createOrder(@RequestParam String orderNo, @RequestParam double amount) {
try {
return weChatPayService.createOrder(orderNo, amount);
} catch (Exception e) {
e.printStackTrace();
return "Error creating order";
}
}
@PostMapping("/notify")
public String handleCallback(HttpServletRequest request) {
StringBuilder sb = new StringBuilder();
try (BufferedReader reader = new BufferedReader(new (request.getInputStream()))) {
String line;
((line = reader.readLine()) != ) {
sb.append(line);
}
} (IOException e) {
e.printStackTrace();
}
sb.toString();
Map<String, String> data = WeChatPayUtil.parseXml(xmlData);
data.get();
(WeChatPayUtil.generateSign(xmlData, apiKey).equals(sign)) {
data.get();
(.equals(resultCode)) {
data.get();
}
;
} {
;
}
}
}
创建一个工具类 WeChatPayUtil,负责签名和 XML 解析。
import com.thoughtworks.xstream.XStream;
import java.security.MessageDigest;
import java.util.HashMap;
import java.util.Map;
import java.util.TreeMap;
public class WeChatPayUtil {
public static String generateSign(String xmlData, String apiKey) {
// 将 XML 转换为 Map
Map<String, String> data = parseXml(xmlData);
TreeMap<String, String> sortedMap = new TreeMap<>(data);
StringBuilder stringBuilder = new StringBuilder();
for (Map.Entry<String, String> entry : sortedMap.entrySet()) {
if (!entry.getKey().equals("sign") && entry.getValue() != null) {
stringBuilder.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
}
stringBuilder.append("key=").append(apiKey);
return md5(stringBuilder.toString()).toUpperCase();
}
public static String md5(String input) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
byte[] digest = md.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for ( b : digest) {
Integer.toHexString( & b);
(hex.length() == ) hexString.append();
hexString.append(hex);
}
hexString.toString();
} (Exception e) {
(e);
}
}
Map<String, String> {
();
xStream.alias(, HashMap.class);
(Map<String, String>) xStream.fromXML(xml);
}
}
https://yourdomain.com/wechat/notify)。商户参数主要包括微信支付的相关信息,这些信息可以在微信商户平台上获取。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online