123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- package com.szwl.controller;
- import cn.com.sand.third.org.apache.commons.codec.digest.HmacUtils;
- import com.alibaba.fastjson.JSON;
- import com.alibaba.fastjson.JSONObject;
- import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
- import com.baomidou.mybatisplus.core.toolkit.Wrappers;
- import com.szwl.model.entity.TCoinOrder;
- import com.szwl.model.utils.PushUtils;
- import com.szwl.service.TCoinOrderService;
- import com.szwl.service.TEquipmentService;
- import lombok.extern.slf4j.Slf4j;
- import org.springframework.stereotype.Controller;
- import org.springframework.web.bind.annotation.PostMapping;
- import org.springframework.web.bind.annotation.RequestBody;
- import org.springframework.web.bind.annotation.ResponseBody;
- import javax.annotation.Resource;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- import java.util.Objects;
- import static com.szwl.common.WebhooksCommon.WEBHOOKS_KEY_PAYMENT_INTENT;
- import static com.szwl.common.WebhooksCommon.WEBHOOKS_KEY_REFUND;
- @Controller
- @Slf4j
- public class WebhookController {
- @Resource
- TCoinOrderService tCoinOrderService;
- @Resource
- TEquipmentService tEquipmentService;
- // @Resource
- // AirwallexService airwallexService;
- // public ResponseModel<?> createAWebhook(String[] envents, String requiredId, String url, String version) {
- // log.info("创建webhook");
- // String accessToken = airwallexService.getAccessToken();
- //
- // airwallexService.caWebhook(envents, requiredId, url, version);
- //
- // return
- // }
- /**
- * 获取退款的回调
- * @param request
- * @param response
- * @return
- */
- @ResponseBody
- @PostMapping("/webhook/refund")
- public String receiveRefund(HttpServletRequest request, @RequestBody String payload, HttpServletResponse response) {
- String responseBody = "";
- StringBuilder valueToDigest = new StringBuilder();
- // Get the timestamp from header
- String timestamp = request.getHeader("x-timestamp");
- valueToDigest.append(timestamp);
- valueToDigest.append(payload);
- // Get the signature from header
- String signature = request.getHeader("x-signature");
- // Get your secret
- String secret = getSecretRefund();
- if (HmacUtils.hmacSha256Hex(secret, valueToDigest.toString()).equals(signature)) {
- // Do something with event
- response.setStatus(HttpServletResponse.SC_OK);
- JSONObject jsonObject = JSON.parseObject(payload);
- JSONObject object = jsonObject.getJSONObject("data").getJSONObject("object");
- String refundId = object.getString("id");
- String status = object.getString("status");
- // JSONObject jsonObject = JSON.parseObject(payload);
- // String data = jsonObject.getString("data");
- // JSONObject jsonObject1 = JSON.parseObject(data);
- // String dataObject = jsonObject1.getString("object");
- // JSONObject jsonObject2 = JSON.parseObject(dataObject);
- // String refundId = jsonObject2.getString("id");
- // String status = jsonObject2.getString("status");
- // 如果退款成功
- if (status.equals("RECEIVED") || status.equals("ACCEPTED") || status.equals("SUCCEEDED")) {
- LambdaQueryWrapper<TCoinOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
- lambdaQueryWrapper.eq(TCoinOrder::getRefundId, refundId);
- TCoinOrder tCoinOrder = tCoinOrderService.getOne(lambdaQueryWrapper);
- if (Objects.isNull(tCoinOrder)) {
- return "订单为空/error";
- }
- // 设置订单支付状态为 已退款
- tCoinOrder.setStatus("3");
- tCoinOrderService.updateById(tCoinOrder);
- }
- } else {
- // Invalid signature
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- responseBody = "failed to verify the signature";
- }
- return responseBody;
- }
- /**
- * 获取支付意向的回调
- * @param request
- * @param payload
- * @param response
- * @return
- */
- @ResponseBody
- @PostMapping("/webhook/paymentIntent")
- public String receivePaymentIntent(HttpServletRequest request, @RequestBody String payload, HttpServletResponse response) {
- String responseBody = "";
- StringBuilder valueToDigest = new StringBuilder();
- // Get the timestamp from header
- String timestamp = request.getHeader("x-timestamp");
- valueToDigest.append(timestamp);
- valueToDigest.append(payload);
- // Get the signature from header
- String signature = request.getHeader("x-signature");
- // Get your secret
- String secret = getSecretPaymentInent();
- if (HmacUtils.hmacSha256Hex(secret, valueToDigest.toString()).equals(signature)) {
- // Do something with event
- response.setStatus(HttpServletResponse.SC_OK);
- responseBody = "payment intent ok";
- // 如果用户支付成功,将订单支付状态改成 1已支付。
- // JSONObject jsonObj = JSON.parseObject(payload);
- // String data = jsonObj.getString("data");
- // JSONObject jsonObject1 = JSON.parseObject(data);
- // String dataObject = jsonObject1.getString("object");
- // JSONObject jsonObject2 = JSON.parseObject(dataObject);
- // String paymentIntentId = jsonObject2.getString("id");
- // JSONObject data1 = jsonObj.getJSONObject("data");
- // JSONObject object = data1.getJSONObject("object");
- // String paymentIntentId = object.getString("id");
- // QueryWrapper<TOrderAbroad> tOrderAbroadQueryWrapper = new QueryWrapper<>();
- // tOrderAbroadQueryWrapper.eq("payment_intent_id",paymentIntentId);
- String paymentIntentId = JSON.parseObject(payload).getJSONObject("data").getJSONObject("object").getString("id");
- // JSONObject jsonObj = Optional.ofNullable(jsonObject)
- // .flatMap(jsonObject1 -> Optional.ofNullable(jsonObject1.getJSONObject("data")))
- // .flatMap(jsonObject1 -> Optional.ofNullable(jsonObject1.getJSONObject("object")))
- // .flatMap(jsonObject1 -> Optional.ofNullable(jsonObject1.getJSONObject("id")))
- // .orElse(null);
- // JSONObject idJson = Optional.ofNullable(jsonObj)
- // .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("data")))
- // .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("object")))
- // .flatMap(jsonObject -> Optional.ofNullable(jsonObject.getJSONObject("id")))
- // .orElse(null);
- // JSONObject idJson = Optional.ofNullable(jsonObj)
- // .map(jsonObject -> jsonObject.getJSONObject("data"))
- // .map(jsonObject -> jsonObject.getJSONObject("object"))
- // .map(jsonObject -> jsonObject.getJSONObject("id"))
- // .orElse(null);
- // String paymentIntentId = JSON.toJSONString(idJson);
- LambdaQueryWrapper<TCoinOrder> lambdaQueryWrapper = Wrappers.lambdaQuery();
- lambdaQueryWrapper.eq(TCoinOrder::getPaymentIntentId, paymentIntentId);
- // QueryWrapper<TOrderAbroad> lambdaQueryWrapper = new QueryWrapper<>();
- // lambdaQueryWrapper.eq("payment_intent_id", paymentIntentId);
- TCoinOrder coinOrder = tCoinOrderService.getOne(lambdaQueryWrapper);
- System.out.println(coinOrder);
- coinOrder.setStatus("1");
- tCoinOrderService.updateById(coinOrder);
- // 通知做糖
- JSONObject kindData = new JSONObject();
- kindData.put("sn", coinOrder.getMerchantOrderId());
- kindData.put("productName", coinOrder.getProductName());
- tEquipmentService.sentMessage(coinOrder.getClientId(), PushUtils.buildJson("pay_success", kindData.toString()).toString());
- } else {
- // Invalid signature
- response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
- responseBody = "failed to verify the signature";
- // TODO: 验签失败,先retrieve手动获取订单信息,如果成功,走上面那一套,如果失败不做处理
- }
- // System.out.println(response);
- // System.out.println(responseBody);
- return responseBody;
- }
- private String getSecretPaymentInent() {
- return WEBHOOKS_KEY_PAYMENT_INTENT;
- }
- private String getSecretRefund() {
- return WEBHOOKS_KEY_REFUND;
- }
- }
|