Java实现微信支付功能

第一步,在配置文件添加微信配置

 第二步创建配置类

@Configuration
public class WxConfig {
    @Autowired
    private WxPayConfigs properties;
    @Bean
    public WxMaConfig wxMaConfig() {
        WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
        config.setAppid(properties.getAppId());
        config.setSecret(properties.getAppSecret());
        return config;
    }


    @Bean
    public WxMaService wxMaService(WxMaConfig maConfig) {
        WxMaService service = new WxMaServiceImpl();
        service.setWxMaConfig(maConfig);
        return service;
    }


    @Bean
    public WxMaService wxMaService() {
        WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl();
        wxMaConfig.setAppid(this.properties.getAppId());
        wxMaConfig.setSecret(this.properties.getAppSecret());
        WxMaService wxMaService = new WxMaServiceImpl();
        wxMaService.setWxMaConfig(wxMaConfig);
        return wxMaService;
    }


    @Bean
    public WxPayService wxPayService() {
        WxPayConfig payConfig = new WxPayConfig();
        payConfig.setAppId(properties.getAppId());
        payConfig.setMchId(properties.getMchId());
        payConfig.setMchKey(properties.getMchKey());
        payConfig.setNotifyUrl(properties.getNotifyUrl());
        payConfig.setKeyPath(properties.getKeyPath());
        payConfig.setSignType("MD5");
        WxPayService wxPayService = new WxPayServiceImpl();
        wxPayService.setConfig(payConfig);
        return wxPayService;
    }

}

第三步,创建实体类

@Data
@Configuration
@ConfigurationProperties("wx")
public class WxPayConfigs {


    private String appId;


    private String appSecret;


    private String mchId;


    private String mchKey;


    private String notifyUrl;


    private String keyPath;

    private String refundUrl;


}

第四步,实现微信支付

分两步,支付接口和支付成功和失败的回调接口

支付接口是提供给前端调用的,回调接口是我们自己回调的

支付接口实现层

    public AppCommonModel h5pay(Long orderId, HttpServletRequest request) {
        AssistOrder assistOrder = assistOrderService.getById(orderId);
        if (assistOrder == null) {
            return AppResponseUtil.fail("订单不存在");
        }
        if (!assistOrder.getOrderStatus().equals(0)) {
            return AppResponseUtil.fail("已支付");
        }
        Customer customer = customerService.getById(tokenService.getLoginUser().getUserId());
        if (customer == null) {
            return AppResponseUtil.fail("用户信息不存在");
        }

        //微信支付
        String mId = customer.getWxOpenid();
        if (mId == null && mId == "") {
            return AppResponseUtil.fail("用戶信息获取失败");
        }
        WxPayMpOrderResult result = null;//JSAPI
        try {
            WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
            orderRequest.setOpenid(用户的openId);
            orderRequest.setOutTradeNo(订单的sn);
            orderRequest.setTradeType("JSAPI");
            orderRequest.setBody(写个名字);
            orderRequest.setNotifyUrl(你的回调接口路径);
            orderRequest.setTotalFee(金额);   
            orderRequest.setSpbillCreateIp(获取ip);
            orderRequest.setFeeType("CNY");
            result = wxPayService.createOrder(orderRequest);

        } catch (Exception e) {
            e.printStackTrace();
            return AppResponseUtil.fail("支付失败");
        }

        return AppResponseUtil.success(result);
    }

只要代码块在try catch,其余根据自己的业务需求修改

ps:金额要把元转化成分

回调接口

