当前位置:   article > 正文

Java实现微信支付功能_java微信支付

java微信支付

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

 第二步创建配置类

  1. @Configuration
  2. public class WxConfig {
  3. @Autowired
  4. private WxPayConfigs properties;
  5. @Bean
  6. public WxMaConfig wxMaConfig() {
  7. WxMaDefaultConfigImpl config = new WxMaDefaultConfigImpl();
  8. config.setAppid(properties.getAppId());
  9. config.setSecret(properties.getAppSecret());
  10. return config;
  11. }
  12. @Bean
  13. public WxMaService wxMaService(WxMaConfig maConfig) {
  14. WxMaService service = new WxMaServiceImpl();
  15. service.setWxMaConfig(maConfig);
  16. return service;
  17. }
  18. @Bean
  19. public WxMaService wxMaService() {
  20. WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl();
  21. wxMaConfig.setAppid(this.properties.getAppId());
  22. wxMaConfig.setSecret(this.properties.getAppSecret());
  23. WxMaService wxMaService = new WxMaServiceImpl();
  24. wxMaService.setWxMaConfig(wxMaConfig);
  25. return wxMaService;
  26. }
  27. @Bean
  28. public WxPayService wxPayService() {
  29. WxPayConfig payConfig = new WxPayConfig();
  30. payConfig.setAppId(properties.getAppId());
  31. payConfig.setMchId(properties.getMchId());
  32. payConfig.setMchKey(properties.getMchKey());
  33. payConfig.setNotifyUrl(properties.getNotifyUrl());
  34. payConfig.setKeyPath(properties.getKeyPath());
  35. payConfig.setSignType("MD5");
  36. WxPayService wxPayService = new WxPayServiceImpl();
  37. wxPayService.setConfig(payConfig);
  38. return wxPayService;
  39. }
  40. }

第三步,创建实体类

  1. @Data
  2. @Configuration
  3. @ConfigurationProperties("wx")
  4. public class WxPayConfigs {
  5. private String appId;
  6. private String appSecret;
  7. private String mchId;
  8. private String mchKey;
  9. private String notifyUrl;
  10. private String keyPath;
  11. private String refundUrl;
  12. }

第四步,实现微信支付

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

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

支付接口实现层

  1. public AppCommonModel h5pay(Long orderId, HttpServletRequest request) {
  2. AssistOrder assistOrder = assistOrderService.getById(orderId);
  3. if (assistOrder == null) {
  4. return AppResponseUtil.fail("订单不存在");
  5. }
  6. if (!assistOrder.getOrderStatus().equals(0)) {
  7. return AppResponseUtil.fail("已支付");
  8. }
  9. Customer customer = customerService.getById(tokenService.getLoginUser().getUserId());
  10. if (customer == null) {
  11. return AppResponseUtil.fail("用户信息不存在");
  12. }
  13. //微信支付
  14. String mId = customer.getWxOpenid();
  15. if (mId == null && mId == "") {
  16. return AppResponseUtil.fail("用戶信息获取失败");
  17. }
  18. WxPayMpOrderResult result = null;//JSAPI
  19. try {
  20. WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
  21. orderRequest.setOpenid(用户的openId);
  22. orderRequest.setOutTradeNo(订单的sn);
  23. orderRequest.setTradeType("JSAPI");
  24. orderRequest.setBody(写个名字);
  25. orderRequest.setNotifyUrl(你的回调接口路径);
  26. orderRequest.setTotalFee(金额);
  27. orderRequest.setSpbillCreateIp(获取ip);
  28. orderRequest.setFeeType("CNY");
  29. result = wxPayService.createOrder(orderRequest);
  30. } catch (Exception e) {
  31. e.printStackTrace();
  32. return AppResponseUtil.fail("支付失败");
  33. }
  34. return AppResponseUtil.success(result);
  35. }

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

ps:金额要把元转化成分

