|
|
|
|
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),
|
|
|
|
|
|
|
|
|
|
BCM("bcm", "【交行】", "", "BCM",
|
|
|
|
|
false,
|
|
|
|
|
"4",
|
|
|
|
|
"",
|
|
|
|
|
"bcm_pay/notify",
|
|
|
|
|
"",
|
|
|
|
|
"20", "21", "22"),
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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"),
|
|
|
|
|
;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
}
|