QrCodeBbgPaymentAdapt.java 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. package com.java110.acct.smo.impl;
  2. import com.alibaba.fastjson.JSONObject;
  3. import com.java110.acct.payment.adapt.bbgpay.EncryptDecryptFactory;
  4. import com.java110.acct.smo.IQrCodePaymentSMO;
  5. import com.java110.core.client.RestTemplate;
  6. import com.java110.core.factory.CommunitySettingFactory;
  7. import com.java110.core.log.LoggerFactory;
  8. import com.java110.intf.store.ISmallWeChatInnerServiceSMO;
  9. import com.java110.utils.cache.MappingCache;
  10. import com.java110.utils.constant.MappingConstant;
  11. import com.java110.utils.constant.WechatConstant;
  12. import com.java110.utils.util.PayUtil;
  13. import com.java110.vo.ResultVo;
  14. import org.slf4j.Logger;
  15. import org.springframework.beans.factory.annotation.Autowired;
  16. import org.springframework.stereotype.Service;
  17. import java.util.*;
  18. /**
  19. * 微信支付
  20. */
  21. @Service
  22. public class QrCodeBbgPaymentAdapt implements IQrCodePaymentSMO {
  23. private static Logger logger = LoggerFactory.getLogger(QrCodeBbgPaymentAdapt.class);
  24. //微信支付
  25. public static final String DOMAIN_WECHAT_PAY = "WECHAT_PAY";
  26. // 微信服务商支付开关
  27. public static final String WECHAT_SERVICE_PAY_SWITCH = "WECHAT_SERVICE_PAY_SWITCH";
  28. //开关ON打开
  29. public static final String WECHAT_SERVICE_PAY_SWITCH_ON = "ON";
  30. private static final String WECHAT_SERVICE_APP_ID = "SERVICE_APP_ID";
  31. private static final String WECHAT_SERVICE_MCH_ID = "SERVICE_MCH_ID";
  32. private static String VERSION = "1.0";
  33. private static String SIGN_TYPE = "RSA2";// 加密算法:SM4、RSA2
  34. private static String gzhPayUrl = "https://mbank.bankofbbg.com/www/corepaycer/ScanCodePay";
  35. private static String queryUrl = "https://mbank.bankofbbg.com/www/corepaycer/QueryTxnInfo";// 交易查询地址
  36. @Autowired
  37. private ISmallWeChatInnerServiceSMO smallWeChatInnerServiceSMOImpl;
  38. @Autowired
  39. private RestTemplate outRestTemplate;
  40. @Override
  41. public ResultVo pay(String communityId, String orderNum, double money, String authCode, String feeName,String paymentPoolId) throws Exception {
  42. logger.info("【小程序支付】 统一下单开始, 订单编号=" + orderNum);
  43. SortedMap<String, String> resultMap = new TreeMap<String, String>();
  44. //生成支付金额,开发环境处理支付金额数到0.01、0.02、0.03元
  45. double payAmount = PayUtil.getPayAmountByEnv(MappingCache.getValue(MappingConstant.ENV_DOMAIN, "HC_ENV"), money);
  46. //添加或更新支付记录(参数跟进自己业务需求添加)
  47. Map<String, String> resMap = null;
  48. logger.debug("resMap=" + resMap);
  49. String systemName = MappingCache.getValue(WechatConstant.WECHAT_DOMAIN, WechatConstant.PAY_GOOD_NAME);
  50. String mchtNo_SM4 = CommunitySettingFactory.getValue(communityId, "mchtNo_SM4");
  51. String productNo_SM4 = CommunitySettingFactory.getValue(communityId, "productNo_SM4");
  52. String publicKey_SM4 = CommunitySettingFactory.getValue(communityId, "publicKey_SM4");
  53. Map<String, Object> params = new HashMap<>();
  54. params.put("version", VERSION);// 版本号 1.0
  55. params.put("mcht_no", mchtNo_SM4);// 收款商户编号
  56. params.put("product_no", productNo_SM4);// 产品编号
  57. params.put("tran_no", orderNum);// 商户流水
  58. params.put("auth_code", authCode);// 码类型
  59. params.put("amt", payAmount);// 交易金额
  60. params.put("ware_name", feeName);// 商品名称
  61. params.put("device_ip", "172.0.0.1");// 商户数据包
  62. params.put("recog_no", "123123");// 交易终端编号
  63. String decryParams = EncryptDecryptFactory.execute(communityId, gzhPayUrl, params);
  64. JSONObject paramOut = JSONObject.parseObject(decryParams);
  65. if (!"0000".equals(paramOut.getString("return_code"))
  66. || !"SUCCESS".equals(paramOut.getString("status"))
  67. ) {
  68. return new ResultVo(ResultVo.CODE_ERROR, "支付失败" + paramOut.getString("return_message"));
  69. }
  70. if ("FAIL".equals(paramOut.getString("deal_status"))) {
  71. return new ResultVo(ResultVo.CODE_ERROR, "业务失败");
  72. }
  73. if ("SUCCESS".equals(paramOut.getString("deal_status"))) {
  74. return new ResultVo(ResultVo.CODE_OK, "成功");
  75. } else {
  76. return new ResultVo(ResultVo.CODE_ERROR, "等待用户支付中");
  77. }
  78. }
  79. public ResultVo checkPayFinish(String communityId, String orderNum,String paymentPoolId) {
  80. Map<String, String> result = null;
  81. String mchtNo_SM4 = CommunitySettingFactory.getValue(communityId, "mchtNo_SM4");
  82. String productNo_SM4 = CommunitySettingFactory.getValue(communityId, "productNo_SM4");
  83. String publicKey_SM4 = CommunitySettingFactory.getValue(communityId, "publicKey_SM4");
  84. Map<String, Object> params = new HashMap<>();
  85. params.put("version", VERSION);// 版本号 1.0
  86. params.put("mcht_no", mchtNo_SM4);// 收款商户编号
  87. params.put("tran_no", orderNum);// 商户流水
  88. params.put("txn_no", "");// 支付流水
  89. // 对准备加签参数排序
  90. String decryParams = EncryptDecryptFactory.execute(communityId, queryUrl, params);
  91. /**
  92. * {"amt":"0.01","deal_status":"PROCESSING","jump_url":"","mcht_name":"广西蓉慧科技有限公司","mcht_no":"MCT2023060100029734",
  93. * "real_amt":"0.01","return_code":"5019","return_message":"用户正在输入密码,请等待","status":"SUCCESS",
  94. * "tran_no":"962023092519710062","txn_date":"20230925",
  95. * "txn_no":"P11082023092523543816778858","txn_time":"235438","ware_name":"云星花园-1栋1单元101室-住宅物业费"}
  96. */
  97. JSONObject paramOut = JSONObject.parseObject(decryParams);
  98. if("PROCESSING".equals(paramOut.getString("deal_status")) && "5019".equals(paramOut.getString("return_code"))){
  99. return new ResultVo(ResultVo.CODE_WAIT_PAY, "等待支付完成");
  100. }
  101. if (!"SUCCESS".equals(paramOut.getString("status"))
  102. || !"SUCCESS".equals(paramOut.getString("deal_status"))) {
  103. throw new IllegalArgumentException("支付失败" + paramOut.getString("return_message"));
  104. }
  105. if (!"0000".equals(paramOut.getString("return_code"))
  106. && !"0001".equals(paramOut.getString("return_code"))
  107. ) {
  108. throw new IllegalArgumentException("支付失败" + paramOut.getString("return_message"));
  109. }
  110. if ("0000".equals(paramOut.getString("return_code"))) {
  111. return new ResultVo(ResultVo.CODE_OK, "成功");
  112. } else {
  113. return new ResultVo(ResultVo.CODE_WAIT_PAY, "等待支付完成");
  114. }
  115. }
  116. }