后台服务
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

102 lines
4.6 KiB

  1. package com.iformall.controller;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.github.binarywang.wxpay.v3.util.AesUtils;
  4. import com.iformall.annotation.AuthIgnore;
  5. import com.iformall.domain.po.WxAppinfo;
  6. import com.iformall.domain.po.WxPayAccount;
  7. import com.iformall.enums.EnumAppPlat;
  8. import com.iformall.service.ProductOrderService;
  9. import com.iformall.service.WxAppinfoService;
  10. import com.iformall.service.WxPayAccountService;
  11. import io.swagger.annotations.Api;
  12. import io.swagger.annotations.ApiOperation;
  13. import org.jdom2.JDOMException;
  14. import org.slf4j.Logger;
  15. import org.slf4j.LoggerFactory;
  16. import org.springframework.beans.factory.annotation.Autowired;
  17. import org.springframework.web.bind.annotation.*;
  18. import javax.servlet.http.HttpServletRequest;
  19. import javax.servlet.http.HttpServletResponse;
  20. import java.io.IOException;
  21. import java.util.HashMap;
  22. import java.util.Map;
  23. @RestController
  24. @RequestMapping("/payCallBack")
  25. @Api(description = "支付回调")
  26. public class CallbackPayController extends BaseController {
  27. private final Logger logger = LoggerFactory.getLogger(this.getClass());
  28. @Autowired
  29. private WxAppinfoService wxAppinfoService;
  30. @Autowired
  31. private WxPayAccountService wxPayAccountService;
  32. @Autowired
  33. private ProductOrderService productOrderService;
  34. @AuthIgnore
  35. @ApiOperation("支付回调")
  36. @PostMapping(value = "{projectType}/pay/v3")
  37. public void _payV3Notify(@PathVariable Integer projectType,@RequestBody Map<String, Object> paranMap, HttpServletResponse response) {
  38. logger.debug("[" + getIpAddr() + "] CallbackPayController::_payV3Notify");
  39. logger.info("微信支付回调结果通知{}"+JSONObject.toJSONString(paranMap));
  40. /**
  41. * {"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"}}
  42. */
  43. try{
  44. WxAppinfo appInfo = wxAppinfoService.getProjectCAppInfoFromRedis(projectType, EnumAppPlat.WX.getCode());
  45. WxPayAccount payAccount = wxPayAccountService.getByIdFromRedis(appInfo.getPayId());
  46. Map<String, String> resource = (Map<String, String>) paranMap.get("resource");
  47. String associatedData = resource.get("associated_data");
  48. String nonce = resource.get("nonce");
  49. String ciphertext = resource.get("ciphertext");
  50. //todo 解密回调数据
  51. String decryptString = AesUtils.decryptToString(associatedData, nonce, ciphertext, payAccount.getMerchantApiv3Key());
  52. logger.info("微信支付回调解密数据{}"+decryptString);
  53. JSONObject jsonObject = JSONObject.parseObject(decryptString);
  54. String out_order_no = jsonObject.getString("out_trade_no");
  55. //todo 处理支付数据
  56. }catch(Exception e){
  57. }
  58. response.setStatus(200);
  59. }
  60. @AuthIgnore
  61. @ApiOperation("支付回调")
  62. @PostMapping(value = "/ttNotify")
  63. public Map<String,Object> _ttNotify(@RequestBody Map<String, Object> paranMap, HttpServletRequest request, HttpServletResponse response) {
  64. logger.debug("[" + getIpAddr() + "] CallbackPayController::_ttNotify");
  65. Map<String,Object> resultMap = new HashMap<>();
  66. logger.info("抖音支付回调结果通知{}"+JSONObject.toJSONString(paranMap));
  67. /**
  68. * ----效验数据来源合法
  69. */
  70. try{
  71. String msg = (String) paranMap.get("msg");
  72. String type = (String) paranMap.get("type");
  73. Map<String, Object> pMap = JSONObject.parseObject(msg, Map.class);
  74. String appid = (String) pMap.get("app_id");
  75. if("payment".equals(type)){
  76. String out_order_no = (String)pMap.get("cp_orderno");
  77. //todo 处理订单支付状态
  78. }
  79. }catch(Exception e){
  80. }
  81. return resultMap;
  82. }
  83. }