Spring Boot对接微信支付开发教程

步骤一:注册微信商户平台账号

在进行微信支付开发前,您需要先注册一个微信商户平台账号。具体步骤如下:

  1. 登录微信支付官网(https://pay.weixin.qq.com/)。
  2. 点击“商户中心”->“商户入驻”->“立即入驻”进行注册。
  3. 根据提示填写公司信息并上传相关证件,完成企业认证。
  4. 等待微信支付审核,审核通过后您就可以获取到微信支付的API密钥等信息。

步骤二:创建Spring Boot项目

在开始开发之前,我们需要先创建一个Spring Boot项目。您可以使用IDE(如IntelliJ IDEA)创建一个Spring Boot项目,也可以使用Spring Initializr(https://start.spring.io/)来创建一个简单的Spring Boot项目。

下面是使用Spring Initializr创建项目的步骤:

  1. 打开Spring Initializr网站(https://start.spring.io/)。
  2. 选择“Maven Project”或“Gradle Project”。
  3. 输入项目的基本信息,例如项目名称、描述、包名、Java版本等。
  4. 在“Dependencies”选项卡中搜索并添加“Spring Web”和“Thymeleaf”依赖。
  5. 点击“Generate”按钮,下载并解压生成的项目压缩包。

步骤三:添加微信支付SDK依赖

在创建好的Spring Boot项目中,我们需要添加微信支付SDK的依赖。您可以在GitHub上找到官方的微信支付SDK(https://github.com/wechatpay-apiv3/wechatpay-java),也可以使用Maven或Gradle将SDK引入项目。

以下是在pom.xml中添加微信支付SDK依赖的示例代码:

xmlCopy code
<dependency>
    <groupId>com.github.wechatpay-apiv3</groupId>
    <artifactId>wechatpay-java</artifactId>
    <version>3.0.10</version>
</dependency>

步骤四:配置微信支付信息

在进行微信支付开发前,我们需要先配置微信支付的相关信息,例如APPID、商户号、API密钥等。

以下是一个示例的application.properties文件,您可以将其放在项目的resources目录下:

propertiesCopy code
# 微信支付相关配置
wechatpay.appId=您的APPID
wechatpay.mchId=您的商户号
wechatpay.apiKey=您的API密钥
wechatpay.certPath=您的证书路径
wechatpay.certPassword=您的证书密码

步骤五:创建微信支付Controller

下面我们开始创建一个微信支付Controller,用于处理用户请求并返回支付结果。

以下是一个示例的微信支付Controller代码:

javaCopy code
@RestController 
@RequestMapping("/wechat/pay") 
public class WechatPayController {     
@Autowired 
private WechatPayService wechatPayService;     
@PostMapping("/unifiedOrder") 
public Map<String, String> unifiedOrder(@RequestBody UnifiedOrderRequest request) {
    return wechatPayService.unifiedOrder(request);
}

@PostMapping("/notify")
public String notify(@RequestBody String requestBody) {
    return wechatPayService.handleNotify(requestBody);
}
}

在上面的代码中,我们定义了两个接口:/wechat/pay/unifiedOrder用于下单请求,/wechat/pay/notify用于接收微信支付通知。我们将具体的业务逻辑放在了WechatPayService中,下面我们将实现这个服务类。

步骤六:实现WechatPayService

我们需要在WechatPayService类中实现以下两个方法:

unifiedOrder:创建预支付订单并返回支付结果。

handleNotify:处理微信支付通知并返回结果。 以下是`WechatPayService`类的示例代码:

@Service
public class WechatPayService {
    @Value("${wechatpay.appId}")
    private String appId;

    @Value("${wechatpay.mchId}")
    private String mchId;

    @Value("${wechatpay.apiKey}")
    private String apiKey;

    @Value("${wechatpay.certPath}")
    private String certPath;

    @Value("${wechatpay.certPassword}")
    private String certPassword;

    private final static String NOTIFY_URL = "http://your.domain.com/wechat/pay/notify";

    private final WechatPayClient wechatPayClient = new WechatPayBuilder()
            .withMerchant(mchId, apiKey)
            .withValidator(new WechatPay2Validator(new WechatPay2Credentials(mchId, certPath, certPassword)))
            .build();

    public Map<String, String> unifiedOrder(UnifiedOrderRequest request) {
        String outTradeNo = request.getOutTradeNo();
        String body = request.getBody();
        int totalFee = request.getTotalFee();
        String clientIp = request.getSpbillCreateIp();

        // 构造请求体
        WechatPayUnifiedOrderRequest wechatPayRequest = new WechatPayUnifiedOrderRequest();
        wechatPayRequest.setAppid(appId);
        wechatPayRequest.setMchid(mchId);
        wechatPayRequest.setBody(body);
        wechatPayRequest.setOutTradeNo(outTradeNo);
        wechatPayRequest.setTotalFee(totalFee);
        wechatPayRequest.setSpbillCreateIp(clientIp);
        wechatPayRequest.setNotifyUrl(NOTIFY_URL);
        wechatPayRequest.setTradeType("JSAPI");
        wechatPayRequest.setAttach("test");

        // 发送请求
        WechatPayUnifiedOrderResult result = wechatPayClient.unifiedOrder(wechatPayRequest);

        // 构造返回结果
        Map<String, String> resultMap = new HashMap<>();
        resultMap.put("appId", result.getAppId());
        resultMap.put("timeStamp", String.valueOf(System.currentTimeMillis() / 1000));
        resultMap.put("nonceStr", UUID.randomUUID().toString().replaceAll("-", ""));
        resultMap.put("package", "prepay_id=" + result.getPrepayId());
        resultMap.put("signType", "HMAC-SHA256");

        String sign = wechatPayClient.createSignature(resultMap);
        resultMap.put("paySign", sign);

        return resultMap;
    }

    public String handleNotify(String requestBody) {
        WechatPay2Credentials credentials = new WechatPay2Credentials(mchId, certPath, certPassword);
        WechatPay2Validator validator = new WechatPay2Validator(credentials);
      WechatPayNotifyResult notifyResult = wechatPayClient.parseNotifyResult(requestBody);
    if (!validator.validate(notifyResult)) {
        return "fail";
    }

    // 处理业务逻辑
    String outTradeNo = notifyResult.getOutTradeNo();
    String transactionId = notifyResult.getTransactionId();
    int totalFee = notifyResult.getTotalFee();

    // 更新订单状态
    // ...

    return "success";
}
}

在上面的代码中,我们使用WechatPayBuilder构建了一个WechatPayClient,它用于和微信支付接口进行交互。 在`unifiedOrder`方法中,我们首先构造了一个WechatPayUnifiedOrderRequest对象,并设置了必要的参数,然后通过wechatPayClient.unifiedOrder()方法发送请求并获取响应。

最后,我们构造了一个返回结果,其中包括了必要的参数,如`appId`、`timeStamp`、`nonceStr`、`package`和`paySign`等,这些参数将被用于前端调起微信支付。在这里,我们使用了wechatPayClient.createSignature()方法来生成签名。 在handleNotify方法中,我们首先使用wechatPayClient.parseNotifyResult()方法来解析微信支付通知,然后使用validator.validate()方法验证通知的签名是否正确。如果签名验证不通过,我们返回fail表示处理失败,否则我们根据业务逻辑处理后返回success表示处理成功。

步骤七:测试

现在,我们已经完成了对接微信支付的所有代码实现,接下来我们需要对代码进行测试。 我们可以使用Postman等工具来模拟发送请求,下面是一个示例请求:

{
    "body": "测试商品",
    "outTradeNo": "202302210001",
    "totalFee": 1,
    "spbillCreateIp": "127.0.0.1",
    "openid": "oNQxQ5ZGXnhbE11oeHcKawb_E1gM"
}

其中,openid表示用户的openid,它可以通过微信授权获得。

发送请求后,我们将会得到如下响应:

{
    "appId": "wxXXXXXXXXXXXXXXXX",
    "timeStamp": "1645459113",
    "nonceStr": "a725ba82a6e64942ac9b9926d872db27",
    "package": "prepay_id=wxXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "signType": "HMAC-SHA256",
    "paySign": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

这些参数将会被用于前端调起微信支付。

  • 9
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值