回调接口

  1. @Transactional
  2. public Object payNotify(HttpServletRequest request, HttpServletResponse response) {
  3. logger.info("request"+request);
  4. String xmlResult = null;
  5. try {
  6. logger.info("request.getInputStream()"+request.getInputStream());
  7. logger.info("request.getCharacterEncoding()"+request.getCharacterEncoding());
  8. xmlResult = IOUtils.toString(request.getInputStream(), request.getCharacterEncoding());
  9. logger.info("wx huiDiao "+xmlResult);
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. logger.info("logger.info(\"wx huiDiao \"+xmlResult);"+e.getMessage());
  13. return WxPayNotifyResponse.fail(e.getMessage());
  14. }
  15. WxPayOrderNotifyResult result = null;
  16. try {
  17. result = wxPayService.parseOrderNotifyResult(xmlResult);
  18. if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getResultCode())) {
  19. logger.error(xmlResult);
  20. throw new WxPayException("微信通知支付失败!");
  21. }
  22. if (!WxPayConstants.ResultCode.SUCCESS.equals(result.getReturnCode())) {
  23. logger.error(xmlResult);
  24. throw new WxPayException("微信通知支付失败!");
  25. }
  26. } catch (WxPayException e) {
  27. e.printStackTrace();
  28. logger.info("WxPayNotifyResponse.fail(e.getMessage());"+e.getMessage());
  29. return WxPayNotifyResponse.fail(e.getMessage());
  30. }
  31. logger.info("处理腾讯支付平台的订单支付");
  32. logger.info(String.valueOf(result));
  33. String orderSn = result.getOutTradeNo();
  34. String payId = result.getTransactionId();
  35. AssistOrder chargingOrder = assistOrderService.getOne(new QueryWrapper<AssistOrder>().eq("order_sn",orderSn));
  36. if (chargingOrder == null) {
  37. return WxPayNotifyResponse.fail("订单不存在 sn=" + orderSn);
  38. }
  39. // 检查这个订单是否已经处理过
  40. if (chargingOrder.getOrderStatus() != 0) {
  41. return WxPayNotifyResponse.success("订单已经处理成功!");
  42. }
  43. // 检查支付订单金额
  44. if (!result.getTotalFee().equals(priceTools.toFen(chargingOrder.getOrderPrice()))) {
  45. return WxPayNotifyResponse.fail(chargingOrder.getOrderSn() + " : 支付金额不符合 totalFee=" + BaseWxPayResult.fenToYuan(result.getTotalFee()));
  46. }
  47. chargingOrder.setPayId(payId);
  48. chargingOrder.setPayTime(LocalDateTime.now());
  49. //修改支付狀態
  50. chargingOrder.setPayStatue(1);
  51. chargingOrder.setActualPrice(chargingOrder.getOrderPrice());
  52. Activity activity = activityService.getById(chargingOrder.getActivityId());
  53. activity.setStatus("0");
  54. try {
  55. activityService.updateById(activity);
  56. assistOrderService.updateById(chargingOrder);
  57. } catch (Exception e) {
  58. return WxPayNotifyResponse.fail("更新数据已失效");
  59. }
  60. logger.info("支付成功");
  61. AccountHistory accountHistory = new AccountHistory();
  62. accountHistory.setCusId(chargingOrder.getCustomerId());
  63. accountHistory.setType("0");
  64. accountHistory.setPrice(chargingOrder.getOrderPrice());
  65. accountHistory.setBalancePrice(customerAccountService.getOne(new QueryWrapper<CustomerAccount>().select("balance_amount").eq("customer_id", chargingOrder.getCustomerId())).getBalanceAmount());
  66. accountHistory.setContent(activityService.getOne(new QueryWrapper<Activity>().select("title").eq("id", chargingOrder.getActivityId())).getTitle());
  67. accountHistory.setCreateTime(LocalDateTime.now());
  68. accountHistoryService.save(accountHistory);
  69. return WxPayNotifyResponse.success("处理成功!");
  70. }

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

第五步申请退款

  1. public Object refund(Long orderId,BigDecimal money) {
  2. AssistOrder chargingOrder = assistOrderService.getById(orderId);
  3. if (chargingOrder == null) {
  4. throw new ServiceException(UserExceptionEnum.ORFER_EXCEPTION);
  5. }
  6. // 设置订单申请退款状态,更新订单
  7. chargingOrder.setRefundContent(UUID.randomUUID().toString());
  8. WxPayRefundRequest refundInfo=new WxPayRefundRequest();
  9. if (StringUtils.isBlank(chargingOrder.getOrderSn())) {
  10. throw new ServiceException(UserExceptionEnum.BUSINESS_OPERATE_EXCEPTION);
  11. }
  12. String dateTime = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
  13. refundInfo.setOutTradeNo(chargingOrder.getOrderSn());
  14. refundInfo.setOutRefundNo(dateTime + "-" + RandomStringUtils.randomAlphanumeric(5));
  15. refundInfo.setTotalFee(priceTools.toFen(chargingOrder.getOrderPrice()));
  16. refundInfo.setRefundFee(priceTools.toFen(money));
  17. refundInfo.setNotifyUrl(回调的路径)
  18. refundInfo.setOpUserId(wxPayConfigs.getMchId());
  19. refundInfo.setRefundDesc("需求退款: " + money + "元");
  20. WxPayRefundResult wxPayRefundResult;
  21. try {
  22. wxPayRefundResult = wxPayService.refund(refundInfo);
  23. //判断退款信息是否正确
  24. if ("SUCCESS".equals(wxPayRefundResult.getReturnCode())
  25. && "SUCCESS".equals(wxPayRefundResult.getResultCode())) {
  26. /**
  27. * 系统内部业务逻辑
  28. */
  29. }
  30. } catch (WxPayException e) {
  31. logger.error("微信退款接口错误信息= {}", e);
  32. throw new ServiceException(UserExceptionEnum.BUSINESS_OPERATE_EXCEPTION);
  33. }
  34. CustomerAccount customerAccount = customerAccountService.getOne(new QueryWrapper<CustomerAccount>().eq("customer_id", chargingOrder.getCustomerId()));
  35. customerAccount.setContent("微信退款");
  36. accountHistoryService.add(customerAccount, "3", money);
  37. return AppResponseUtil.success();
  38. }

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/467343
推荐阅读
相关标签
  

闽ICP备14008679号