ExamOrderController.java 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. package com.keao.edu.user.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.keao.edu.auth.api.client.SysUserFeignService;
  4. import com.keao.edu.auth.api.entity.SysUser;
  5. import com.keao.edu.common.controller.BaseController;
  6. import com.keao.edu.common.entity.HttpResponseResult;
  7. import com.keao.edu.common.page.PageInfo;
  8. import com.keao.edu.thirdparty.adapay.ConfigInit;
  9. import com.keao.edu.thirdparty.adapay.Payment;
  10. import com.keao.edu.thirdparty.yqpay.Msg;
  11. import com.keao.edu.user.dto.ExamPaymentInfo;
  12. import com.keao.edu.user.dto.ExamRegistrationPaymentDto;
  13. import com.keao.edu.user.entity.Employee;
  14. import com.keao.edu.user.entity.ExamRegistrationPayment;
  15. import com.keao.edu.user.enums.TransStatusEnum;
  16. import com.keao.edu.user.page.ExamRegistrationPaymentQueryInfo;
  17. import com.keao.edu.user.service.EmployeeService;
  18. import com.keao.edu.user.service.ExamRegistrationPaymentService;
  19. import com.keao.edu.util.date.DateUtil;
  20. import com.keao.edu.util.http.HttpUtil;
  21. import io.swagger.annotations.Api;
  22. import io.swagger.annotations.ApiImplicitParam;
  23. import io.swagger.annotations.ApiImplicitParams;
  24. import io.swagger.annotations.ApiOperation;
  25. import org.springframework.beans.factory.annotation.Autowired;
  26. import org.springframework.security.access.prepost.PreAuthorize;
  27. import org.springframework.web.bind.annotation.*;
  28. import java.math.BigDecimal;
  29. import java.text.SimpleDateFormat;
  30. import java.util.*;
  31. @RestController
  32. @Api(tags = "报名订单服务")
  33. @RequestMapping(value = "examOrder")
  34. public class ExamOrderController extends BaseController {
  35. @Autowired
  36. private ExamRegistrationPaymentService examRegistrationPaymentService;
  37. @Autowired
  38. private SysUserFeignService sysUserFeignService;
  39. @Autowired
  40. private EmployeeService employeeService;
  41. @ApiOperation(value = "缴费列表")
  42. @GetMapping(value = "pageList")
  43. @PreAuthorize("@pcs.hasPermissions('examOrder/pageList')")
  44. public HttpResponseResult<PageInfo<ExamRegistrationPaymentDto>> pageList(ExamRegistrationPaymentQueryInfo queryInfo) {
  45. SysUser sysUser = sysUserFeignService.queryUserInfo();
  46. if (!sysUser.getIsSuperAdmin() && Objects.isNull(queryInfo.getOrganId())) {
  47. Employee employee = employeeService.get(sysUser.getId());
  48. if (Objects.nonNull(employee)) {
  49. queryInfo.setOrganId(employee.getOrganId());
  50. }
  51. }
  52. return succeed(examRegistrationPaymentService.pageList(queryInfo));
  53. }
  54. @ApiOperation("获取用户项目未支付的订单")
  55. @ApiImplicitParams({
  56. @ApiImplicitParam(name = "examinationBasicId", value = "项目id", required = true, dataType = "Integer")})
  57. @GetMapping(value = "/getExamIngOrder")
  58. public HttpResponseResult<ExamRegistrationPayment> getExamIngOrder(Long examinationBasicId) {
  59. SysUser sysUser = sysUserFeignService.queryUserInfo();
  60. return succeed(examRegistrationPaymentService.getExamIngOrder(examinationBasicId, sysUser.getId()));
  61. }
  62. @ApiOperation(value = "台牌支付")
  63. @PostMapping("/executePayment")
  64. @ApiImplicitParams({
  65. @ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
  66. @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
  67. @ApiImplicitParam(name = "payChannel", value = "支付方式", required = true, dataType = "String"),
  68. @ApiImplicitParam(name = "returnUrl", value = "返回页面", required = true, dataType = "String"),
  69. @ApiImplicitParam(name = "orderSubject", value = "订单标题", required = true, dataType = "String"),
  70. @ApiImplicitParam(name = "orderBody", value = "订单内容", required = true, dataType = "String"),
  71. @ApiImplicitParam(name = "sign", value = "sign", required = true, dataType = "String"),
  72. @ApiImplicitParam(name = "code", value = "code", required = true, dataType = "String")
  73. })
  74. public Object executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
  75. String openId = "";
  76. if (payChannel.equals("wx_pub")) {
  77. if (code == null || code.isEmpty()) {
  78. return failed("微信支付请先授权");
  79. }
  80. String wxMpOAuth2AccessTokenUrl = String.format(ConfigInit.wxMpOAuth2AccessTokenUrl, ConfigInit.wxAppId, ConfigInit.wxAppSecret, code);
  81. Map<String, String> weChatRes = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
  82. if (!weChatRes.containsKey("openid")) {
  83. return failed("授权失败,请重新授权");
  84. }
  85. openId = weChatRes.get("openid");
  86. }
  87. ExamRegistrationPayment examRegistrationPayment = examRegistrationPaymentService.getByOrderNo(orderNo);
  88. if (examRegistrationPayment == null) {
  89. return failed("订单不存在,请勿非法请求");
  90. }
  91. String merNos = examRegistrationPayment.getMerNo();
  92. Date createTime = examRegistrationPayment.getCreateTime();
  93. Calendar beforeTime = Calendar.getInstance();
  94. beforeTime.add(Calendar.MINUTE, -28);// 28 分钟之前的时间
  95. Date beforeDate = beforeTime.getTime();
  96. if (createTime.before(beforeDate)) {
  97. return failed("订单已超时,请重新下单");
  98. }
  99. amount = examRegistrationPayment.getTransAmount();
  100. Date expireDate = DateUtil.addMinutes(createTime, 30);
  101. String timeExpire = new SimpleDateFormat("yyyyMMddHHmmss").format(expireDate);
  102. Map<String, Object> paymentParams = new HashMap<>();
  103. paymentParams.put("app_id", ConfigInit.appId);
  104. paymentParams.put("order_no", orderNo);
  105. paymentParams.put("pay_channel", payChannel);
  106. paymentParams.put("pay_amt", amount);
  107. paymentParams.put("goods_title", orderSubject);
  108. paymentParams.put("goods_desc", orderBody);
  109. paymentParams.put("time_expire", timeExpire);
  110. if (!merNos.equals(ConfigInit.merNo)) {
  111. List<Map<String, Object>> divMembers = new ArrayList<>();
  112. Map<String, Object> divMember = new HashMap<>();
  113. divMember.put("member_id", merNos);//分佣账户
  114. divMember.put("amount", amount);//分佣金额
  115. divMember.put("fee_flag", "Y"); //承担手续费
  116. divMembers.add(divMember);
  117. paymentParams.put("div_members", JSON.toJSONString(divMembers));
  118. }
  119. Map<String, Object> expendParams = new HashMap<>(5);
  120. expendParams.put("open_id", openId);
  121. expendParams.put("is_raw", "1");
  122. expendParams.put("callback_url", returnUrl);
  123. expendParams.put("limit_pay", "1");
  124. paymentParams.put("expend", expendParams);
  125. Map<String, Object> payment = Payment.executePayment(paymentParams);
  126. examRegistrationPayment.setTransNo((String) payment.get("id"));
  127. examRegistrationPaymentService.update(examRegistrationPayment);
  128. return succeed(payment);
  129. }
  130. @ApiOperation(value = "获取订单状态及订单信息")
  131. @GetMapping(value = "/paymentResult")
  132. @ApiImplicitParams({
  133. @ApiImplicitParam(name = "orderNo", value = "订单编号", required = true, dataType = "String")})
  134. public HttpResponseResult<ExamPaymentInfo> getExamOrderInfo(String orderNo) {
  135. return succeed(examRegistrationPaymentService.getExamOrderInfo(orderNo));
  136. }
  137. @PostMapping("/notify")
  138. public Msg notify(@ModelAttribute Msg msg) throws Exception {
  139. Map<String, Object> rqMap = new LinkedHashMap<String, Object>();
  140. rqMap.put("code", msg.getCode());
  141. rqMap.put("msg", msg.getMsg());
  142. rqMap.put("responseType", msg.getResponseType());
  143. rqMap.put("responseParameters", msg.getResponseParameters());
  144. rqMap.put("sign", msg.getSign());
  145. //boolean rs = YqPayUtil.verify(rqMap);
  146. msg.setMsg("fail");
  147. Map<String, String> notifyMap = new HashMap<>();
  148. //if (rs) {
  149. notifyMap = JSON.parseObject(msg.getResponseParameters(), Map.class);
  150. //}
  151. //支付中订单存在,更新状态
  152. if (msg.getResponseType().equals("1") && notifyMap.size() > 0) {
  153. TransStatusEnum status = msg.getCode().equals("88") ? TransStatusEnum.SUCCESS : TransStatusEnum.FAILED;
  154. String channelType = notifyMap.get("channelType").equals("1") ? "WXPay" : (notifyMap.get("channelType").equals("2") ? "Alipay" : "quickPay");
  155. String memo = notifyMap.get("remarks");
  156. String orderNo = notifyMap.get("merMerOrderNo");
  157. String transNo = notifyMap.get("orderNo");
  158. notifyMap.put("channelType", channelType);
  159. notifyMap.put("memo", memo);
  160. notifyMap.put("transStatus", status.getCode());
  161. notifyMap.put("orderNo", orderNo);
  162. notifyMap.put("transNo", transNo);
  163. examRegistrationPaymentService.updateOrder(notifyMap);
  164. msg.setCode("000000");
  165. msg.setMsg("success");
  166. }
  167. return msg;
  168. }
  169. @PostMapping(value = "orderSuccess")
  170. public HttpResponseResult orderSuccess(String orderNo){
  171. Map<String, String> notifyMap = new HashMap<>();
  172. notifyMap.put("channelType", "Alipay");
  173. notifyMap.put("memo", "手动回调");
  174. notifyMap.put("transStatus", "SUCCESS");
  175. notifyMap.put("orderNo", orderNo);
  176. notifyMap.put("transNo", UUID.randomUUID().toString());
  177. examRegistrationPaymentService.updateOrder(notifyMap);
  178. return succeed();
  179. }
  180. @ApiOperation(value = "关闭订单")
  181. @PostMapping("/closeOrder")
  182. public HttpResponseResult closeOrder(String orderNo){
  183. return succeed(examRegistrationPaymentService.closeOrder(orderNo));
  184. }
  185. }