package com.ynxbd.common.bean.enums; import com.ynxbd.ali.config.AliConfig; import com.ynxbd.ali.config.AliMedConfig; import com.ynxbd.common.helper.common.CodeHelper; import com.ynxbd.wx.config.WeChatConfig; import com.ynxbd.wx.wxfactory.medical.WxMedConfig; import lombok.ToString; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import java.util.ArrayList; import java.util.Arrays; import java.util.List; /** * 商户类型 * * @Author wsq */ @Slf4j @ToString public enum MerchantEnum { // 支付宝 ALI("ali", "【支付宝】", AliConfig.APP_ID, "ALI", false, "3", "25,26,27,28,29,30", "ali_pay/notify", "", "10", "11", "12"), // 微信 WX("wx", "【微信】", WeChatConfig.APP_ID, "WX" , false, "4", "10,11,12,13,14,15", "wx_pay/apiNotify", "wx_pay/nativeNotify", "0", "1", "2"), // Global Medical Communities WX_GMC("wx_gmc_mini", "【微信医共体】", WeChatConfig.GMC_MINI_APP_ID, "WMC", WX.IS_DEV, WX.HIS_PAY_WAY, WX.BAR_CODE_RULES, WX.NOTIFY_URL, WX.QR_NOTIFY_URL, WX.PAY_WAY_IN, WX.PAY_WAY_QR, WX.PAY_WAY_MICRO), WX_MEDICAL("wx_medical", "【微信医保】", WxMedConfig.MD_APP_ID, WX.OUT_TRADE_NO_PREFIX, WxMedConfig.IS_DEV, WX.HIS_PAY_WAY, WX.BAR_CODE_RULES, "medical/payNotify", "", WX.PAY_WAY_IN, WX.PAY_WAY_QR, WX.PAY_WAY_MICRO), ALI_MEDICAL("ali_medical", "【支付宝医保】", AliConfig.APP_ID, ALI.OUT_TRADE_NO_PREFIX, AliMedConfig.IS_DEV, "3", "25,26,27,28,29,30", "ali_pay/medical_notify", "", "10", "11", "12"), BCM("bcm", "【交行】", "", "BCM", false, "4", "", "bcm_pay/notify", "", "20", "21", "22"), JY("jy", "【京颐】", "", "JY", false, "4", "", "jy_pay/notify", "", WX.PAY_WAY_IN, WX.PAY_WAY_QR, WX.PAY_WAY_MICRO), ; public final String CODE; public final String NAME; public final String APP_ID; // 商户订单号前缀 public final String OUT_TRADE_NO_PREFIX; public final boolean IS_DEV; public final String HIS_PAY_WAY; // 条码规则 public final String BAR_CODE_RULES; // 支付回调通知地址 public final String NOTIFY_URL; public final String QR_NOTIFY_URL; // 程序内支付代码 public final String PAY_WAY_IN; // 扫码支付代码 public final String PAY_WAY_QR; // 盒子支付代码 public final String PAY_WAY_MICRO; MerchantEnum(String CODE, String NAME, String APP_ID, String OUT_TRADE_NO_PREFIX, boolean IS_DEV, String HIS_PAY_WAY, String BAR_CODE_RULES, String NOTIFY_URL, String QR_NOTIFY_URL, String PAY_WAY_IN, String PAY_WAY_QR, String PAY_WAY_MICRO) { this.CODE = CODE; this.NAME = NAME; this.APP_ID = APP_ID; this.OUT_TRADE_NO_PREFIX = OUT_TRADE_NO_PREFIX; this.IS_DEV = IS_DEV; this.HIS_PAY_WAY = HIS_PAY_WAY; this.BAR_CODE_RULES = BAR_CODE_RULES; this.NOTIFY_URL = NOTIFY_URL; this.QR_NOTIFY_URL = QR_NOTIFY_URL; this.PAY_WAY_IN = PAY_WAY_IN; this.PAY_WAY_QR = PAY_WAY_QR; this.PAY_WAY_MICRO = PAY_WAY_MICRO; } /** * 获取不重复的商户订单号 */ public String createOutTradeNo() { String prefix = this.OUT_TRADE_NO_PREFIX; if (prefix.length() > 4) { prefix = prefix.substring(0, 4); } prefix = prefix.toUpperCase(); return prefix + CodeHelper.get28UUID(); } /** * 匹配支付类型 * * @param code 用于匹配的编码 * @param defaultMerchant 为空时的返回 * @return enum */ public static MerchantEnum findEnumByCode(String code, MerchantEnum defaultMerchant) { if (ObjectUtils.isEmpty(code)) { return defaultMerchant; } for (MerchantEnum merchantEnum : MerchantEnum.values()) { if (merchantEnum.CODE.equals(code)) { return merchantEnum; } } return null; } public static MerchantEnum findEnumByCode(String code) { return findEnumByCode(code, null); } /** * 根据商户订单号获取支付类型 * * @param outTradeNo 商户订单号 * @return 支付类型 */ public static MerchantEnum findEnumByOutTradeNo(String outTradeNo) { if (outTradeNo == null) { return null; } if (outTradeNo.length() < 12) { log.error("商户订单号长度小于12位 outTradeNo={}", outTradeNo); return null; } if (MerchantEnum.WX.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.WX.OUT_TRADE_NO_PREFIX.length()))) { return MerchantEnum.WX; } else if (MerchantEnum.WX_GMC.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.WX_GMC.OUT_TRADE_NO_PREFIX.length()))) { return MerchantEnum.WX_GMC; } else if (MerchantEnum.ALI.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.ALI.OUT_TRADE_NO_PREFIX.length()))) { return MerchantEnum.ALI; } else if (MerchantEnum.BCM.OUT_TRADE_NO_PREFIX.toUpperCase().equals(outTradeNo.substring(0, MerchantEnum.BCM.OUT_TRADE_NO_PREFIX.length()))) { return MerchantEnum.BCM; } else { return null; } } /** * 根据(数据库中的payWay)判断支付方式 * * @param payWay 支付代码 * @return 支付方式 */ public static MerchantEnum findEnumByPayWay(String payWay) { if (ObjectUtils.isEmpty(payWay)) { return MerchantEnum.WX; } for (MerchantEnum item : MerchantEnum.values()) { if (item.PAY_WAY_IN.equals(payWay) || item.PAY_WAY_QR.equals(payWay) || item.PAY_WAY_MICRO.equals(payWay)) { return item; } } return null; } /** * 根据扫码的客户端判断支付类型 * * @param userAgent 用户客户端信息 * @return 支付类型 */ public static MerchantEnum findEnumByQr(String userAgent) { if (userAgent.contains("MicroMessenger")) { return MerchantEnum.WX; } else if (userAgent.contains("AlipayClient")) { return MerchantEnum.ALI; } else { return null; } } /** * 根据扫码的客户端判断支付类型 * * @param authCode 编码 * @return 支付类型 */ public static MerchantEnum findEnumByAuthCode(String authCode) { if (StringUtils.isEmpty(authCode) || authCode.length() < 16) { return null; } String prefix = authCode.substring(0, 2); for (MerchantEnum item : MerchantEnum.values()) { if (Arrays.asList(item.BAR_CODE_RULES.split(",")).contains(prefix)) { return item; } } return null; } /** * 拼接回调地址 */ public String getNotifyUrl(String outTradeNo, String notifyType) { return this.NOTIFY_URL + "?notifyType=" + notifyType + (ObjectUtils.isEmpty(outTradeNo) ? "" : ("&outTradeNo=" + outTradeNo)); } public boolean isWx() { return this == MerchantEnum.WX || this == MerchantEnum.WX_MEDICAL; } }