CashierCmd.java 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131
  1. package com.java110.acct.cmd.payment;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.acct.payment.IPaymentBusiness;
  4. import com.java110.acct.payment.IPaymentFactoryAdapt;
  5. import com.java110.core.annotation.Java110Cmd;
  6. import com.java110.core.context.ICmdDataFlowContext;
  7. import com.java110.core.event.cmd.Cmd;
  8. import com.java110.core.event.cmd.CmdEvent;
  9. import com.java110.core.log.LoggerFactory;
  10. import com.java110.doc.annotation.*;
  11. import com.java110.dto.payment.PaymentOrderDto;
  12. import com.java110.utils.cache.CommonCache;
  13. import com.java110.utils.cache.MappingCache;
  14. import com.java110.utils.constant.MappingConstant;
  15. import com.java110.utils.constant.WechatConstant;
  16. import com.java110.utils.exception.CmdException;
  17. import com.java110.utils.factory.ApplicationContextFactory;
  18. import com.java110.utils.util.Assert;
  19. import com.java110.utils.util.StringUtil;
  20. import org.slf4j.Logger;
  21. import org.springframework.http.HttpStatus;
  22. import org.springframework.http.ResponseEntity;
  23. import java.text.ParseException;
  24. import java.util.Map;
  25. /**
  26. * 统一支付接口
  27. */
  28. @Java110Cmd(serviceCode = "payment.cashier")
  29. public class CashierCmd extends Cmd {
  30. private static final Logger logger = LoggerFactory.getLogger(CashierCmd.class);
  31. protected static final String DEFAULT_PAYMENT_ADAPT = "wechatPaymentFactory";// 默认微信通用支付
  32. /**
  33. * 校验
  34. *
  35. * @param event 事件对象
  36. * @param context 请求报文数据
  37. * @param reqJson
  38. * @throws CmdException
  39. */
  40. @Override
  41. public void validate(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException {
  42. Assert.hasKeyAndValue(reqJson, "business", "未包含业务");
  43. Assert.hasKeyAndValue(reqJson, "cashierUserId", "未包含收银人员");
  44. context.getReqHeaders().put("user-id", reqJson.getString("cashierUserId"));
  45. }
  46. @Override
  47. public void doCmd(CmdEvent event, ICmdDataFlowContext context, JSONObject reqJson) throws CmdException, ParseException {
  48. logger.debug(">>>>>>>>>>>>>>>>支付参数报文,{}", reqJson.toJSONString());
  49. String appId = context.getReqHeaders().get("app-id");
  50. String userId = reqJson.getString("cashierUserId");
  51. //1.0 查询当前支付的业务
  52. IPaymentBusiness paymentBusiness = ApplicationContextFactory.getBean(reqJson.getString("business"), IPaymentBusiness.class);
  53. if (paymentBusiness == null) {
  54. throw new CmdException("当前支付业务不支持");
  55. }
  56. //2.0 相应业务 下单 返回 单号 ,金额,
  57. PaymentOrderDto paymentOrderDto = paymentBusiness.unified(context, reqJson);
  58. paymentOrderDto.setAppId(appId);
  59. paymentOrderDto.setUserId(userId);
  60. logger.debug(">>>>>>>>>>>>>>>>支付业务下单返回,{}", JSONObject.toJSONString(paymentOrderDto));
  61. String env = MappingCache.getValue(MappingConstant.ENV_DOMAIN, "HC_ENV");
  62. // 这里 演示环境不向微信下单
  63. if ("DEV".equals(env) || "TEST".equals(env)) {
  64. paymentBusiness.notifyPayment(paymentOrderDto, reqJson);
  65. JSONObject param = new JSONObject();
  66. param.put("code", "100");
  67. param.put("msg", "演示环境不触发支付");
  68. context.setResponseEntity(new ResponseEntity(JSONObject.toJSONString(param), HttpStatus.OK));
  69. return;
  70. }
  71. // 3.0 如果支付金额为0 直接调用 支付完通知接口
  72. if (paymentOrderDto.getMoney() <= 0) {
  73. paymentBusiness.notifyPayment(paymentOrderDto, reqJson);
  74. JSONObject param = new JSONObject();
  75. param.put("code", "100");
  76. param.put("msg", "扣费为0回调成功");
  77. context.setResponseEntity(new ResponseEntity(JSONObject.toJSONString(param), HttpStatus.OK));
  78. return;
  79. }
  80. // 3.0 寻找当前支付适配器
  81. String payAdapt = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAYMENT_ADAPT);
  82. payAdapt = StringUtil.isEmpty(payAdapt) ? DEFAULT_PAYMENT_ADAPT : payAdapt;
  83. if (reqJson.containsKey("payAdapt") && !StringUtil.isEmpty(reqJson.getString("payAdapt"))) {
  84. payAdapt = reqJson.getString("payAdapt");
  85. }
  86. IPaymentFactoryAdapt tPayAdapt = ApplicationContextFactory.getBean(payAdapt, IPaymentFactoryAdapt.class);
  87. // 4.0 相应支付厂家下单
  88. Map result = null;
  89. try {
  90. result = tPayAdapt.java110Payment(paymentOrderDto, reqJson, context);
  91. } catch (Exception e) {
  92. logger.error("支付异常", e);
  93. throw new CmdException(e.getLocalizedMessage());
  94. }
  95. ResponseEntity<String> responseEntity = new ResponseEntity(JSONObject.toJSONString(result), HttpStatus.OK);
  96. logger.debug("调用支付厂家返回,{}", responseEntity);
  97. context.setResponseEntity(responseEntity);
  98. // redis 中 保存 请求参数
  99. CommonCache.setValue("unifiedPayment_" + paymentOrderDto.getOrderId(), reqJson.toJSONString(), CommonCache.PAY_DEFAULT_EXPIRE_TIME);
  100. }
  101. }