微信支付

一、引入依赖

        <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("处理回调结果异常");
        }
    }

 

posted @ 2024-07-23 11:08  CV。。。  阅读(49)  评论(0)    收藏  举报