YxSupplyChannelManualController.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406
  1. package zs.payment.controller;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.beans.factory.annotation.Value;
  5. import org.springframework.web.bind.annotation.PostMapping;
  6. import org.springframework.web.bind.annotation.RequestBody;
  7. import org.springframework.web.bind.annotation.RequestMapping;
  8. import org.springframework.web.bind.annotation.RestController;
  9. import com.alibaba.fastjson.JSONObject;
  10. import zs.payment.dao.OrderCallbackDao;
  11. import zs.payment.entity.OrderCallback;
  12. import zs.payment.req.*;
  13. import zs.payment.entity.Orders;
  14. import zs.payment.req.aftersales.AfterSalesOrderReq;
  15. import zs.payment.resp.Result;
  16. import zs.payment.service.OrdersService;
  17. import zs.payment.utils.HttpUtil;
  18. import zs.payment.utils.RedisUtils;
  19. import javax.validation.Valid;
  20. import java.util.HashMap;
  21. import java.util.List;
  22. import java.util.Map;
  23. /**
  24. * 芸信 供应链平台
  25. */
  26. @Slf4j
  27. @RestController
  28. @RequestMapping("/supply")
  29. public class YxSupplyChannelManualController {
  30. @Value("${supply.demain}")
  31. private String prefixUrl;
  32. @Value("${supply.appKey}")
  33. private String appKey;
  34. @Value("${supply.appSecret}")
  35. private String appSecret;
  36. @Autowired
  37. private RedisUtils redisUtils;
  38. @Autowired
  39. private OrdersService ordersService;
  40. @Autowired
  41. private OrderCallbackDao callbackDao;
  42. public static final String SUPPLY_TOKEN = "supply:token";
  43. /**
  44. * 获取token
  45. */
  46. @PostMapping("/getToken")
  47. public Result getToken() {
  48. return fetchAndCacheToken();
  49. }
  50. /**
  51. * 请求上游获取token并缓存到Redis
  52. * 成功返回 Result.success(token),失败返回 Result.fail(msg)
  53. */
  54. private Result fetchAndCacheToken() {
  55. Map<String, Object> params = new HashMap<>();
  56. params.put("app_key", appKey);
  57. params.put("app_secret", appSecret);
  58. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/application/getToken", params);
  59. JSONObject respJson = JSONObject.parseObject(resp);
  60. if (respJson.getIntValue("code") != 0) {
  61. return Result.fail(respJson.getString("msg"));
  62. }
  63. JSONObject data = respJson.getJSONObject("data");
  64. String token = data.getString("token");
  65. long expiresAt = data.getLongValue("expiresAt");
  66. long ttlSeconds = (expiresAt - System.currentTimeMillis()) / 1000;
  67. if (ttlSeconds <= 0) ttlSeconds = 60;
  68. redisUtils.set(SUPPLY_TOKEN, token, (int) ttlSeconds);
  69. return Result.success(token);
  70. }
  71. /**
  72. * 选品列表API
  73. */
  74. @PostMapping("/cursorList")
  75. public Result cursorList(@Valid @RequestBody ProductPageReq req) {
  76. String token = redisUtils.get(SUPPLY_TOKEN);
  77. if (token == null || token.isEmpty()) {
  78. Result tokenResult = fetchAndCacheToken();
  79. if (!tokenResult.isSuccess()) {
  80. return tokenResult;
  81. }
  82. token = (String) tokenResult.getBody().get("token");
  83. }
  84. Map<String, Object> params = new HashMap<>();
  85. params.put("pageSize", req.getPageSize());
  86. if (req.getCursor() != null) {
  87. params.put("cursor", req.getCursor());
  88. }
  89. Map<String, String> headers = new HashMap<>();
  90. headers.put("x-token", token);
  91. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/cursorList", params, headers);
  92. JSONObject respJson = JSONObject.parseObject(resp);
  93. if (respJson.getIntValue("code") != 0) {
  94. return Result.fail(respJson.getString("msg"));
  95. }
  96. return Result.success(respJson.getJSONObject("data"));
  97. }
  98. //支持多个商品详情查看
  99. @PostMapping("/detailList")
  100. public Result detailList(@Valid @RequestBody ProductDetailReq req) {
  101. String token = redisUtils.get(SUPPLY_TOKEN);
  102. if (token == null || token.isEmpty()) {
  103. Result tokenResult = fetchAndCacheToken();
  104. if (!tokenResult.isSuccess()) {
  105. return tokenResult;
  106. }
  107. token = (String) tokenResult.getBody().get("token");
  108. }
  109. Map<String, Object> params = new HashMap<>();
  110. params.put("ids", req.getIds());
  111. Map<String, String> headers = new HashMap<>();
  112. headers.put("x-token", token);
  113. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/product/storage/detailList", params, headers);
  114. JSONObject respJson = JSONObject.parseObject(resp);
  115. if (respJson.getIntValue("code") != 0) {
  116. return Result.fail(respJson.getString("msg"));
  117. }
  118. return Result.success(respJson.getJSONObject("data"));
  119. }
  120. // 订单验证
  121. @PostMapping("/beforeCheck")
  122. public Result beforeCheck(@Valid @RequestBody OrderCheckReq req) {
  123. String token = redisUtils.get(SUPPLY_TOKEN);
  124. if (token == null || token.isEmpty()) {
  125. Result tokenResult = fetchAndCacheToken();
  126. if (!tokenResult.isSuccess()) {
  127. return tokenResult;
  128. }
  129. token = (String) tokenResult.getBody().get("token");
  130. }
  131. Map<String, Object> params = new HashMap<>();
  132. params.put("spu", req.getSpu());
  133. params.put("address", req.getAddress());
  134. Map<String, String> headers = new HashMap<>();
  135. headers.put("x-token", token);
  136. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/beforeCheck", params, headers);
  137. JSONObject respJson = JSONObject.parseObject(resp);
  138. if (respJson.getIntValue("code") != 0) {
  139. return Result.fail(respJson.getString("msg"));
  140. }
  141. return Result.success(respJson.getJSONObject("data"));
  142. }
  143. //仅下单
  144. @PostMapping("/orderConfirmOnly")
  145. public Result orderConfirmOnly(@Valid @RequestBody OrderReq req){
  146. String token = redisUtils.get(SUPPLY_TOKEN);
  147. if (token == null || token.isEmpty()) {
  148. Result tokenResult = fetchAndCacheToken();
  149. if (!tokenResult.isSuccess()) {
  150. return tokenResult;
  151. }
  152. token = (String) tokenResult.getBody().get("token");
  153. }
  154. Map<String, Object> params = new HashMap<>();
  155. params.put("spu", req.getSpu());
  156. params.put("address", req.getAddress());
  157. params.put("order_sn", req.getOrderSn());
  158. Map<String, String> headers = new HashMap<>();
  159. headers.put("x-token", token);
  160. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/orderConfirmOnly", params, headers);
  161. JSONObject respJson = JSONObject.parseObject(resp);
  162. if (respJson.getIntValue("code") != 0) {
  163. return Result.fail(respJson.getString("msg"));
  164. }
  165. List<Orders> orders = JSONObject.parseArray(
  166. respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
  167. Orders.class
  168. );
  169. log.info("仅下单,存储订单");
  170. ordersService.addBatchOrder(orders);
  171. return Result.success(orders);
  172. }
  173. //订单支付(单独下单之后使用这个支付)
  174. @PostMapping("/orderPayOnly")
  175. public Result orderPayOnly(@Valid @RequestBody OrderPayReq req){
  176. String token = redisUtils.get(SUPPLY_TOKEN);
  177. if (token == null || token.isEmpty()) {
  178. Result tokenResult = fetchAndCacheToken();
  179. if (!tokenResult.isSuccess()) {
  180. return tokenResult;
  181. }
  182. token = (String) tokenResult.getBody().get("token");
  183. }
  184. Map<String, Object> params = new HashMap<>();
  185. params.put("order_sn", req.getOrderSn());
  186. Map<String, String> headers = new HashMap<>();
  187. headers.put("x-token", token);
  188. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/orderPayOnly", params, headers);
  189. JSONObject respJson = JSONObject.parseObject(resp);
  190. if (respJson.getIntValue("code") != 0) {
  191. return Result.fail(respJson.getString("msg"));
  192. }
  193. List<Orders> orders = JSONObject.parseArray(
  194. respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
  195. Orders.class
  196. );
  197. return Result.success(orders);
  198. }
  199. // 生成订单同时支付,如果已生成订单则是直接支付
  200. @PostMapping("/order")
  201. public Result order(@Valid @RequestBody OrderReq req) {
  202. String token = redisUtils.get(SUPPLY_TOKEN);
  203. if (token == null || token.isEmpty()) {
  204. Result tokenResult = fetchAndCacheToken();
  205. if (!tokenResult.isSuccess()) {
  206. return tokenResult;
  207. }
  208. token = (String) tokenResult.getBody().get("token");
  209. }
  210. Map<String, Object> params = new HashMap<>();
  211. params.put("spu", req.getSpu());
  212. params.put("address", req.getAddress());
  213. params.put("order_sn", req.getOrderSn());
  214. Map<String, String> headers = new HashMap<>();
  215. headers.put("x-token", token);
  216. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order", params, headers);
  217. JSONObject respJson = JSONObject.parseObject(resp);
  218. if (respJson.getIntValue("code") != 0) {
  219. return Result.fail(respJson.getString("msg"));
  220. }
  221. List<Orders> orders = JSONObject.parseArray(
  222. respJson.getJSONObject("data").getJSONArray("Orders").toJSONString(),
  223. Orders.class
  224. );
  225. log.info("下单并支付,存储订单");
  226. ordersService.addBatchOrder(orders);
  227. return Result.success(orders);
  228. }
  229. // 取消订单
  230. @PostMapping("/appCloseOrder")
  231. public Result appCloseOrder(@Valid @RequestBody CloseOrderReq req){
  232. String token = redisUtils.get(SUPPLY_TOKEN);
  233. if (token == null || token.isEmpty()) {
  234. Result tokenResult = fetchAndCacheToken();
  235. if (!tokenResult.isSuccess()) {
  236. return tokenResult;
  237. }
  238. token = (String) tokenResult.getBody().get("token");
  239. }
  240. Map<String, Object> params = new HashMap<>();
  241. params.put("order_id", req.getOrderId());
  242. Map<String, String> headers = new HashMap<>();
  243. headers.put("x-token", token);
  244. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/order/appCloseOrder", params, headers);
  245. JSONObject respJson = JSONObject.parseObject(resp);
  246. if (respJson.getIntValue("code") != 0) {
  247. return Result.fail(respJson.getString("msg"));
  248. }
  249. //{
  250. // "body": {
  251. // "MSG": "SUCCESS",
  252. // "CODE": 200,
  253. // "data": {
  254. // "errorOrdersSNs": null,
  255. // "successOrdersSNs": [
  256. // 195319850638
  257. // ]
  258. // }
  259. // },
  260. // "success": true
  261. //}
  262. return Result.success(respJson.getJSONObject("data"));
  263. }
  264. // =======================售后==========================================
  265. /**
  266. * 获取订单支持的售后方式
  267. * @param req
  268. * @return
  269. */
  270. @PostMapping("/getAfterSalesTypeNameMap")
  271. public Result getAfterSalesTypeNameMap(@Valid @RequestBody AfterSalesOrderReq req){
  272. String token = redisUtils.get(SUPPLY_TOKEN);
  273. if (token == null || token.isEmpty()) {
  274. Result tokenResult = fetchAndCacheToken();
  275. if (!tokenResult.isSuccess()) {
  276. return tokenResult;
  277. }
  278. token = (String) tokenResult.getBody().get("token");
  279. }
  280. Map<String, Object> params = new HashMap<>();
  281. params.put("order_id", req.getOrderId());
  282. Map<String, String> headers = new HashMap<>();
  283. headers.put("x-token", token);
  284. String resp = HttpUtil.restTemplateGet(prefixUrl + "/supplyapi/app/afterSales/getAfterSalesTypeNameMap", params, headers);
  285. JSONObject respJson = JSONObject.parseObject(resp);
  286. if (respJson.getIntValue("code") != 0) {
  287. return Result.fail(respJson.getString("msg"));
  288. }
  289. return Result.success(respJson.getJSONObject("data"));
  290. }
  291. //申请售后
  292. @PostMapping("/afterSalesCreate")
  293. public Result afterSalesCreate(@Valid @RequestBody AfterSalesOrderReq req){
  294. String token = redisUtils.get(SUPPLY_TOKEN);
  295. if (token == null || token.isEmpty()) {
  296. Result tokenResult = fetchAndCacheToken();
  297. if (!tokenResult.isSuccess()) {
  298. return tokenResult;
  299. }
  300. token = (String) tokenResult.getBody().get("token");
  301. }
  302. Map<String, Object> params = new HashMap<>();
  303. params.put("order_id", req.getOrderId());
  304. params.put("is_received",req.getIsReceived());
  305. params.put("order_item_id",req.getOrderItemId());
  306. Map<String, String> headers = new HashMap<>();
  307. headers.put("x-token", token);
  308. String resp = HttpUtil.restTemplatePost(prefixUrl + "/supplyapi/app/afterSales/create", params, headers);
  309. JSONObject respJson = JSONObject.parseObject(resp);
  310. if (respJson.getIntValue("code") != 0) {
  311. return Result.fail(respJson.getString("msg"));
  312. }
  313. return Result.success(respJson.getJSONObject("data"));
  314. }
  315. //回调接口,拿到回调数据后,再对数据做处理
  316. @PostMapping("/callback")
  317. public Map<String, Object> callback(@Valid @RequestBody Object req) {
  318. Map<String, Object> result = new HashMap<>();
  319. result.put("code", 0);
  320. OrderCallback callback=new OrderCallback();
  321. callback.setMessage(req);
  322. callbackDao.save(callback);
  323. return result;
  324. }
  325. }