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();
    }

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

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 Java实现微信支付需要使用微信支付 SDK。您可以在微信支付官方网站上下载最新版本的 SDK,并在您的 Java 项目中使用它。 使用微信支付 SDK 的具体步骤如下: 1. 注册微信支付商户并获取商户 ID 和密钥。 2. 下载并导入微信支付 SDK。 3. 创建支付订单并获取支付二维码。 4. 使用扫码支付或者 JSAPI 支付接口调用微信支付。 5. 接收微信支付的异步通知并进行订单状态的更新。 有关微信支付的更多信息,您可以参考微信支付官方文档:https://pay.weixin.qq.com/wiki/doc/api/index.html 希望这些信息对您有帮助! ### 回答2: 要实现微信支付功能,可以使用Java编程语言结合微信支付开放平台提供的API来实现。 首先,需要在微信支付开放平台注册并创建一个应用,获取到应用的AppID、商户号、AppSecret等信息。 接下来,在Java项目中引入微信支付SDK,可以使用第三方库,如"wechatpay-api"来简化开发流程。然后,通过使用SDK提供的相关方法,可以实现以下功能: 1. 获取access_token:通过获取 access_token 接口,获取微信支付接口调用凭证,用于后续接口调用的身份验证。 2. 统一下单:使用统一下单接口,将用户提交的支付信息传给微信支付平台,生成预支付订单,并返回预付款二维码链接或者支付ID。 3. 生成支付链接或二维码:将预付款二维码链接或支付ID返回给前端,通过生成支付链接或者二维码的方式,提供给用户进行支付。 4. 微信支付回调:在用户支付成功后,微信支付平台会异步调用开发者设置的支付结果通知地址,向该地址发送支付结果信息。开发者需要在接收到回调时,验证回调的合法性,并及时处理支付结果。 5. 查询订单状态:通过订单查询接口,可以查询用户支付订单的当前状态,如支付成功、支付失败等。 6. 退款:使用退款接口,可以实现订单退款操作,退还用户支付的金额。 以上是使用Java实现微信支付的基本步骤。在具体实现过程中,还需注意接口调用的参数传递、异常处理、数据加密等问题。为确保支付安全,建议使用HTTPS协议进行数据传输,并加强对接口的签名验证。 ### 回答3: Java 实现微信支付可以通过微信支付开放平台提供的开发工具包来完成。首先,需要在微信支付开放平台注册一个开发者账号,并创建一个应用获取对应的应用ID和应用密钥。 接下来,可以使用Java语言进行开发。首先,需要引入微信支付Java SDK,例如官方提供的weixin-java-pay SDK。通过在项目的pom.xml文件中添加相关依赖,即可将SDK集成到项目中。 然后,通过在代码中进行配置,将应用ID和应用密钥等信息设置到SDK中。可以使用SDK提供的配置类进行设置,例如WxPayConfig。 接下来,可以使用SDK提供的API进行微信支付的相关操作。例如,使用SDK提供的统一下单API可以生成一个支付链接,通过该链接用户可以进行支付操作。可以通过创建对应的请求对象,并调用SDK提供的发送请求的方法来实现。 支付结果通知可以使用SDK提供的回调接口来处理,当支付完成后,微信支付平台会向预先设置的回调URL发送通知。可以在代码中编写对应的处理逻辑,接收并解析微信支付平台发送的通知,校验数据的正确性,并进行相应的业务处理。 最后,可以使用SDK提供的查询订单API来查询订单的支付结果。可以根据订单号或其他查询条件,调用SDK提供的查询订单接口来获取订单的最新支付状态。 通过以上步骤,就可以使用Java实现微信支付功能。需要注意的是,开发过程中需要仔细阅读微信支付开放平台提供的文档和SDK的使用指南,并按照实际需求进行相关配置和操作。同时,为了确保支付过程的安全性,建议使用SSL证书进行加密传输。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值