package com.iformall.controller; import com.alibaba.fastjson.JSONObject; import com.github.binarywang.wxpay.v3.util.AesUtils; import com.iformall.annotation.AuthIgnore; import com.iformall.domain.po.WxAppinfo; import com.iformall.domain.po.WxPayAccount; import com.iformall.enums.EnumAppPlat; import com.iformall.service.ProductOrderService; import com.iformall.service.WxAppinfoService; import com.iformall.service.WxPayAccountService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.jdom2.JDOMException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.util.HashMap; import java.util.Map; @RestController @RequestMapping("/payCallBack") @Api(description = "支付回调") public class CallbackPayController extends BaseController { private final Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired private WxAppinfoService wxAppinfoService; @Autowired private WxPayAccountService wxPayAccountService; @Autowired private ProductOrderService productOrderService; @AuthIgnore @ApiOperation("支付回调") @PostMapping(value = "{projectType}/pay/v3") public void _payV3Notify(@PathVariable Integer projectType,@RequestBody Map paranMap, HttpServletResponse response) { logger.debug("[" + getIpAddr() + "] CallbackPayController::_payV3Notify"); logger.info("微信支付回调结果通知{}"+JSONObject.toJSONString(paranMap)); /** * {"id":"4330b030-788f-5067-8c8a-69ee373d43ad","create_time":"2023-08-28T18:44:56+08:00","resource_type":"encrypt-resource","event_type":"TRANSACTION.SUCCESS","summary":"支付成功","resource":{"original_type":"transaction","algorithm":"AEAD_AES_256_GCM","ciphertext":"PneNTwSVDoirBNQsJstB/yX1dNMupj7uKQVEVfLOoyMSCqKh+KMwIdanidbcs6OnSy1Xmx4MploMaQ5rSg66sFDQ9nDuSVc4S/I3OVflu1l7z9vR+FJiztpTqhr/ekeNz9VivtqPPtn6N3dCyZb6iCEwnXT+TEB8SBZe4bPSPFGhB/MB9w1ZpqP14OvMDUnzKM15mdex6wmAJH6qIbd1aH3jrW/Lv7KeyfXEYrRDljq2Za6476UQxeAcsR3JA6QpWwrhYxpKFQEHuGMdiVC1KvQsP3+JUWOKSiQQ1r5upTACPI8n5B/kOeXJA8MnTgY/7lZiA6ys2dt8jqxzL8IlDracnlwvsiRAuXjRjcX6pYCz4q0HwIYb1nHXE+iRcSGm8h+xFFsnhGgxrhEVz6ARhK6ZtKtibCv7Ll/a/d090FBKtVXzCWB6cLMMmfrIwLQFqiFUtb6zsV/zusAJdwHZt3LmtgGahoV3+UPTnbztEAp5IJGz2imGPTsk7QpvKWQknf5FM/Z1fhr/vb+pZV5NGBZ+6l/mI8isA4HtljzNHU/PuKCGO8uWu6QFevgAftGGww==","associated_data":"transaction","nonce":"Hrcahgdp1eO6"}} */ try{ WxAppinfo appInfo = wxAppinfoService.getProjectCAppInfoFromRedis(projectType, EnumAppPlat.WX.getCode()); WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(appInfo.getPayId()); Map resource = (Map) paranMap.get("resource"); String associatedData = resource.get("associated_data"); String nonce = resource.get("nonce"); String ciphertext = resource.get("ciphertext"); //todo 解密回调数据 String decryptString = AesUtils.decryptToString(associatedData, nonce, ciphertext, payAccount.getMerchantApiv3Key()); logger.info("微信支付回调解密数据{}"+decryptString); JSONObject jsonObject = JSONObject.parseObject(decryptString); String out_order_no = jsonObject.getString("out_trade_no"); //todo 处理支付数据 }catch(Exception e){ } response.setStatus(200); } @AuthIgnore @ApiOperation("支付回调") @PostMapping(value = "/ttNotify") public Map _ttNotify(@RequestBody Map paranMap, HttpServletRequest request, HttpServletResponse response) { logger.debug("[" + getIpAddr() + "] CallbackPayController::_ttNotify"); Map resultMap = new HashMap<>(); logger.info("抖音支付回调结果通知{}"+JSONObject.toJSONString(paranMap)); /** * ----效验数据来源合法 */ try{ String msg = (String) paranMap.get("msg"); String type = (String) paranMap.get("type"); Map pMap = JSONObject.parseObject(msg, Map.class); String appid = (String) pMap.get("app_id"); if("payment".equals(type)){ String out_order_no = (String)pMap.get("cp_orderno"); //todo 处理订单支付状态 } }catch(Exception e){ } return resultMap; } }