WeixinPayService.java 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. package com.example.xiaoshiweixinback.service.weixinpay;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.example.xiaoshiweixinback.business.config.XDns;
  4. import com.example.xiaoshiweixinback.business.exception.BusinessException;
  5. import com.example.xiaoshiweixinback.business.exception.ExceptionEnum;
  6. import com.example.xiaoshiweixinback.business.utils.BatchNoUtil;
  7. import com.example.xiaoshiweixinback.business.utils.CacheUtil;
  8. import com.example.xiaoshiweixinback.business.utils.FormatUtil;
  9. import com.example.xiaoshiweixinback.business.utils.LoginUtils;
  10. import com.example.xiaoshiweixinback.domain.Order;
  11. import com.example.xiaoshiweixinback.entity.vo.PersonnelVO;
  12. import com.example.xiaoshiweixinback.entity.weixinPay.GetAuthorizationVO;
  13. import com.example.xiaoshiweixinback.entity.weixinPay.GetPayTicketVO;
  14. import com.example.xiaoshiweixinback.entity.weixinPay.JsApiDTO;
  15. import com.example.xiaoshiweixinback.entity.weixinPay.WeiXinPayDTO;
  16. import com.example.xiaoshiweixinback.service.OrderService;
  17. import com.google.gson.Gson;
  18. import okhttp3.*;
  19. import org.springframework.beans.BeanUtils;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import org.springframework.transaction.annotation.Transactional;
  23. import java.io.IOException;
  24. import java.util.Objects;
  25. import java.util.UUID;
  26. import java.util.concurrent.TimeUnit;
  27. @Service
  28. public class WeixinPayService {
  29. /**
  30. * 商户号
  31. */
  32. @Autowired
  33. private AuthorizationService authorizationService;
  34. @Autowired
  35. private CacheUtil cacheUtil;
  36. @Autowired
  37. private OrderService orderService;
  38. public static String merchantId = "1673179188";
  39. /**
  40. * appId
  41. */
  42. public static String appId = "wxaefb842bd0b93ff0";
  43. public static String signType = "RSA";
  44. /**
  45. * 下订单接口
  46. *
  47. * @return
  48. * @throws Exception
  49. */
  50. @Transactional(rollbackFor = Exception.class)
  51. public GetPayTicketVO getPayTickets(WeiXinPayDTO weiXinPayDTO) throws Exception {
  52. GetPayTicketVO getPayTicketVO = new GetPayTicketVO();
  53. String url = "https://api.mch.weixin.qq.com/v3/pay/transactions/jsapi";
  54. String tradeNo = BatchNoUtil.getOrderNo();
  55. PersonnelVO personnelVO = cacheUtil.getLoginUser(LoginUtils.getToken());
  56. Order order = orderService.addOrder(weiXinPayDTO, tradeNo, personnelVO);
  57. if(order.getTruePrice()<=0){
  58. String orderTradeNo =order.getTradeNo();
  59. orderService.payBack(orderTradeNo);
  60. return null;
  61. }
  62. JsApiDTO jsApiDTO = this.loadJsApiDTO(order, tradeNo);
  63. OkHttpClient okHttpClient = new OkHttpClient();
  64. String param = new Gson().toJson(jsApiDTO);
  65. GetAuthorizationVO authorizationVO = authorizationService.getAuthorization("POST", "/v3/pay/transactions/jsapi", param);
  66. BeanUtils.copyProperties(authorizationVO, getPayTicketVO);
  67. getPayTicketVO.setAppId(appId);
  68. getPayTicketVO.setSignType(signType);
  69. String authorization = authorizationVO.getAuthorization();
  70. RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"), param);
  71. Request request = new Request.Builder()
  72. .addHeader("Authorization", authorization)
  73. .addHeader("Accept", "*/*")
  74. .url(url)
  75. .post(requestBody)
  76. .build();
  77. // 发送请求获取响应
  78. try {
  79. Response response = okHttpClient.newCall(request).execute();
  80. // 判断请求是否成功
  81. if (response.isSuccessful()) {
  82. // 打印服务端返回结果
  83. String a = Objects.requireNonNull(response.body()).string();
  84. JSONObject jsonObject = JSONObject.parseObject(a);
  85. getPayTicketVO.setPrepayId(jsonObject.get("prepay_id").toString());
  86. GetAuthorizationVO authorizationVO1 = authorizationService.getFrontAuthorization(getPayTicketVO.getPrepayId());
  87. getPayTicketVO.setTimestamp(authorizationVO1.getTimestamp());
  88. getPayTicketVO.setNonceStr(authorizationVO1.getNonceStr());
  89. getPayTicketVO.setSignature(authorizationVO1.getSignature());
  90. return getPayTicketVO;
  91. }
  92. } catch (IOException e) {
  93. e.printStackTrace();
  94. }
  95. return null;
  96. }
  97. private JsApiDTO loadJsApiDTO(Order order, String tradeNo) {
  98. JsApiDTO jsApiDTO = new JsApiDTO();
  99. jsApiDTO.setAppid(appId);
  100. jsApiDTO.setDescription("会员");
  101. jsApiDTO.setMchid(merchantId);
  102. jsApiDTO.setOut_trade_no(tradeNo);
  103. JsApiDTO.Amount amount = new JsApiDTO.Amount();
  104. amount.setCurrency("CNY");
  105. Integer price =0;
  106. if(order.getTruePrice()!=null){
  107. Double truePrice =order.getTruePrice()*100;
  108. price =truePrice.intValue();
  109. }
  110. amount.setTotal(price);
  111. jsApiDTO.setAmount(amount);
  112. JsApiDTO.Payer payer = new JsApiDTO.Payer();
  113. jsApiDTO.setNotify_url("https://xsip.cn/xiaoshi-weixinback/weixinpay/success");
  114. PersonnelVO personnelVO = cacheUtil.getLoginUser(LoginUtils.getToken());
  115. payer.setOpenid(personnelVO.getOpenId());
  116. jsApiDTO.setPayer(payer);
  117. return jsApiDTO;
  118. }
  119. }