在Spring Boot项目中接入微信支付,可以使用`weixin-java-pay`库来简化开发流程。`weixin-java-pay`是一个基于微信支付API的Java SDK,提供了支付、退款、查询等功能的封装。
以下是实现微信支付的基本步骤:
### 1. 添加依赖
首先,在`pom.xml`中添加`weixin-java-pay`的依赖:
```xml
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
<version>4.1.0</version>
</dependency>
```
### 2. 配置微信支付参数
在`application.properties`或`application.yml`中配置微信支付的相关参数:
```properties
# 微信支付配置
wxpay.appId=your_app_id
wxpay.mchId=your_mch_id
wxpay.mchKey=your_mch_key
wxpay.keyPath=classpath:/cert/apiclient_cert.p12
wxpay.notifyUrl=https://yourdomain.com/notify
```
### 3. 创建配置类
创建一个配置类来加载微信支付的配置,并初始化`WxPayService`:
```java
import com.github.binarywang.wxpay.config.WxPayConfig;
import com.github.binarywang.wxpay.service.WxPayService;
import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class WxPayConfiguration {
@Value("${wxpay.appId}")
private String appId;
@Value("${wxpay.mchId}")
private String mchId;
@Value("${wxpay.mchKey}")
private String mchKey;
@Value("${wxpay.keyPath}")
private String keyPath;
@Value("${wxpay.notifyUrl}")
private String notifyUrl;
@Bean
public WxPayConfig wxPayConfig() {
WxPayConfig payConfig = new WxPayConfig();
payConfig.setAppId(appId);
payConfig.setMchId(mchId);
payConfig.setMchKey(mchKey);
payConfig.setKeyPath(keyPath);
payConfig.setNotifyUrl(notifyUrl);
return payConfig;
}
@Bean
public WxPayService wxPayService(WxPayConfig wxPayConfig) {
WxPayService wxPayService = new WxPayServiceImpl();
wxPayService.setConfig(wxPayConfig);
return wxPayService;
}
}
```
### 4. 实现支付接口
在Controller中实现支付接口,生成支付订单并返回支付参数:
```java
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/pay")
public class WxPayController {
@Autowired
private WxPayService wxPayService;
@PostMapping("/createOrder")
public String createOrder() throws WxPayException {
WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
request.setBody("测试商品");
request.setOutTradeNo("1234567890");
request.setTotalFee(1); // 单位:分
request.setSpbillCreateIp("127.0.0.1");
request.setNotifyUrl("https://yourdomain.com/notify");
request.setTradeType("JSAPI");
request.setOpenid("用户的openid");
WxPayUnifiedOrderResult result = wxPayService.unifiedOrder(request);
return result.getPrepayId();
}
}
```
### 5. 处理支付回调
实现一个回调接口,用于接收微信支付的异步通知:
```java
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayOrderQueryRequest;
import com.github.binarywang.wxpay.bean.result.WxPayOrderQueryResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/notify")
public class WxPayNotifyController {
@Autowired
private WxPayService wxPayService;
@PostMapping("/payNotify")
public String payNotify(@RequestBody String xmlData) throws WxPayException {
WxPayOrderNotifyResult notifyResult = wxPayService.parseOrderNotifyResult(xmlData);
// 处理业务逻辑,例如更新订单状态
String outTradeNo = notifyResult.getOutTradeNo();
WxPayOrderQueryRequest queryRequest = new WxPayOrderQueryRequest();
queryRequest.setOutTradeNo(outTradeNo);
WxPayOrderQueryResult queryResult = wxPayService.queryOrder(queryRequest);
// 返回成功响应
return "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
}
}
```
### 6. 前端调用支付
在前端页面中,使用微信JS-SDK调起支付:
```javascript
function onBridgeReady() {
WeixinJSBridge.invoke(
'getBrandWCPayRequest', {
"appId": "your_app_id",
"timeStamp": "1414561699",
"nonceStr": "e61463f8efa94090b1f366cccfbbb444",
"package": "prepay_id=wx201410272009395522657a690389285100",
"signType": "MD5",
"paySign": "841C9BEB1086ED919067222321D06A8D"
},
function(res) {
if (res.err_msg == "get_brand_wcpay_request:ok") {
// 支付成功
} else {
// 支付失败
}
}
);
}
if (typeof WeixinJSBridge == "undefined") {
if (document.addEventListener) {
document.addEventListener('WeixinJSBridgeReady', onBridgeReady, false);
} else if (document.attachEvent) {
document.attachEvent('WeixinJSBridgeReady', onBridgeReady);
document.attachEvent('onWeixinJSBridgeReady', onBridgeReady);
}
} else {
onBridgeReady();
}
```
### 7. 测试与部署
完成上述步骤后,启动Spring Boot项目,测试支付流程是否正常。确保回调地址能够正确接收微信支付的异步通知。
### 8. 注意事项
- **证书配置**:微信支付需要配置商户证书,确保`keyPath`指向正确的证书路径。
- **安全性**:确保支付接口和回调接口的安全性,防止恶意请求。
- **错误处理**:在支付过程中,处理可能的异常情况,如网络超时、支付失败等。
通过以上步骤,你可以在Spring Boot项目中成功接入微信支付功能。