在Spring Boot项目中接入微信支付,可以使用`weixin-java-pay`库来简化开发流程

在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项目中成功接入微信支付功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

典龙330

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值