ExamOrderController.java 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package com.keao.edu.controller;
  2. import com.alibaba.fastjson.JSON;
  3. import com.alibaba.fastjson.JSONObject;
  4. import com.keao.edu.auth.api.client.SysUserFeignService;
  5. import com.keao.edu.auth.api.entity.SysUser;
  6. import com.keao.edu.common.controller.BaseController;
  7. import com.keao.edu.common.entity.HttpResponseResult;
  8. import com.keao.edu.thirdparty.adapay.ConfigInit;
  9. import com.keao.edu.thirdparty.adapay.Payment;
  10. import com.keao.edu.user.dto.ExamPaymentInfo;
  11. import com.keao.edu.user.entity.ExamRegistrationPayment;
  12. import com.keao.edu.user.service.ExamRegistrationPaymentService;
  13. import com.keao.edu.util.date.DateUtil;
  14. import com.keao.edu.util.http.HttpUtil;
  15. import io.swagger.annotations.Api;
  16. import io.swagger.annotations.ApiImplicitParam;
  17. import io.swagger.annotations.ApiImplicitParams;
  18. import io.swagger.annotations.ApiOperation;
  19. import org.springframework.beans.factory.annotation.Autowired;
  20. import org.springframework.util.DigestUtils;
  21. import org.springframework.web.bind.annotation.GetMapping;
  22. import org.springframework.web.bind.annotation.PostMapping;
  23. import org.springframework.web.bind.annotation.RequestMapping;
  24. import org.springframework.web.bind.annotation.RestController;
  25. import java.math.BigDecimal;
  26. import java.text.SimpleDateFormat;
  27. import java.util.*;
  28. @RestController
  29. @Api(tags = "报名订单服务")
  30. @RequestMapping(value = "examOrder")
  31. public class ExamOrderController extends BaseController {
  32. @Autowired
  33. private ExamRegistrationPaymentService examRegistrationPaymentService;
  34. @Autowired
  35. private SysUserFeignService sysUserFeignService;
  36. @ApiOperation("获取用户项目未支付的订单")
  37. @ApiImplicitParams({
  38. @ApiImplicitParam(name = "examinationBasicId", value = "项目id", required = true, dataType = "Integer")})
  39. @GetMapping(value = "/getExamIngOrder")
  40. public HttpResponseResult<ExamRegistrationPayment> getExamIngOrder(Long examinationBasicId) {
  41. SysUser sysUser = sysUserFeignService.queryUserInfo();
  42. return succeed(examRegistrationPaymentService.getExamIngOrder(examinationBasicId, sysUser.getId()));
  43. }
  44. @ApiOperation(value = "台牌支付")
  45. @PostMapping("/executePayment")
  46. @ApiImplicitParams({
  47. @ApiImplicitParam(name = "amount", value = "支付金额", required = true, dataType = "BigDecimal"),
  48. @ApiImplicitParam(name = "orderNo", value = "订单号", required = true, dataType = "String"),
  49. @ApiImplicitParam(name = "payChannel", value = "支付方式", required = true, dataType = "String"),
  50. @ApiImplicitParam(name = "returnUrl", value = "返回页面", required = true, dataType = "String"),
  51. @ApiImplicitParam(name = "orderSubject", value = "订单标题", required = true, dataType = "String"),
  52. @ApiImplicitParam(name = "orderBody", value = "订单内容", required = true, dataType = "String"),
  53. @ApiImplicitParam(name = "sign", value = "sign", required = true, dataType = "String"),
  54. @ApiImplicitParam(name = "code", value = "code", required = true, dataType = "String")
  55. })
  56. public Object executePayment(BigDecimal amount, String orderNo, String payChannel, String returnUrl,String notifyUrl, String orderSubject, String orderBody, String sign, String code, String platform) throws Exception {
  57. Map<String, Object> signParams = new LinkedHashMap<>();
  58. signParams.put("appId", ConfigInit.appId);
  59. signParams.put("amount", amount);
  60. signParams.put("orderNo", orderNo);
  61. // signParams.put("notifyUrl", notifyUrl);
  62. // signParams.put("returnUrl", returnUrl);
  63. signParams.put("orderSubject", orderSubject);
  64. signParams.put("orderBody", orderBody);
  65. signParams.put("wxAppId", ConfigInit.wxAppId);
  66. String originalStr = JSONObject.toJSONString(signParams);
  67. String newSign = DigestUtils.md5DigestAsHex(originalStr.getBytes());
  68. if(!sign.equals(newSign)){
  69. return failed("请勿非法请求");
  70. }
  71. String openId = "";
  72. if (payChannel.equals("wx_pub")) {
  73. if (code == null || code.isEmpty()) {
  74. return failed("微信支付请先授权");
  75. }
  76. String wxMpOAuth2AccessTokenUrl = String.format(ConfigInit.wxMpOAuth2AccessTokenUrl, ConfigInit.wxAppId, ConfigInit.wxAppSecret, code);
  77. Map<String, String> weChatRes = JSON.parseObject(HttpUtil.get(wxMpOAuth2AccessTokenUrl, new HashMap<>()), Map.class);
  78. if (!weChatRes.containsKey("openid")) {
  79. return failed("授权失败,请重新授权");
  80. }
  81. openId = weChatRes.get("openid");
  82. }
  83. ExamRegistrationPayment examRegistrationPayment = examRegistrationPaymentService.getByOrderNo(orderNo);
  84. if (examRegistrationPayment == null) {
  85. return failed("订单不存在,请勿非法请求");
  86. }
  87. String merNos = examRegistrationPayment.getMerNo();
  88. Date createTime = examRegistrationPayment.getCreateTime();
  89. Calendar beforeTime = Calendar.getInstance();
  90. beforeTime.add(Calendar.MINUTE, -28);// 28 分钟之前的时间
  91. Date beforeDate = beforeTime.getTime();
  92. if (createTime.before(beforeDate)) {
  93. return failed("订单已超时,请重新下单");
  94. }
  95. amount = examRegistrationPayment.getTransAmount().setScale(2,BigDecimal.ROUND_HALF_UP);
  96. Date expireDate = DateUtil.addMinutes(createTime, 30);
  97. String timeExpire = new SimpleDateFormat("yyyyMMddHHmmss").format(expireDate);
  98. Map<String, Object> paymentParams = new HashMap<>();
  99. paymentParams.put("app_id", ConfigInit.appId);
  100. paymentParams.put("order_no", orderNo);
  101. paymentParams.put("pay_channel", payChannel);
  102. paymentParams.put("pay_amt", amount);
  103. paymentParams.put("goods_title", orderSubject);
  104. paymentParams.put("goods_desc", orderBody);
  105. paymentParams.put("time_expire", timeExpire);
  106. if (!merNos.equals(ConfigInit.merNo)) {
  107. List<Map<String, Object>> divMembers = new ArrayList<>();
  108. Map<String, Object> divMember = new HashMap<>();
  109. divMember.put("member_id", merNos);//分佣账户
  110. divMember.put("amount", amount);//分佣金额
  111. divMember.put("fee_flag", "Y"); //承担手续费
  112. divMembers.add(divMember);
  113. paymentParams.put("div_members", JSON.toJSONString(divMembers));
  114. }
  115. Map<String, Object> expendParams = new HashMap<>(5);
  116. expendParams.put("open_id", openId);
  117. expendParams.put("is_raw", "1");
  118. expendParams.put("callback_url", returnUrl);
  119. expendParams.put("limit_pay", "1");
  120. paymentParams.put("expend", expendParams);
  121. Map<String, Object> payment = Payment.executePayment(paymentParams);
  122. examRegistrationPayment.setTransNo((String) payment.get("id"));
  123. examRegistrationPaymentService.update(examRegistrationPayment);
  124. return succeed(payment);
  125. }
  126. @ApiOperation(value = "获取订单状态及订单信息")
  127. @GetMapping(value = "/paymentResult")
  128. @ApiImplicitParams({
  129. @ApiImplicitParam(name = "orderNo", value = "订单编号", required = true, dataType = "String")})
  130. public HttpResponseResult<ExamPaymentInfo> getExamOrderInfo(String orderNo) {
  131. return succeed(examRegistrationPaymentService.getExamOrderInfo(orderNo));
  132. }
  133. @PostMapping(value = "orderSuccess")
  134. public HttpResponseResult orderSuccess(String orderNo){
  135. Map<String, String> notifyMap = new HashMap<>();
  136. notifyMap.put("channelType", "Alipay");
  137. notifyMap.put("memo", "手动回调");
  138. notifyMap.put("transStatus", "SUCCESS");
  139. notifyMap.put("orderNo", orderNo);
  140. notifyMap.put("transNo", UUID.randomUUID().toString());
  141. examRegistrationPaymentService.updateOrder(notifyMap);
  142. return succeed();
  143. }
  144. @ApiOperation(value = "关闭订单")
  145. @PostMapping("/closeOrder")
  146. public HttpResponseResult closeOrder(String orderNo){
  147. return succeed(examRegistrationPaymentService.closeOrder(orderNo));
  148. }
  149. }