在如今数字化支付普及的背景下,微信支付已经成为众多企业和开发者的首选支付方式。本文将带大家详细解读如何通过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
方法都展现了良好的结构和逻辑性。