Java如何实现微信支付功能:深入理解createWxPayment方法


在如今数字化支付普及的背景下,微信支付已经成为众多企业和开发者的首选支付方式。本文将带大家详细解读如何通过Java实现微信支付,特别是通过 createWxPayment方法完成微信支付的创建和请求处理。

1. 初始化与支付记录管理

首先,createWxPayment方法的核心任务是生成并发起一笔微信支付。方法的第一部分是检查并管理支付记录:

//1 添加支付记录到支付表里面
LambdaQueryWrapper<PaymentInfo> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(PaymentInfo::getOrderNo, paymentInfoForm.getOrderNo());
PaymentInfo paymentInfo = paymentInfoMapper.selectOne(wrapper);
if (paymentInfo == null) {
    paymentInfo = new PaymentInfo();
    BeanUtils.copyProperties(paymentInfoForm, paymentInfo);
    paymentInfo.setPaymentStatus(0);
    paymentInfoMapper.insert(paymentInfo);
}

在这段代码中,我们首先查询数据库,检查是否已经存在与当前订单号匹配的支付记录。如果没有记录存在,则创建一条新的支付记录,并将其插入数据库中。这一过程确保了每笔支付都有唯一的记录,并且避免了重复支付的风险。

2. 构建微信支付对象

接下来,我们需要构建一个用于微信支付的服务对象:

JsapiServiceExtension service = 
        new JsapiServiceExtension.Builder().config(rsaAutoCertificateConfig).build();

通过构建JsapiServiceExtension对象,我们为后续的微信支付请求做好了准备。这个对象包含了所有与微信支付通信所需的配置参数,比如RSA证书配置等。

3. 封装支付请求参数

微信支付请求的参数设置非常关键,它直接决定了支付请求的成败。下面的代码展示了如何封装这些参数:

PrepayRequest request = new PrepayRequest();
Amount amount = new Amount();
amount.setTotal(paymentInfoForm.getAmount().multiply(new BigDecimal(100)).intValue());
request.setAmount(amount);
request.setAppid(wxPayV3Properties.getAppid());
request.setMchid(wxPayV3Properties.getMerchantId());

String description = paymentInfo.getContent();
if (description.length() > 127) {
    description = description.substring(0, 127);
}
request.setDescription(description);
request.setNotifyUrl(wxPayV3Properties.getNotifyUrl());
request.setOutTradeNo(paymentInfo.getOrderNo());

在这部分代码中,我们将支付金额、商户ID、订单号等信息封装到PrepayRequest对象中,并确保了描述信息不超过微信支付API的长度限制。同时,我们设置了回调通知URL,以便微信支付在交易完成后通知我们的系统。

4. 用户信息与分账设置

除了基本的支付信息外,我们还需要处理用户信息和分账设置:

Payer payer = new Payer();
payer.setOpenid(paymentInfoForm.getCustomerOpenId());
request.setPayer(payer);

SettleInfo settleInfo = new SettleInfo();
settleInfo.setProfitSharing(true);
request.setSettleInfo(settleInfo);

通过设置Payer对象的Openid,我们确保支付能够正确关联到对应的用户。此外,分账设置允许我们在支付完成后,将资金按照预定比例分配给不同的收款方。

5. 发起微信支付请求与处理响应

最后,我们通过以下代码发起微信支付请求,并处理返回的响应数据:

PrepayWithRequestPaymentResponse response = service.prepayWithRequestPayment(request);

WxPrepayVo wxPrepayVo = new WxPrepayVo();
BeanUtils.copyProperties(response, wxPrepayVo);
wxPrepayVo.setTimeStamp(response.getTimeStamp());
return wxPrepayVo;

这段代码中,我们调用prepayWithRequestPayment方法发起支付请求,并将微信返回的响应数据封装到WxPrepayVo对象中,供前端调用使用。该对象包含了发起支付所需的各类信息,比如时间戳、支付签名等。

6. 异常处理

为了保证系统的稳定性,我们使用try-catch来捕获并处理可能的异常:

catch (Exception e) {
    throw new GuiguException(ResultCodeEnum.DATA_ERROR);
}

如果在支付过程中发生了异常,我们将抛出自定义的GuiguException异常,并返回一个通用的错误代码DATA_ERROR,让上层系统可以进行适当的错误处理。

总结

通过以上代码,我们成功实现了微信支付的创建和发起,确保了整个支付过程的准确性和安全性。无论是支付记录的管理还是支付请求参数的封装,createWxPayment方法都展现了良好的结构和逻辑性。

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值