WebhookController.java 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215
  1. package com.szwl.controller;
  2. import cn.com.sand.third.org.apache.commons.codec.digest.HmacUtils;
  3. import com.alibaba.fastjson.JSON;
  4. import com.alibaba.fastjson.JSONObject;
  5. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  6. import com.baomidou.mybatisplus.core.toolkit.Wrappers;
  7. import com.szwl.model.entity.TCoinOrder;
  8. import com.szwl.model.utils.PushUtils;
  9. import com.szwl.service.TCoinOrderService;
  10. import com.szwl.service.TEquipmentService;
  11. import lombok.extern.slf4j.Slf4j;
  12. import org.springframework.stereotype.Controller;
  13. import org.springframework.web.bind.annotation.PostMapping;
  14. import org.springframework.web.bind.annotation.RequestBody;
  15. import org.springframework.web.bind.annotation.ResponseBody;
  16. import javax.annotation.Resource;
  17. import javax.servlet.http.HttpServletRequest;
  18. import javax.servlet.http.HttpServletResponse;
  19. import java.util.Objects;
  20. import static com.szwl.common.WebhooksCommon.WEBHOOKS_KEY_PAYMENT_INTENT;
  21. import static com.szwl.common.WebhooksCommon.WEBHOOKS_KEY_REFUND;
  22. @Controller
  23. @Slf4j
  24. public class WebhookController {
  25. @Resource
  26. TCoinOrderService tCoinOrderService;
  27. @Resource
  28. TEquipmentService tEquipmentService;
  29. // @Resource
  30. // AirwallexService airwallexService;
  31. // public ResponseModel<?> createAWebhook(String[] envents, String requiredId, String url, String version) {
  32. // log.info("创建webhook");
  33. // String accessToken = airwallexService.getAccessToken();
  34. //
  35. // airwallexService.caWebhook(envents, requiredId, url, version);
  36. //
  37. // return
  38. // }
  39. /**
  40. * 获取退款的回调
  41. * @param request
  42. * @param response
  43. * @return
  44. */
  45. @ResponseBody
  46. @PostMapping("/webhook/refund")
  47. public String receiveRefund(HttpServletRequest request, @RequestBody String payload, HttpServletResponse response) {
  48. String responseBody = "";
  49. StringBuilder valueToDigest = new StringBuilder();
  50. // Get the timestamp from header
  51. String timestamp = request.getHeader("x-timestamp");
  52. valueToDigest.append(timestamp);
  53. valueToDigest.append(payload);
  54. // Get the signature from header
  55. String signature = request.getHeader("x-signature");
  56. // Get your secret
  57. String secret = getSecretRefund();
  58. if (HmacUtils.hmacSha256Hex(secret, valueToDigest.toString()).equals(signature)) {
  59. // Do something with event
  60. response.setStatus(HttpServletResponse.SC_OK);
  61. JSONObject jsonObject = JSON.parseObject(payload);
  62. JSONObject object = jsonObject.getJSONObject("data").getJSONObject("object");
  63. String refundId = object.getString("id");
  64. String status = object.getString("status");
  65. // JSONObject jsonObject = JSON.parseObject(payload);
  66. // String data = jsonObject.getString("data");
  67. // JSONObject jsonObject1 = JSON.parseObject(data);
  68. // String dataObject = jsonObject1.getString("object");
  69. // JSONObject jsonObject2 = JSON.parseObject(dataObject);
  70. // String refundId = jsonObject2.getString("id");
  71. // String status = jsonObject2.getString("status");
  72. // 如果退款成功
  73. if (status.equals("RECEIVED") || status.equals("ACCEPTED") || status.equals("SUCCEEDED")) {
  74. LambdaQueryWrapper<TCoinOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
  75. lambdaQueryWrapper.eq(TCoinOrder::getRefundId, refundId);
  76. TCoinOrder tCoinOrder = tCoinOrderService.getOne(lambdaQueryWrapper);
  77. if (Objects.isNull(tCoinOrder)) {
  78. return "订单为空/error";
  79. }
  80. // 设置订单支付状态为 已退款
  81. tCoinOrder.setStatus("3");
  82. tCoinOrderService.updateById(tCoinOrder);
  83. }
  84. } else {
  85. // Invalid signature
  86. response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
  87. responseBody = "failed to verify the signature";
  88. }
  89. return responseBody;
  90. }
  91. /**
  92. * 获取支付意向的回调
  93. * @param request
  94. * @param payload
  95. * @param response
  96. * @return
  97. */
  98. @ResponseBody
  99. @PostMapping("/webhook/paymentIntent")
  100. public String receivePaymentIntent(HttpServletRequest request, @RequestBody String payload, HttpServletResponse response) {
  101. String responseBody = "";
  102. StringBuilder valueToDigest = new StringBuilder();
  103. // Get the timestamp from header
  104. String timestamp = request.getHeader("x-timestamp");
  105. valueToDigest.append(timestamp);
  106. valueToDigest.append(payload);
  107. // Get the signature from header
  108. String signature = request.getHeader("x-signature");
  109. // Get your secret
  110. String secret = getSecretPaymentInent();
  111. if (HmacUtils.hmacSha256Hex(secret, valueToDigest.toString()).equals(signature)) {
  112. // Do something with event
  113. response.setStatus(HttpServletResponse.SC_OK);
  114. responseBody = "payment intent ok";
  115. // 如果用户支付成功,将订单支付状态改成 1已支付。
  116. // JSONObject jsonObj = JSON.parseObject(payload);
  117. // String data = jsonObj.getString("data");
  118. // JSONObject jsonObject1 = JSON.parseObject(data);
  119. // String dataObject = jsonObject1.getString("object");
  120. // JSONObject jsonObject2 = JSON.parseObject(dataObject);
  121. // String paymentIntentId = jsonObject2.getString("id");
  122. // JSONObject data1 = jsonObj.getJSONObject("data");
  123. // JSONObject object = data1.getJSONObject("object");
  124. // String paymentIntentId = object.getString("id");
  125. // QueryWrapper<TOrderAbroad> tOrderAbroadQueryWrapper = new QueryWrapper<>();
  126. // tOrderAbroadQueryWrapper.eq("payment_intent_id",paymentIntentId);
  127. String paymentIntentId = JSON.parseObject(payload).getJSONObject("data").getJSONObject("object").getString("id");
  128. // JSONObject jsonObj = Optional.ofNullable(jsonObject)
  129. // .flatMap(jsonObject1 -> Optional.ofNullable(jsonObject1.getJSONObject("data")))
  130. // .flatMap(jsonObject1 -> Optional.ofNullable(jsonObject1.getJSONObject("object")))
  131. // .flatMap(jsonObject1 -> Optional.ofNullable(jsonObject1.getJSONObject("id")))
  132. // .orElse(null);
  133. // JSONObject idJson = Optional.ofNullable(jsonObj)
  134. // .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("data")))
  135. // .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("object")))
  136. // .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("id")))
  137. // .orElse(null);
  138. // JSONObject idJson = Optional.ofNullable(jsonObj)
  139. // .map(jsonObject -> jsonObject.getJSONObject("data"))
  140. // .map(jsonObject -> jsonObject.getJSONObject("object"))
  141. // .map(jsonObject -> jsonObject.getJSONObject("id"))
  142. // .orElse(null);
  143. // String paymentIntentId = JSON.toJSONString(idJson);
  144. LambdaQueryWrapper<TCoinOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
  145. lambdaQueryWrapper.eq(TCoinOrder::getPaymentIntentId, paymentIntentId);
  146. // QueryWrapper<TOrderAbroad> lambdaQueryWrapper = new QueryWrapper<>();
  147. // lambdaQueryWrapper.eq("payment_intent_id", paymentIntentId);
  148. TCoinOrder coinOrder = tCoinOrderService.getOne(lambdaQueryWrapper);
  149. System.out.println(coinOrder);
  150. coinOrder.setStatus("1");
  151. tCoinOrderService.updateById(coinOrder);
  152. // 通知做糖
  153. JSONObject kindData = new JSONObject();
  154. kindData.put("sn", coinOrder.getMerchantOrderId());
  155. kindData.put("productName", coinOrder.getProductName());
  156. tEquipmentService.sentMessage(coinOrder.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
  157. } else {
  158. // Invalid signature
  159. response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
  160. responseBody = "failed to verify the signature";
  161. // TODO: 验签失败,先retrieve手动获取订单信息,如果成功,走上面那一套,如果失败不做处理
  162. }
  163. // System.out.println(response);
  164. // System.out.println(responseBody);
  165. return responseBody;
  166. }
  167. private String getSecretPaymentInent() {
  168. return WEBHOOKS_KEY_PAYMENT_INTENT;
  169. }
  170. private String getSecretRefund() {
  171. return WEBHOOKS_KEY_REFUND;
  172. }
  173. }