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 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 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 lambdaQueryWrapper = Wrappers.lambdaQuery(); lambdaQueryWrapper.eq(TCoinOrder::getPaymentIntentId, paymentIntentId); // QueryWrapper 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; } }