THuifuMchServiceImpl.java 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426
  1. package com.szwl.service.impl;
  2. import cn.hutool.core.bean.BeanUtil;
  3. import cn.hutool.core.util.StrUtil;
  4. import com.alibaba.fastjson.JSON;
  5. import com.alibaba.fastjson.JSONObject;
  6. import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
  7. import com.huifu.bspay.sdk.opps.core.utils.DateTools;
  8. import com.huifu.bspay.sdk.opps.core.utils.OkHttpClientTools;
  9. import com.szwl.common.HuifuBaseCommon;
  10. import com.szwl.config.OppsMerchantConfig;
  11. import com.szwl.constant.HuifuConstant;
  12. import com.szwl.feign.bean.SzwlFeign;
  13. import com.szwl.mapper.THuifuMchMapper;
  14. import com.szwl.model.bo.R;
  15. import com.szwl.model.entity.*;
  16. import com.szwl.service.*;
  17. import com.szwl.utils.HuifuUtils;
  18. import com.szwl.utils.IDGenerator;
  19. import lombok.extern.slf4j.Slf4j;
  20. import org.springframework.beans.factory.annotation.Autowired;
  21. import org.springframework.stereotype.Service;
  22. import java.math.BigDecimal;
  23. import java.util.Date;
  24. import java.util.HashMap;
  25. import java.util.Map;
  26. import java.util.TreeMap;
  27. /**
  28. * <p>
  29. * 服务实现类
  30. * </p>
  31. *
  32. * @author wuhs
  33. * @since 2023-07-17
  34. */
  35. @Slf4j
  36. @Service
  37. public class THuifuMchServiceImpl extends ServiceImpl<THuifuMchMapper, THuifuMch> implements THuifuMchService {
  38. @Autowired
  39. private THuifuTempOrderService huifuTempOrderService;
  40. @Autowired
  41. TOrderService orderService;
  42. @Autowired
  43. private TOrderDetailsService orderDetailsService;
  44. @Autowired
  45. SzwlFeign szwlFeign;
  46. @Autowired
  47. WechatPayInfoService wechatPayInfoService;
  48. @Override
  49. public String uniPay(String orderNo, BigDecimal amount, String productName,
  50. String productDesc, String notifyUrl, String frpCode,
  51. String openId, String appid, JSONObject acctSplitBunch,
  52. String companyType) throws Exception {
  53. String url = "https://api.huifu.com/v2/trade/payment/jspay";
  54. HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
  55. JSONObject request = new JSONObject();
  56. request.put("req_seq_id", orderNo);
  57. request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
  58. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  59. request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
  60. } else {
  61. request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
  62. }
  63. if (frpCode.equals("ALIPAY_NATIVE")) {
  64. request.put("trade_type", "A_NATIVE");
  65. }
  66. if (frpCode.equals("WEIXIN_XCX")) {
  67. request.put("trade_type", "T_MINIAPP");
  68. JSONObject wxData = new JSONObject();
  69. wxData.put("sub_appid", appid);
  70. wxData.put("open_id", openId);
  71. request.put("wx_data", wxData);
  72. }
  73. request.put("trans_amt", amount);
  74. request.put("goods_desc", productName);
  75. request.put("notify_url", HuifuConstant.Notify_Url);
  76. // 分账明细
  77. request.put("acct_split_bunch", acctSplitBunch.toJSONString());
  78. // 签名:sign
  79. String s = JSON.toJSONString(request);
  80. String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
  81. String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
  82. // 公共参数
  83. JSONObject requestData = new JSONObject();
  84. requestData.put("sys_id", HuifuConstant.SYS_ID);
  85. requestData.put("product_id", HuifuConstant.PRODUCT_ID);
  86. requestData.put("sign", sign);
  87. requestData.put("data", request);
  88. System.out.println("请求体:" + requestData);
  89. String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
  90. JSONObject result = JSONObject.parseObject(success);
  91. JSONObject data = result.getJSONObject("data");
  92. String qrCode = data.getString("qr_code");
  93. String payInfo = data.getString("pay_info");
  94. if (frpCode.equals("ALIPAY_NATIVE")) {
  95. return qrCode;
  96. }
  97. if (frpCode.equals("WEIXIN_XCX")) {
  98. return payInfo;
  99. }
  100. return null;
  101. }
  102. @Override
  103. public String wetchatPay(THuifuTempOrder huifuTempOrder, String openid) throws Exception {
  104. String url = "https://api.huifu.com/v2/trade/payment/jspay";
  105. HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
  106. JSONObject request = new JSONObject();
  107. String sn = HuifuUtils.initReqSeqId();
  108. request.put("req_seq_id", sn);
  109. request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
  110. String companyType = huifuTempOrder.getCompanyType();
  111. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  112. request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
  113. } else {
  114. request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
  115. }
  116. request.put("trade_type", "T_JSAPI");
  117. request.put("trans_amt", huifuTempOrder.getPrice());
  118. String clientId = huifuTempOrder.getClientId();
  119. String productName = huifuTempOrder.getProductName();
  120. TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
  121. String client6 = clientId.substring(clientId.length() - 6);
  122. String productName1 = "";
  123. if (huifuTempOrder.getProductNumber() > 1) {
  124. if (equipment.getMachineType() == null || equipment.getMachineType().equals("0")) {
  125. productName1 = "棉花糖-" + equipment.getName() + "-" + client6;
  126. } else {
  127. productName1 = "爆米花-" + equipment.getName() + "-" + client6;
  128. }
  129. } else {
  130. productName1 = productName + "-" + equipment.getName() + "-" + client6;
  131. }
  132. request.put("goods_desc", productName1);
  133. request.put("notify_url", HuifuConstant.Notify_Url);
  134. request.put("remark", huifuTempOrder.getId());
  135. // 分账明细
  136. request.put("acct_split_bunch", huifuTempOrder.getAcctSplitBunch());
  137. // 微信支付配置
  138. JSONObject wxData = new JSONObject();
  139. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  140. wxData.put("sub_appid", HuifuConstant.SC_WX_SUB_APP_ID);
  141. } else {
  142. wxData.put("sub_appid", HuifuConstant.SZ_WX_SUB_APP_ID);
  143. }
  144. wxData.put("open_id", openid);
  145. request.put("wx_data", wxData);
  146. // 签名:sign
  147. String s = JSON.toJSONString(request);
  148. String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
  149. String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
  150. // 公共参数
  151. JSONObject requestData = new JSONObject();
  152. requestData.put("sys_id", HuifuConstant.SYS_ID);
  153. requestData.put("product_id", HuifuConstant.PRODUCT_ID);
  154. requestData.put("sign", sign);
  155. requestData.put("data", request);
  156. System.out.println("请求体:" + requestData);
  157. String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
  158. // 拿到返回参数
  159. JSONObject result = JSONObject.parseObject(success);
  160. log.info("汇付返回参数:{}", result);
  161. JSONObject data = result.getJSONObject("data");
  162. String payInfo = data.getString("pay_info");
  163. JSONObject payInfoJson = JSONObject.parseObject(payInfo);
  164. // 获取timeStamp的值
  165. String timeStamp = payInfoJson.getString("timeStamp");
  166. // 获取nonceStr的值
  167. String nonceStr = payInfoJson.getString("nonceStr");
  168. // 获取package的值
  169. String packageValue = payInfoJson.getString("package");
  170. // 获取paySign的值
  171. String paySign = payInfoJson.getString("paySign");
  172. // 测试链接:http://szwltest.sunzee.com.cn/shenze
  173. String resultUrl = "";
  174. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  175. resultUrl = HuifuConstant.SC_JUMP_URL + "/#/popPayment?" +
  176. "sn=" + sn +
  177. "&timeStamp=" + timeStamp +
  178. "&nonceStr=" + nonceStr +
  179. "&package=" + packageValue +
  180. "&paySign=" + paySign;
  181. } else {
  182. resultUrl = HuifuConstant.SZ_JUMP_URL + "/#/popPayment?" +
  183. "sn=" + sn +
  184. "&timeStamp=" + timeStamp +
  185. "&nonceStr=" + nonceStr +
  186. "&package=" + packageValue +
  187. "&paySign=" + paySign;
  188. }
  189. log.info("微信支付链接:{}", resultUrl);
  190. // 保存订单到数据库
  191. TOrder tOrder = new TOrder();
  192. String[] ignoreProperties = {"id", "createDate", "sn"};
  193. BeanUtil.copyProperties(huifuTempOrder, tOrder, ignoreProperties);
  194. tOrder.setId(IDGenerator.orderID());
  195. tOrder.setSn(sn);
  196. tOrder.setCreateDate(new Date());
  197. tOrder.setModifyDate(new Date());
  198. // 保存订单明细
  199. TOrderDetails orderDetails = new TOrderDetails();
  200. orderDetails.setAdminId(huifuTempOrder.getAdminId());
  201. orderDetails.setCreateDate(new Date());
  202. orderDetails.setOrderSn(sn);
  203. orderDetails.setCompanyType(huifuTempOrder.getCompanyType());
  204. orderDetails.setRefundStatus("0");
  205. orderDetails.setEquipmentId(huifuTempOrder.getEquipmentId());
  206. orderDetails.setMachineType(huifuTempOrder.getMachineType());
  207. if (huifuTempOrder.getProductNumber() != null && huifuTempOrder.getProductNumber() > 1) {
  208. Map<String, String> map = new HashMap<>();
  209. String[] products = huifuTempOrder.getNote().split(",");
  210. for (String product : products) {
  211. String[] parts = product.split(":");
  212. // 商品名称-商品编号
  213. String key = parts[0];
  214. // 商品单价-商品数量
  215. String value = parts[1];
  216. map.put(key, value);
  217. }
  218. for (String key : map.keySet()) {
  219. // key:"玫瑰精灵-A01",value:"0.50-1"
  220. String value = map.get(key);
  221. String[] GoodsInfo = key.split("-");
  222. String[] GoodsValue = value.split("-");
  223. orderDetails.setId(HuifuUtils.initDetailsId());
  224. orderDetails.setProductName(GoodsInfo[0]);
  225. orderDetails.setProductNo(GoodsInfo[1]);
  226. orderDetails.setPrice(new BigDecimal(GoodsValue[0]).divide(new BigDecimal(GoodsValue[1])).setScale(2));
  227. orderDetails.setProductNumber(Integer.valueOf(GoodsValue[1]));
  228. orderDetails.setAmount(new BigDecimal(GoodsValue[0]).setScale(2));
  229. orderDetailsService.save(orderDetails);
  230. }
  231. log.info("插入成功");
  232. } else {
  233. // 订单明细表
  234. orderDetails.setId(HuifuUtils.initDetailsId());
  235. orderDetails.setPrice(huifuTempOrder.getPrice());
  236. orderDetails.setProductName(huifuTempOrder.getProductName());
  237. orderDetails.setProductNo(huifuTempOrder.getProductNo());
  238. orderDetails.setProductNumber(huifuTempOrder.getProductNumber());
  239. orderDetails.setAmount(huifuTempOrder.getPrice());
  240. orderDetailsService.save(orderDetails);
  241. }
  242. orderService.save(tOrder);
  243. return resultUrl;
  244. }
  245. @Override
  246. public String cardPay(String orderNo, BigDecimal amount, String productName,
  247. String notifyUrl, String authCode, JSONObject acctSplitBunch,
  248. String companyType) throws Exception {
  249. String url = "https://api.huifu.com/v2/trade/payment/micropay";
  250. HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
  251. JSONObject request = new JSONObject();
  252. request.put("req_seq_id", orderNo);
  253. request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
  254. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  255. request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
  256. } else {
  257. request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
  258. }
  259. request.put("auth_code", authCode);
  260. request.put("trans_amt", amount);
  261. request.put("goods_desc", productName);
  262. request.put("notify_url", HuifuConstant.Notify_Url);
  263. // 分账明细
  264. request.put("acct_split_bunch", acctSplitBunch.toJSONString());
  265. // 安全信息
  266. JSONObject riskCheckData = new JSONObject();
  267. riskCheckData.put("ip_addr", "47.112.127.131");
  268. request.put("risk_check_data", riskCheckData);
  269. // 签名:sign
  270. String s = JSON.toJSONString(request);
  271. String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
  272. String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
  273. // 公共参数
  274. JSONObject requestData = new JSONObject();
  275. requestData.put("sys_id", HuifuConstant.SYS_ID);
  276. requestData.put("product_id", HuifuConstant.PRODUCT_ID);
  277. requestData.put("sign", sign);
  278. requestData.put("data", request);
  279. System.out.println("请求体:" + requestData);
  280. log.info("请求体:{}", requestData);
  281. String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
  282. JSONObject result = JSONObject.parseObject(success);
  283. JSONObject data = result.getJSONObject("data");
  284. String transStat = data.getString("trans_stat");
  285. String respDesc = data.getString("resp_desc");
  286. if (transStat.equals(HuifuConstant.TRANS_STAT_S) || transStat.equals(HuifuConstant.TRANS_STAT_P)) {
  287. return HuifuConstant.RESP_CODE_0;
  288. } else {
  289. return respDesc;
  290. }
  291. }
  292. @Override
  293. public JSONObject payWechat(TOrder order, String openid) throws Exception {
  294. String url = "https://api.huifu.com/v2/trade/payment/jspay";
  295. HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
  296. JSONObject request = new JSONObject();
  297. String sn = order.getSn();
  298. request.put("req_seq_id", sn);
  299. request.put("req_date", DateTools.getCurrentDateYYYYMMDD());
  300. String companyType = order.getCompanyType();
  301. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  302. request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
  303. } else {
  304. request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
  305. }
  306. request.put("trade_type", "T_JSAPI");
  307. request.put("trans_amt", order.getPrice());
  308. String clientId = order.getClientId();
  309. String productName = order.getProductName();
  310. TEquipment equipment = R.getDataIfSuccess(szwlFeign.findEquipmentByClientId(clientId));
  311. String client6 = clientId.substring(clientId.length() - 6);
  312. String goodsDesc = "";
  313. if (order.getProductNumber() > 1) {
  314. if (equipment.getMachineType() == null || equipment.getMachineType().equals("0")) {
  315. goodsDesc = "棉花糖-" + equipment.getName() + "-" + client6;
  316. } else if (equipment.getMachineType().equals("1")) {
  317. goodsDesc = "爆米花-" + equipment.getName() + "-" + client6;
  318. } else if (equipment.getMachineType().equals("2")) {
  319. goodsDesc = "雪糕-" + equipment.getName() + "-" + client6;
  320. }
  321. } else {
  322. goodsDesc = productName + "-" + equipment.getName() + "-" + client6;
  323. }
  324. request.put("goods_desc", goodsDesc);
  325. request.put("notify_url", HuifuConstant.Notify_Url);
  326. // 分账明细
  327. request.put("acct_split_bunch", order.getAcctSplitBunch());
  328. // 微信支付配置
  329. JSONObject wxData = new JSONObject();
  330. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  331. wxData.put("sub_appid", HuifuConstant.SC_WX_SUB_APP_ID);
  332. } else {
  333. wxData.put("sub_appid", HuifuConstant.SZ_WX_SUB_APP_ID);
  334. }
  335. wxData.put("open_id", openid);
  336. request.put("wx_data", wxData);
  337. // 签名:sign
  338. String s = JSON.toJSONString(request);
  339. String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
  340. String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
  341. // 公共参数
  342. JSONObject requestData = new JSONObject();
  343. requestData.put("sys_id", HuifuConstant.SYS_ID);
  344. requestData.put("product_id", HuifuConstant.PRODUCT_ID);
  345. requestData.put("sign", sign);
  346. requestData.put("data", request);
  347. String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
  348. // 拿到返回参数
  349. JSONObject result = JSONObject.parseObject(success);
  350. JSONObject data = result.getJSONObject("data");
  351. String hfSeqId = data.getString("hf_seq_id");
  352. String payInfo = data.getString("pay_info");
  353. JSONObject payInfoJson = JSONObject.parseObject(payInfo);
  354. // 获取timeStamp的值
  355. String appId = payInfoJson.getString("appId");
  356. // 获取timeStamp的值
  357. String timeStamp = payInfoJson.getString("timeStamp");
  358. // 获取nonceStr的值
  359. String nonceStr = payInfoJson.getString("nonceStr");
  360. // 获取package的值
  361. String packageValue = payInfoJson.getString("package");
  362. // 获取paySign的值
  363. String paySign = payInfoJson.getString("paySign");
  364. // 保存到数据库
  365. WechatPayInfo wechatPayInfo = new WechatPayInfo();
  366. wechatPayInfo.setSn(sn);
  367. wechatPayInfo.setHfSeqId(hfSeqId);
  368. wechatPayInfo.setAppId(appId);
  369. wechatPayInfo.setTimeStamp(timeStamp);
  370. wechatPayInfo.setNonceStr(nonceStr);
  371. wechatPayInfo.setPackageValue(packageValue);
  372. wechatPayInfo.setPaySign(paySign);
  373. wechatPayInfoService.save(wechatPayInfo);
  374. return data;
  375. }
  376. @Override
  377. public JSONObject payQuery(String queryId, String sn,String companyType) throws Exception {
  378. String url = "https://api.huifu.com/v2/trade/payment/scanpay/query";
  379. HuifuBaseCommon.doInit(OppsMerchantConfig.getMerchantConfig());
  380. JSONObject request = new JSONObject();
  381. if (StrUtil.isNotEmpty(companyType) && companyType.equals("1")) {
  382. request.put("huifu_id", HuifuConstant.SC_DIV_HUIFU_ID);
  383. } else {
  384. request.put("huifu_id", HuifuConstant.SZ_DIV_HUIFU_ID);
  385. }
  386. request.put("org_req_date", DateTools.getCurrentDateYYYYMMDD());
  387. if (StrUtil.isNotEmpty(queryId)) {
  388. request.put("org_hf_seq_id", queryId);
  389. }
  390. if (StrUtil.isNotEmpty(sn)) {
  391. request.put("org_req_seq_id", sn);
  392. }
  393. // 签名:sign
  394. String s = JSON.toJSONString(request);
  395. String s1 = JSON.toJSONString(JSONObject.parseObject(s, TreeMap.class));
  396. String sign = HuifuUtils.sign(s1, HuifuConstant.RSA_PRIVATE_KEY);
  397. // 公共参数
  398. JSONObject requestData = new JSONObject();
  399. requestData.put("sys_id", HuifuConstant.SYS_ID);
  400. requestData.put("product_id", HuifuConstant.PRODUCT_ID);
  401. requestData.put("sign", sign);
  402. requestData.put("data", request);
  403. String success = OkHttpClientTools.httpPost(url, requestData.toString(), HuifuConstant.PRODUCT_ID);
  404. // 拿到返回参数
  405. JSONObject result = JSONObject.parseObject(success);
  406. JSONObject data = result.getJSONObject("data");
  407. return data;
  408. }
  409. }