赞
踩
第一步,在配置文件添加微信配置
第二步创建配置类
- @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();
- }

有错误,希望大佬们指出,不要喷我,谢谢!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。