微信支付
一、引入依赖
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-pay</artifactId>
</dependency>
二、统一下单接口
/** * 调用统一下单接口,并组装生成支付所需参数对象. * * @param request 统一下单请求参数 * @return 返回 {@link com.github.binarywang.wxpay.bean.order}包下的类对象 */ @PostMapping("/createOrder") @DSTransactional(rollbackFor = Exception.class) public R<WxPayMpOrderResult> createOrder(HttpServletRequest request, @RequestBody Map<String, String> payload) throws WxPayException { String ip = IpUtil.getIpAddr(request); String openId = payload.get("openId"); String totalFee = payload.get("totalFee"); String payMethod = payload.get("payMethod"); String userTransactionType = payload.getOrDefault("userTransactionType", "0"); String printerUsageOrderIds = payload.get("printerUsageOrderIds"); if (StringUtils.isEmpty(userTransactionType)) { return R.fail("交易类型不能为空"); } UserTransactionBo userTransactionBo = new UserTransactionBo(); userTransactionBo.setTotalFee(new BigDecimal(totalFee)); userTransactionBo.setTransactionTime(new Date()); userTransactionBo.setPayMethod(payMethod); userTransactionBo.setTransactedBy(LoginHelper.getUserId()); userTransactionBo.setUserTransactionType(userTransactionType); userTransactionBo.setPrinterUsageOrderIds(printerUsageOrderIds); userTransactionService.insertByBo(userTransactionBo); String body; switch (userTransactionType) { case "0": body = "余额充值"; break; case "1": body = "打印支付"; break; default: return R.fail("无效的交易类型"); } WxPayUnifiedOrderRequest wxPayUnifiedOrderRequest = new WxPayUnifiedOrderRequest(); wxPayUnifiedOrderRequest.setBody(body); wxPayUnifiedOrderRequest.setOutTradeNo(String.valueOf(userTransactionBo.getUserTransactionId())); wxPayUnifiedOrderRequest.setTotalFee(Integer.parseInt(totalFee)); wxPayUnifiedOrderRequest.setSpbillCreateIp(ip); wxPayUnifiedOrderRequest.setNotifyUrl("https://test.com/prod-api/pay/test/notify/order"); wxPayUnifiedOrderRequest.setTradeType("JSAPI"); wxPayUnifiedOrderRequest.setOpenid(openId); return R.ok("操作成功",wxService.createOrder(wxPayUnifiedOrderRequest)); }
三、小程序调起付款页面
async submit() { if(this.formData.totalFee<0.01) { uni.$u.toast('充值金额不能小于0.01'); } const res = await API.weXinPay.createOrder({ openId: store.getters.openid, totalFee: this.formData.totalFee * 100, payMethod: this.formData.payMethod }); wx.requestPayment({ timeStamp: res.data.timeStamp, nonceStr: res.data.nonceStr, package: res.data.packageValue, signType: 'MD5', paySign: res.data.paySign, success(res) { uni.$u.toast('充值成功'); uni.navigateBack(); console.log('支付成功', res); }, fail(err) { uni.$u.toast('充值失败'); uni.navigateBack(); console.error('支付失败', err); } }); }
四、支付回调处理
/** * 支付回调通知处理 */ @PostMapping("/notify/order") public String parseOrderNotifyResult(@RequestBody String xmlData) { log.info("开始解析微信支付回调结果: {}", xmlData); try { final WxPayOrderNotifyResult notifyResult = this.wxService.parseOrderNotifyResult(xmlData); String returnCode = notifyResult.getReturnCode(); if ("SUCCESS".equals(returnCode)) { log.info("微信支付回调结果成功: {}", notifyResult); try { userTransactionService.paySuccess(notifyResult.getOutTradeNo(), notifyResult.getTransactionId(), notifyResult.getXmlString()); return WxPayNotifyResponse.success("成功"); } catch (Exception e) { log.error("处理充值成功业务逻辑时发生异常: {}", e.getMessage(), e); userTransactionService.payFail(notifyResult.getOutTradeNo(), notifyResult.getTransactionId(), notifyResult.getXmlString()); return WxPayNotifyResponse.fail("处理充值成功业务逻辑时发生异常"); } } else { log.warn("微信支付回调结果失败: {}", notifyResult); userTransactionService.payFail(notifyResult.getOutTradeNo(), notifyResult.getTransactionId(), notifyResult.getXmlString()); return WxPayNotifyResponse.fail("失败"); } } catch (Exception e) { log.error("处理微信支付回调结果时发生异常: {}", e.getMessage(), e); return WxPayNotifyResponse.fail("处理回调结果异常"); } }

浙公网安备 33010602011771号