@Transactional
    public Object payNotify(HttpServletRequest request, HttpServletResponse response) {
        logger.info("request"+request);
        String xmlResult = null;
        try {
            logger.info("request.getInputStream()"+request.getInputStream());
            logger.info("request.getCharacterEncoding()"+request.getCharacterEncoding());
            xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
            logger.info("wx huiDiao  "+xmlResult);
        } catch (IOException e) {
            e.printStackTrace();
            logger.info("logger.info(\"wx huiDiao  \"+xmlResult);"+e.getMessage());
            return WxPayNotifyResponse.fail(e.getMessage());
        }

        WxPayOrderNotifyResult result = null;
        try {
            result = wxPayService.parseOrderNotifyResult(xmlResult);

            if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getResultCode())) {
                logger.error(xmlResult);
                throw new WxPayException("微信通知支付失败!");
            }
            if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getReturnCode())) {
                logger.error(xmlResult);
                throw new WxPayException("微信通知支付失败!");
            }
        } catch (WxPayException e) {
            e.printStackTrace();
            logger.info("WxPayNotifyResponse.fail(e.getMessage());"+e.getMessage());
            return WxPayNotifyResponse.fail(e.getMessage());
        }

        logger.info("处理腾讯支付平台的订单支付");
        logger.info(String.valueOf(result));

        String orderSn = result.getOutTradeNo();
        String payId = result.getTransactionId();


        AssistOrder chargingOrder = assistOrderService.getOne(new QueryWrapper<AssistOrder>().eq("order_sn",orderSn));

        if (chargingOrder == null) {
            return WxPayNotifyResponse.fail("订单不存在 sn=" + orderSn);
        }

        // 检查这个订单是否已经处理过
        if (chargingOrder.getOrderStatus() != 0) {
            return WxPayNotifyResponse.success("订单已经处理成功!");
        }

        // 检查支付订单金额
        if (!result.getTotalFee().equals(priceTools.toFen(chargingOrder.getOrderPrice()))) {
            return WxPayNotifyResponse.fail(chargingOrder.getOrderSn() + " : 支付金额不符合 totalFee=" + BaseWxPayResult.fenToYuan(result.getTotalFee()));
        }
        chargingOrder.setPayId(payId);
        chargingOrder.setPayTime(LocalDateTime.now());
        //修改支付狀態
        chargingOrder.setPayStatue(1);
        chargingOrder.setActualPrice(chargingOrder.getOrderPrice());
        Activity activity = activityService.getById(chargingOrder.getActivityId());
        activity.setStatus("0");
        try {
            activityService.updateById(activity);
            assistOrderService.updateById(chargingOrder);
        } catch (Exception e) {
            return WxPayNotifyResponse.fail("更新数据已失效");
        }
        logger.info("支付成功");
        AccountHistory accountHistory = new AccountHistory();
        accountHistory.setCusId(chargingOrder.getCustomerId());
        accountHistory.setType("0");
        accountHistory.setPrice(chargingOrder.getOrderPrice());
        accountHistory.setBalancePrice(customerAccountService.getOne(new QueryWrapper<CustomerAccount>().select("balance_amount").eq("customer_id", chargingOrder.getCustomerId())).getBalanceAmount());
        accountHistory.setContent(activityService.getOne(new QueryWrapper<Activity>().select("title").eq("id", chargingOrder.getActivityId())).getTitle());
        accountHistory.setCreateTime(LocalDateTime.now());
        accountHistoryService.save(accountHistory);

        return WxPayNotifyResponse.success("处理成功!");
    }

同样的,后半部分根据自己的业务需求修改

第五步申请退款

 public Object refund(Long orderId,BigDecimal money) {
        AssistOrder chargingOrder = assistOrderService.getById(orderId);
        if (chargingOrder == null) {
            throw new ServiceException(UserExceptionEnum.ORFER_EXCEPTION);
        }

        // 设置订单申请退款状态,更新订单
        chargingOrder.setRefundContent(UUID.randomUUID().toString());
        WxPayRefundRequest refundInfo=new WxPayRefundRequest();
        if (StringUtils.isBlank(chargingOrder.getOrderSn())) {
            throw new ServiceException(UserExceptionEnum.BUSINESS_OPERATE_EXCEPTION);
        }
        String dateTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        refundInfo.setOutTradeNo(chargingOrder.getOrderSn());
        refundInfo.setOutRefundNo(dateTime + "-" + RandomStringUtils.randomAlphanumeric(5));
        refundInfo.setTotalFee(priceTools.toFen(chargingOrder.getOrderPrice()));
        refundInfo.setRefundFee(priceTools.toFen(money));
        refundInfo.setNotifyUrl(回调的路径)
        refundInfo.setOpUserId(wxPayConfigs.getMchId());
        refundInfo.setRefundDesc("需求退款: " + money + "元");
        WxPayRefundResult wxPayRefundResult;
        try {
            wxPayRefundResult = wxPayService.refund(refundInfo);
            //判断退款信息是否正确
            if ("SUCCESS".equals(wxPayRefundResult.getReturnCode())
                    && "SUCCESS".equals(wxPayRefundResult.getResultCode())) {
                /**
                 * 系统内部业务逻辑
                 */
            }
        } catch (WxPayException e) {
            logger.error("微信退款接口错误信息= {}", e);
            throw new ServiceException(UserExceptionEnum.BUSINESS_OPERATE_EXCEPTION);
        }
        CustomerAccount customerAccount = customerAccountService.getOne(new QueryWrapper<CustomerAccount>().eq("customer_id", chargingOrder.getCustomerId()));
        customerAccount.setContent("微信退款");
        accountHistoryService.add(customerAccount, "3", money);
        return AppResponseUtil.success();
    }

有错误,希望大佬们指出,不要喷我,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值