WxOrderServiceImpl.java 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. package com.miaxis.wx.service.impl;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  4. import com.fasterxml.jackson.databind.ObjectMapper;
  5. import com.github.wxpay.sdk.WXPay;
  6. import com.github.wxpay.sdk.WXPayConfig;
  7. import com.github.wxpay.sdk.WXPayConstants;
  8. import com.github.wxpay.sdk.WXPayUtil;
  9. import com.miaxis.common.config.WxPayConfigImpl;
  10. import com.miaxis.common.config.WxpayConfig;
  11. import com.miaxis.common.core.domain.entity.UserInfo;
  12. import com.miaxis.common.exception.CustomException;
  13. import com.miaxis.common.utils.RSAUtils;
  14. import com.miaxis.common.utils.SecurityUtils;
  15. import com.miaxis.common.utils.XmlUtil;
  16. import com.miaxis.order.domain.OrderInfo;
  17. import com.miaxis.order.domain.OrderSplit;
  18. import com.miaxis.order.service.IOrderInfoService;
  19. import com.miaxis.order.service.IOrderSplitService;
  20. import com.miaxis.system.service.ISysConfigService;
  21. import com.miaxis.user.service.IUserInfoService;
  22. import com.miaxis.wx.domain.WxExtract;
  23. import com.miaxis.wx.domain.WxExtractBank;
  24. import com.miaxis.wx.domain.WxOrder;
  25. import com.miaxis.wx.dto.WxExtractBankDTO;
  26. import com.miaxis.wx.mapper.WxOrderMapper;
  27. import com.miaxis.wx.service.IWxExtractBankService;
  28. import com.miaxis.wx.service.IWxExtractService;
  29. import com.miaxis.wx.service.IWxOrderService;
  30. import lombok.extern.slf4j.Slf4j;
  31. import org.apache.commons.lang3.RandomStringUtils;
  32. import org.springframework.beans.factory.annotation.Autowired;
  33. import org.springframework.beans.factory.annotation.Value;
  34. import org.springframework.stereotype.Service;
  35. import org.springframework.transaction.annotation.Transactional;
  36. import org.springframework.util.CollectionUtils;
  37. import javax.annotation.Resource;
  38. import java.util.List;
  39. import java.util.Map;
  40. import java.util.TreeMap;
  41. import static com.miaxis.common.utils.OrderCodeFactory.getOrderCode;
  42. /**
  43. * 电影订单Service业务层处理
  44. *
  45. * @author miaxis
  46. * @date 2021-05-07
  47. */
  48. @Service
  49. @Slf4j
  50. public class WxOrderServiceImpl extends ServiceImpl<WxOrderMapper, WxOrder> implements IWxOrderService {
  51. @Resource
  52. private WxOrderMapper wxOrderMapper;
  53. @Autowired
  54. private IWxExtractService wxExtractService;
  55. @Autowired
  56. private IOrderInfoService orderInfoService;
  57. @Autowired
  58. private IOrderSplitService orderSplitService;
  59. @Autowired
  60. private RSAUtils rsaUtils;
  61. @Autowired
  62. private WxpayConfig wxpayConfig;
  63. @Autowired
  64. private ISysConfigService configService;
  65. @Autowired
  66. private IUserInfoService userInfoService;
  67. @Autowired
  68. private IWxExtractBankService wxExtractBankService;
  69. @Value("${xcx.appId}")
  70. private String xcxAppid;
  71. @Value("${xcx.mchId}")
  72. private String mchId;
  73. @Override
  74. @Transactional
  75. public void wxAddFenZhang() throws Exception {
  76. String url = "https://api.mch.weixin.qq.com/pay/profitsharingaddreceiver";
  77. String nonceStr = RandomStringUtils.randomAlphanumeric(32);
  78. //用于签名
  79. Map<String, String> sortMap = new TreeMap<String, String>();
  80. sortMap.put("mch_id", mchId);
  81. sortMap.put("appid", xcxAppid);
  82. sortMap.put("nonce_str", nonceStr);
  83. sortMap.put("sign_type", "HMAC-SHA256");
  84. Map<String, String> receiverMap = new TreeMap<String, String>();
  85. receiverMap.put("type", "PERSONAL_OPENID");
  86. receiverMap.put("account", "o7N3j5XxUrgOKE4ulP-HseFpBCiM");
  87. receiverMap.put("relation_type", "SERVICE_PROVIDER"); //合作合伙
  88. ObjectMapper objectMapper = new ObjectMapper();
  89. String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
  90. sortMap.put("receiver", receiverMapJson);
  91. WXPayConfig config = new WxPayConfigImpl();
  92. String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
  93. sortMap.put("sign", sign);
  94. WXPay pay = new WXPay(config);
  95. String xmlStr = pay.requestWithoutCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
  96. Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
  97. if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
  98. throw new CustomException("微信添加分账出错");
  99. }
  100. System.out.println(xmlStr);
  101. }
  102. /**
  103. * @return
  104. * @throws Exception
  105. */
  106. @Override
  107. @Transactional
  108. public void wxProfitsharing(WxOrder wxOrder) throws Exception {
  109. String url = "https://api.mch.weixin.qq.com/secapi/pay/profitsharing";
  110. String nonceStr = RandomStringUtils.randomAlphanumeric(32);
  111. //用于签名
  112. Map<String, String> sortMap = new TreeMap<String, String>();
  113. sortMap.put("mch_id", mchId);
  114. sortMap.put("appid", xcxAppid);
  115. sortMap.put("nonce_str", nonceStr);
  116. sortMap.put("sign_type", "HMAC-SHA256");
  117. sortMap.put("transaction_id", wxOrder.getTransactionId());
  118. String orderCode = getOrderCode(wxOrder.getUserId()); //商户分账单号
  119. sortMap.put("out_order_no", orderCode);
  120. //扣除手续费后
  121. double commission = wxOrder.getTotal() * 0.01;
  122. double total = wxOrder.getTotal() - commission;
  123. int amount = (int) Math.floor(total * 0.3);
  124. Map<String, Object> receiverMap = new TreeMap<String, Object>();
  125. receiverMap.put("type", "PERSONAL_OPENID");
  126. receiverMap.put("account", "o7N3j5XxUrgOKE4ulP-HseFpBCiM");
  127. receiverMap.put("amount", amount);
  128. receiverMap.put("description", "分到个人"); //合作合伙
  129. ObjectMapper objectMapper = new ObjectMapper();
  130. String receiverMapJson = objectMapper.writeValueAsString(receiverMap);
  131. sortMap.put("receivers", receiverMapJson);
  132. WXPayConfig config = new WxPayConfigImpl();
  133. String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.HMACSHA256);
  134. sortMap.put("sign", sign);
  135. WXPay pay = new WXPay(config);
  136. String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
  137. Map<String, String> resMap = XmlUtil.xmlToMap(xmlStr);
  138. if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
  139. throw new CustomException("微信分账出错");
  140. }
  141. //更新成交订单表
  142. OrderInfo orderInfo = orderInfoService.getByOutTradeNo(wxOrder.getOutTradeNo());
  143. orderInfo.setOutSplitNo(orderCode);
  144. orderInfoService.updateById(orderInfo);
  145. OrderSplit orderSplit = new OrderSplit();
  146. orderSplit.setOutSplitNo(orderCode);
  147. orderSplit.setAmount(amount);
  148. orderSplit.setOpenId("o7N3j5XxUrgOKE4ulP-HseFpBCiM");
  149. orderSplit.setDescription("分到个人");
  150. orderSplitService.save(orderSplit);
  151. }
  152. @Override
  153. public WxOrder getByOutTradeNo(String outTradeNo) {
  154. return wxOrderMapper.getByOutTradeNo(outTradeNo);
  155. }
  156. @Override
  157. @Transactional
  158. public String wxwithdrawal(Integer amount) throws Exception {
  159. UserInfo student = SecurityUtils.getLoginUser().getStudent();
  160. UserInfo dbUserInfo = userInfoService.getById(student.getId());
  161. // if (dbUserInfo.getProfitPrice() < amount){
  162. // throw new CustomException("提现金额不能大于可提现金额");
  163. // }
  164. Map<String, String> sortMap = new TreeMap<String, String>();
  165. sortMap.put("mch_appid", mchId);
  166. sortMap.put("mchid", wxpayConfig.getMerchantId());
  167. sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
  168. sortMap.put("partner_trade_no", getOrderCode(null));
  169. //sortMap.put("openid",student.getGzhOpenid());
  170. sortMap.put("check_name", "NO_CHECK");
  171. sortMap.put("amount", String.valueOf(amount));
  172. sortMap.put("desc", "用户提现");
  173. WXPayConfig config = new WxPayConfigImpl();
  174. String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
  175. sortMap.put("sign", sign);
  176. WXPay pay = new WXPay(config);
  177. String url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/promotion/transfers";
  178. Map<String, String> resMap;
  179. String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
  180. resMap = XmlUtil.xmlToMap(xmlStr);
  181. if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
  182. throw new CustomException(resMap.get("return_msg"));
  183. }
  184. //新增提现记录
  185. WxExtract wxExtract = new WxExtract();
  186. //wxExtract.setOpenid(student.getGzhOpenid());
  187. wxExtract.setExtractPrice(amount);
  188. wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
  189. wxExtract.setStatus("1");
  190. wxExtractService.save(wxExtract);
  191. //更新余额
  192. // dbUserInfo.setProfitPrice(dbUserInfo.getProfitPrice()-amount);
  193. userInfoService.updateById(dbUserInfo);
  194. return resMap.get("return_msg");
  195. }
  196. @Override
  197. @Transactional
  198. public String wxwithbankdrawal(WxExtractBankDTO dto) throws Exception {
  199. UserInfo student = SecurityUtils.getLoginUser().getStudent();
  200. UserInfo dbUserInfo = userInfoService.getById(student.getId());
  201. // if (dbUserInfo.getProfitPrice() < dto.getAmount()){
  202. // throw new CustomException("提现金额不能大于可提现金额");
  203. // }
  204. Map<String, String> sortMap = new TreeMap<String, String>();
  205. sortMap.put("mch_id", wxpayConfig.getMerchantId());
  206. sortMap.put("nonce_str", RandomStringUtils.randomAlphanumeric(32));
  207. sortMap.put("partner_trade_no", getOrderCode(null));
  208. sortMap.put("amount", String.valueOf(dto.getAmount()));
  209. sortMap.put("desc", "用户银行卡提现");
  210. // 进行签名服务
  211. sortMap.put("enc_true_name", rsaUtils.encryptData(dto.getEncTrueName()));
  212. sortMap.put("enc_bank_no", rsaUtils.encryptData(dto.getEncBankNo()));
  213. sortMap.put("bank_code", dto.getBankCode().toString());
  214. WXPayConfig config = new WxPayConfigImpl();
  215. String sign = WXPayUtil.generateSignature(sortMap, config.getKey(), WXPayConstants.SignType.MD5);
  216. sortMap.put("sign", sign);
  217. WXPay pay = new WXPay(config);
  218. String url = "https://api.mch.weixin.qq.com/mmpaysptrans/pay_bank";
  219. Map<String, String> resMap;
  220. String xmlStr = pay.requestWithCert(url, sortMap, config.getHttpConnectTimeoutMs(), config.getHttpReadTimeoutMs());
  221. resMap = XmlUtil.xmlToMap(xmlStr);
  222. if (!"SUCCESS".equals(resMap.get("return_code")) || !"SUCCESS".equals(resMap.get("result_code"))) {
  223. throw new CustomException(resMap.get("return_msg"));
  224. }
  225. //新增提现记录
  226. WxExtract wxExtract = new WxExtract();
  227. //wxExtract.setOpenid(student.getGzhOpenid());
  228. wxExtract.setExtractPrice(dto.getAmount());
  229. wxExtract.setPartnerTradeNo(resMap.get("partner_trade_no"));
  230. wxExtract.setStatus("1");
  231. wxExtractService.save(wxExtract);
  232. //如果此卡之前未存储,则加入到银行卡列表
  233. List<WxExtractBank> bankList = wxExtractBankService.list(new QueryWrapper<WxExtractBank>().eq("enc_bank_no", dto.getEncBankNo()));
  234. if (CollectionUtils.isEmpty(bankList)) {
  235. WxExtractBank wxExtractBank = new WxExtractBank();
  236. wxExtractBank.setBankCode(dto.getBankCode());
  237. wxExtractBank.setEncBankNo(dto.getEncBankNo());
  238. wxExtractBank.setEncTrueName(dto.getEncTrueName());
  239. //wxExtractBank.setOpenid(SecurityUtils.getLoginUser().getStudent().getGzhOpenid());
  240. wxExtractBankService.save(wxExtractBank);
  241. }
  242. //更新余额
  243. //dbUserInfo.setProfitPrice(dbUserInfo.getProfitPrice()-dto.getAmount());
  244. userInfoService.updateById(dbUserInfo);
  245. return resMap.get("return_msg");
  246. }
  247. }