微信后端代码
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.

212 lines
5.9 KiB

package com.ynxbd.common.bean.enums;
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", "【支付宝】", "3",
"25,26,27,28,29,30",
"ali_pay/notify",
"",
"10", "11", "12"),
// 微信
WX("wx", "【微信】", "4",
"10,11,12,13,14,15",
"wx_pay/apiNotify",
"wx_pay/nativeNotify",
"0", "1", "2"),
BCM("bcm", "【交行】", "4",
"",
"bcm_pay/notify",
"",
"20", "21", "22"),
WX_MEDICAL("wx_medical", "【微信医保】", "4",
"10,11,12,13,14,15",
"medical/payNotify",
"",
"0", "1", "2");
public final String CODE;
public final String NAME;
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 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.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 static MerchantEnum getMerchantEnumByCode(String code) {
if (ObjectUtils.isEmpty(code)) {
return null;
}
for (MerchantEnum merchantEnum : MerchantEnum.values()) {
if (merchantEnum.CODE.equals(code)) {
return merchantEnum;
}
}
return null;
}
/**
* 根据商户订单号获取支付类型
*
* @param outTradeNo 商户订单号
* @return 支付类型
*/
public static MerchantEnum getMerchantEnumByOutTradeNo(String outTradeNo) {
if (outTradeNo == null) {
return null;
}
if (outTradeNo.length() < 12) {
log.error("订单号长度小于4 outTradeNo={}", outTradeNo);
return null;
}
if (MerchantEnum.WX.CODE.toUpperCase().equals(outTradeNo.substring(0, 2))) {
return MerchantEnum.WX;
} else if (MerchantEnum.ALI.CODE.toUpperCase().equals(outTradeNo.substring(0, 3))) {
return MerchantEnum.ALI;
} else if (MerchantEnum.BCM.CODE.toUpperCase().equals(outTradeNo.substring(0, 3))) {
return MerchantEnum.BCM;
} else {
return null;
}
}
/**
* 根据(数据库中的payWay)判断支付方式
*
* @param payWay 支付代码
* @return 支付方式
*/
public static MerchantEnum getMerchantEnumByPayWay(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 getMerchantEnumByQr(String userAgent) {
if (userAgent.contains("MicroMessenger")) {
return MerchantEnum.WX;
} else if (userAgent.contains("AlipayClient")) {
return MerchantEnum.ALI;
} else {
return null;
}
}
/**
* 根据支付方式获取支付代码集合
*
* @param merchantEnum 支付方式
* @return 支付代码集合
*/
public static List<String> getPayWayValues(MerchantEnum merchantEnum) {
List<String> resultList = new ArrayList<>();
if (merchantEnum == null) {
return resultList;
}
for (MerchantEnum item : MerchantEnum.values()) {
if (item.CODE.equals(merchantEnum.CODE)) {
resultList.add(item.PAY_WAY_IN);
resultList.add(item.PAY_WAY_QR);
resultList.add(item.PAY_WAY_MICRO);
return resultList;
}
}
return resultList;
}
/**
* 根据扫码的客户端判断支付类型
*
* @param authCode 编码
* @return 支付类型
*/
public static MerchantEnum getMerchantEnumByAuthCode(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));
}
}