WechatPayService.java 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. package com.dk.mdm.service.wxapi.basic;
  2. import com.dk.common.response.ResponseResultUtil;
  3. import com.dk.common.response.ResponseResultVO;
  4. import com.dk.common.util.*;
  5. import com.dk.mdm.infrastructure.config.WechatPayConfigInfo;
  6. import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
  7. import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
  8. import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
  9. import com.github.binarywang.wxpay.bean.result.WxPayUnifiedOrderResult;
  10. import com.github.binarywang.wxpay.config.WxPayConfig;
  11. import com.github.binarywang.wxpay.exception.WxPayException;
  12. import com.github.binarywang.wxpay.service.WxPayService;
  13. import com.github.binarywang.wxpay.service.impl.WxPayServiceImpl;
  14. import lombok.extern.slf4j.Slf4j;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import java.math.BigDecimal;
  18. import java.util.Date;
  19. import java.util.HashMap;
  20. import java.util.Map;
  21. /**
  22. * 微信支付服务
  23. *
  24. * @author 姜永辉
  25. * @since 20223-07-01 09:41:05
  26. */
  27. @Service("wechatPayService")
  28. @Slf4j
  29. public class WechatPayService {
  30. @Autowired
  31. private WechatPayConfigInfo wechatPayConfigInfo;
  32. /**
  33. * 商户 下单选取旗舰版或专业版的订单
  34. *
  35. * @param param
  36. * @return
  37. * @throws WxPayException
  38. */
  39. public ResponseResultVO unifiedOrder(Map<String, Object> param) throws WxPayException {
  40. String paymentSn = param.get("paymentSn").toString();
  41. String openId = param.get("openId").toString();
  42. try {
  43. // 获取单据的金额
  44. String payFee = "0.01";
  45. WxPayService wxPayService = this.getWxPayService();
  46. WxPayUnifiedOrderRequest orderRequest = new WxPayUnifiedOrderRequest();
  47. orderRequest.setBody("商品测试");
  48. orderRequest.setOutTradeNo(paymentSn);
  49. orderRequest.setTotalFee(BaseWxPayRequest.yuanToFen(payFee.toString()));//元转成分
  50. orderRequest.setOpenid(openId);
  51. orderRequest.setSpbillCreateIp(IpUtils.getIpAddr(ServletUtils.getRequest()));
  52. orderRequest.setNotifyUrl(wechatPayConfigInfo.getWechatNotifyUrl() + "/" + wechatPayConfigInfo.getAppId());
  53. orderRequest.setTradeType("JSAPI");
  54. // 生成预支付订单
  55. WxPayUnifiedOrderResult wxPayUnifiedOrderResult = wxPayService.unifiedOrder(orderRequest);
  56. String prepay_id = wxPayUnifiedOrderResult.getPrepayId();
  57. String timeStamp = new Date().getTime() + "";
  58. String nonceStr = UUID.fastUUID().toString(true);
  59. String pack = "prepay_id=" + prepay_id;
  60. String signType = "MD5";
  61. String paySign = "";
  62. String sigmTemp = "appId=" + wxPayUnifiedOrderResult.getAppid() + "&nonceStr=" + nonceStr + "&package="
  63. + pack + "&signType=" + signType + "&timeStamp=" + timeStamp;
  64. sigmTemp = sigmTemp + "&key=" + wechatPayConfigInfo.getMchKey();
  65. paySign = Md5Utils.hash(sigmTemp);
  66. Map<String, Object> params = new HashMap<String, Object>();
  67. params.put("appId", wxPayUnifiedOrderResult.getAppid());
  68. params.put("timeStamp", timeStamp);
  69. params.put("nonceStr", nonceStr);
  70. params.put("pack", pack);
  71. params.put("signType", signType);
  72. params.put("paySign", paySign);
  73. return ResponseResultUtil.success(params);
  74. } catch (Exception e) {
  75. log.error("微信支付失败!支付单号:{},原因:{}", paymentSn, e.getMessage());
  76. return ResponseResultUtil.error("支付失败,请稍后重试!");
  77. }
  78. }
  79. /**
  80. * @desc : 处理支付成功逻辑
  81. * @author : 姜永辉
  82. * @date : 2024/03/06 11:29
  83. */
  84. public ResponseResultVO notifyWechatPay(WxPayOrderNotifyResult info) {
  85. // 判断支付金额是否一致
  86. // ShopOrderPaymentDto sop = new ShopOrderPaymentDto();
  87. // sop.setPaymentsn(info.getOutTradeNo());
  88. // sop.setPaystatus(0L);
  89. // ShopOrderPayment shopOrderPaymentReturn = shopOrderPaymentMapper.selectEntity(sop);
  90. // log.info("从订单流水表没有查到数据----------" + info.getOutTradeNo());
  91. // if (shopOrderPaymentReturn == null) {
  92. // log.error("从订单流水表没有查到数据----------" + info.getOutTradeNo());
  93. // return ResponseResultUtil.error("从订单流水表没有查到数据----------" + info.getOutTradeNo());
  94. // }
  95. // // // 230918 在生成 微信码时候插入 待支付的 数据
  96. // BigDecimal payFee = new BigDecimal(info.getTotalFee()).divide(new BigDecimal(100), 2, RoundingMode.HALF_EVEN);
  97. // log.info("微信扫码和插入待支付订单的钱不符-------" + shopOrderPaymentReturn.getAmount()
  98. // + "--" + payFee);
  99. // if (shopOrderPaymentReturn.getAmount().compareTo(payFee) != 0) {
  100. // log.error("微信扫码和插入待支付订单的钱不符-------" + shopOrderPaymentReturn.getAmount()
  101. // + "--" + payFee);
  102. // return CommonResult.fail("微信扫码和插入待支付订单的钱不符-------" + shopOrderPaymentReturn.getAmount()
  103. // + "--" + payFee);
  104. //
  105. // }
  106. //判断是否已经做支付处理
  107. // log.info("判断是否已经做支付处理----------" + shopOrderPaymentReturn.getPaystatus().toString());
  108. return ResponseResultUtil.success();
  109. }
  110. /**
  111. * @desc : 获取商户配置信息
  112. * @author : 姜永辉
  113. * @date : 2023-08-02 17:30
  114. */
  115. public WxPayService getWxPayService() {
  116. WxPayConfig payConfig = new WxPayConfig();
  117. payConfig.setAppId(StringUtils.trimToNull(wechatPayConfigInfo.getAppId()));
  118. payConfig.setMchId(StringUtils.trimToNull(wechatPayConfigInfo.getMchId()));
  119. payConfig.setMchKey(StringUtils.trimToNull(wechatPayConfigInfo.getMchKey()));
  120. // payConfig.setSubAppId(null);
  121. // payConfig.setSubMchId(null);
  122. payConfig.setKeyPath(StringUtils.trimToNull(wechatPayConfigInfo.getKeyPath()));
  123. // 可以指定是否使用沙箱环境
  124. payConfig.setUseSandboxEnv(false);
  125. WxPayService wxPayService = new WxPayServiceImpl();
  126. wxPayService.setConfig(payConfig);
  127. return wxPayService;
  128. }
  129. }