package com.hongqiang.shop.common.utils.plugin;
import java.math.BigDecimal;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang.builder.CompareToBuilder;
import org.apache.commons.lang.builder.EqualsBuilder;
import org.apache.commons.lang.builder.HashCodeBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.hongqiang.shop.common.config.Global;
import com.hongqiang.shop.common.utils.Setting;
import com.hongqiang.shop.common.utils.SettingUtils;
import com.hongqiang.shop.common.utils.plugin.service.PluginConfigService;
import com.hongqiang.shop.website.entity.PluginConfig;
/**
* 支付基类
*
* @author jackial
*
*/
public abstract class PaymentPlugin implements Comparable<PaymentPlugin> {
/**
* 税率类型:比例;固定
*/
public enum FeeType {
scale, fixed;
}
/**
* 调用第三方支付方式的请求:post和get
*/
public enum Method {
post, get;
}
public static final String PAYMENT_NAME_ATTRIBUTE_NAME = "paymentName";// 支付名称
public static final String FEE_TYPE_ATTRIBUTE_NAME = "feeType";// 税率类型
public static final String FEE_ATTRIBUTE_NAME = "fee";// 税率费用
public static final String LOGO_ATTRIBUTE_NAME = "logo";// 支付logo
public static final String DESCRIPTION_ATTRIBUTE_NAME = "description";// 说明
public static final String ORDER_ATTRIBUTE_NAME = PaymentPlugin.class
.getName() + ".PRINCIPAL";
private Map<String, String> tradeInfoMap;
public Map<String, String> getTradeInfoMap() {
return tradeInfoMap;
}
public void setTradeInfoMap(Map<String, String> tradeInfoMap) {
this.tradeInfoMap = tradeInfoMap;
}
@Autowired
private PluginConfigService pluginConfigService;
/**
* 根据支付插件component得到支付名称
*
* @return 支付名称,如“支付宝即时交易”
*/
public final String getId() {
return ((Component) getClass().getAnnotation(Component.class)).value();
}
/**
* 获得支付插件的名称
*
* @return 支付插件的名称
*/
public abstract String getName();
/**
* 获得支付插件的版本
*
* @return 支付插件的版本
*/
public abstract String getVersion();
/**
* 获得支付插件的作者
*
* @return 支付插件的作者
*/
public abstract String getAuthor();
/**
* 获得支付插件的站点
*
* @return 支付插件的站点
*/
public abstract String getSiteUrl();
/**
* 获得支付插件的安装地址
*
* @return 支付插件的安装地址
*/
public abstract String getInstallUrl();
/**
* 获得支付插件的卸载地址
*
* @return 支付插件的卸载地址
*/
public abstract String getUninstallUrl();
/**
* 获得支付插件的设置地址
*
* @return 支付插件的设置地址
*/
public abstract String getSettingUrl();
/**
* 判断是否安装
*
* @return 已经安装返回true,否则返回flase
*/
public boolean getIsInstalled() {
return this.pluginConfigService.pluginIdExists(getId());
}
/**
* 根据支付插件id得到支付插件实体类
*
* @return 支付插件实体类
*/
public PluginConfig getPluginConfig() {
return this.pluginConfigService.findByPluginId(getId());
}
/**
* 判断是否启用
*
* @return 已经启用返回true,否则返回flase
*/
public boolean getIsEnabled() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? pluginConfig.getIsEnabled().booleanValue() : false;
}
/**
* 根据支付插件中key名称得到支付插件key对应的value
*
* @return 支付插件key对应的value
*/
public String getAttribute(String name) {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? pluginConfig.getAttribute(name) : null;
}
/**
* 获得支付插件的序号
*
* @return 支付插件的序号
*/
public Integer getOrder() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? pluginConfig.getOrder() : null;
}
/**
* 根据支付插件中key名称得到支付插件key对应的支付名称
*
* @return 支付插件key对应的支付名称
*/
public String getPaymentName() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? pluginConfig
.getAttribute(PAYMENT_NAME_ATTRIBUTE_NAME) : null;
}
/**
* 获得税率类型
*
* @return 税率类型e
*/
public FeeType getFeeType() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? FeeType.valueOf(pluginConfig
.getAttribute(FEE_TYPE_ATTRIBUTE_NAME)) : null;
}
/**
* 获得税率
*
* @return 税率
*/
public BigDecimal getFee() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? new BigDecimal(
pluginConfig.getAttribute(FEE_ATTRIBUTE_NAME)) : null;
}
/**
* 获得插件logo
*
* @return 插件logo
*/
public String getLogo() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? pluginConfig
.getAttribute(LOGO_ATTRIBUTE_NAME) : null;
}
/**
* 获得插件说明
*
* @return 插件说明
*/
public String getDescription() {
PluginConfig pluginConfig = getPluginConfig();
return pluginConfig != null ? pluginConfig
.getAttribute(DESCRIPTION_ATTRIBUTE_NAME) : null;
}
/**
* 获得支付网关
*
* @return 支付网关url
*/
public abstract String getUrl();
/**
* 获得支付方式的请求
*
* @return 支付方式的请求,分为post和get
*/
public abstract Method getMethod();
/**
* 获得超时时间
*
* @return 超时时间,单位为秒,如:3000,表示3000秒
*/
public abstract Integer getTimeout();
/**
*
* @param order 订单实体类
* @return 收货人信息
*/
public abstract Map<String, String> getConsigneeInfo(
com.hongqiang.shop.modules.entity.Order order);
/**
*
* @param sn 付款编号
* @param amount 付款总金额
* @param description 说明
* @param request httprequest
* @return map,包含需要传给支付接口的参数和参数名称
*/
public abstract Map<String, String> getParameterMap(String sn,
BigDecimal amount, String description, HttpServletRequest request);
/**
*
* @param sn 付款编号
* @param request
* @return
*/
public abstract boolean verify(String sn, HttpServletRequest request);
/**
*
* @param sn 付款编号
* @param request
* @return
*/
public abstract BigDecimal getAmount(String sn, HttpServletRequest request);
/**
*
* @param sn 付款编号
* @param request
* @return
*/
public abstract String getNotifyContext(String sn,
HttpServletRequest request);
/**
*
* @param sn 付款编号
* @return
*/
protected String getReturnUrl(String sn) {
Setting setting = SettingUtils.get();
return setting.getSiteUrl() + Global.getFrontPath()+ "/payment/return/" + sn + ".jhtml";
}
/**
*
* @param sn 付款编号
* @return
*/
protected String getNotifyUrl(String sn) {
Setting setting = SettingUtils.get();
return setting.getSiteUrl() + Global.getFrontPath()+ "/payment/notify/" + sn + ".jhtml";
}
/**
* 根据订单总金额得到商城的税费
*
* @param amount 订单总金额
* @return 商城的税费
*/
public final BigDecimal getFee(BigDecimal amount) {
Setting setting = SettingUtils.get();
BigDecimal fee;
if (getFeeType() == FeeType.scale)
fee = amount.multiply(getFee());
else
fee = getFee();
return setting.setScale(fee);
}
/**
* 判断传入的object是否等于当前支付插件
*/
public boolean equals(Object obj) {
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
if (this == obj)
return true;
PaymentPlugin paymentPlugin = (PaymentPlugin) obj;
return new EqualsBuilder().append(getId(), paymentPlugin.getId()).isEquals();
}
/**
* 得到当前支付插件的hashcode
*/
public int hashCode() {
return new HashCodeBuilder(17, 37).append(getId()).toHashCode();
}
/**
* 比较两个支付插件
*/
public int compareTo(PaymentPlugin paymentPlugin) {
return new CompareToBuilder()
.append(getOrder(), paymentPlugin.getOrder())
.append(getId(), paymentPlugin.getId()).toComparison();
}
}