自定义参数使用

This commit is contained in:
egzosn
2020-03-10 22:41:02 +08:00
parent bf424148d7
commit 0f1255fe06
16 changed files with 228 additions and 157 deletions

View File

@@ -226,7 +226,7 @@ public class AliPayService extends BasePayService<AliPayConfigStorage> {
bizContent.put("timeout_express", DateUtils.minutesRemaining(order.getExpirationTime()) + "m");
}
orderInfo.put(BIZ_CONTENT, JSON.toJSONString(bizContent));
orderInfo.putAll(order.getAttr());
orderInfo.putAll(order.getAttrs());
return preOrderHandler(orderInfo, order);
}

View File

@@ -12,6 +12,7 @@ import com.egzosn.pay.common.bean.*;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.http.UriVariables;
import com.egzosn.pay.common.util.DateUtils;
import com.egzosn.pay.common.util.Util;
import com.egzosn.pay.common.util.sign.SignUtils;
import com.egzosn.pay.common.util.str.StringUtils;
@@ -21,7 +22,7 @@ import java.util.HashMap;
import java.util.Map;
public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, BaiduPayOrder> {
public class BaiduPayService extends BasePayService<BaiduPayConfigStorage> {
public static final String APP_KEY = "appKey";
public static final String APP_ID = "appId";
public static final String DEAL_ID = "dealId";
@@ -84,7 +85,7 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, Baidu
public boolean verifySource(String id) {
return true;
}
/**
* 返回创建的订单信息
*
@@ -92,7 +93,7 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, Baidu
* @return
*/
@Override
public Map<String, Object> orderInfo(BaiduPayOrder order) {
public Map<String, Object> orderInfo(PayOrder order) {
Map<String, Object> params = getUseOrderInfoParams(order);
String rsaSign = getRsaSign(params, RSA_SIGN);
params.put(RSA_SIGN, rsaSign);
@@ -129,7 +130,7 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, Baidu
result.put(DEAL_TITLE, payOrder.getSubject());
result.put(SIGN_FIELDS_RANGE, payOrder.getSignFieldsRange());
result.put(BIZ_INFO, JSON.toJSONString(payOrder.getBizInfo()));
result.put(TOTAL_AMOUNT, String.valueOf(order.getPrice()));
result.put(TOTAL_AMOUNT, String.valueOf(Util.conversionAmount(order.getPrice())));
return result;
}
@@ -260,7 +261,9 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, Baidu
MethodType method) {
throw new UnsupportedOperationException("百度不支持PC支付");
}
/**
* 百度不支持扫码付
*
@@ -268,8 +271,7 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, Baidu
* @return
*/
@Override
@Deprecated
public String getQrPay(BaiduPayOrder order) {
public String getQrPay(PayOrder order) {
throw new UnsupportedOperationException("百度不支持扫码付");
}
@@ -280,8 +282,7 @@ public class BaiduPayService extends BasePayService<BaiduPayConfigStorage, Baidu
* @return
*/
@Override
@Deprecated
public Map<String, Object> microPay(BaiduPayOrder order) {
public Map<String, Object> microPay(PayOrder order) {
throw new UnsupportedOperationException("百度不支持刷卡付");
}

View File

@@ -8,6 +8,9 @@ import java.math.BigDecimal;
import java.util.Collections;
import java.util.List;
import static com.egzosn.pay.baidu.api.BaiduPayService.BIZ_INFO;
import static com.egzosn.pay.baidu.api.BaiduPayService.SIGN_FIELDS_RANGE;
public class BaiduPayOrder extends PayOrder {
/**
@@ -50,6 +53,7 @@ public class BaiduPayOrder extends PayOrder {
public void setBizInfo(JSONObject bizInfo) {
this.bizInfo = bizInfo;
addAttr(BIZ_INFO, bizInfo);
}
public List<TransactionType> getBannedChannels() {
@@ -58,6 +62,7 @@ public class BaiduPayOrder extends PayOrder {
public void setBannedChannels(List<TransactionType> bannedChannels) {
this.bannedChannels = bannedChannels;
addAttr("bannedChannels", bannedChannels);
}
public String getSignFieldsRange() {
@@ -66,6 +71,7 @@ public class BaiduPayOrder extends PayOrder {
public void setSignFieldsRange(String signFieldsRange) {
this.signFieldsRange = signFieldsRange;
addAttr(SIGN_FIELDS_RANGE, signFieldsRange);
}
}

View File

@@ -467,4 +467,20 @@ public abstract class BasePayService<PC extends PayConfigStorage> implements Pay
return orderInfo;
}
protected Map<String, Object> setParameters(Map<String, Object> parameters, String key, String value) {
if (StringUtils.isNotEmpty(value)) {
parameters.put(key, value);
}
return parameters;
}
protected Map<String, Object> setParameters(Map<String, Object> parameters, String key, Order order) {
Object attr = order.getAttr(key);
if (null != attr && !"".equals(attr)) {
parameters.put(key, attr);
}
return parameters;
}
}

View File

@@ -17,6 +17,12 @@ public interface Order {
* 获取订单属性 这里可用做覆盖已设置的订单信息属性,订单信息在签名前进行覆盖。
* @return 属性
*/
Map<String, Object> getAttr();
Map<String, Object> getAttrs();
/**
* 获取订单属性 这里可用做覆盖已设置的订单信息属性,订单信息在签名前进行覆盖。
* @param key 属性名
* @return 属性
*/
Object getAttr(String key);
}

View File

@@ -258,20 +258,26 @@ public class PayOrder implements Order {
}
@Override
public Map<String, Object> getAttr() {
public Map<String, Object> getAttrs() {
if (null == attr){
attr = new HashMap<>();
}
return attr;
}
@Override
public Object getAttr(String key) {
return getAttrs().get(key);
}
/**
* 添加订单信息
* @param key key
* @param value 值
*/
public void addAttr(String key, Object value) {
getAttr().put(key, value);
getAttrs().put(key, value);
}

View File

@@ -1,6 +1,8 @@
package com.egzosn.pay.common.bean;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* 转账订单
@@ -10,7 +12,7 @@ import java.math.BigDecimal;
* date 2018/1/31
* </pre>
*/
public class TransferOrder {
public class TransferOrder implements Order {
/**
* 转账批次订单单号
@@ -79,6 +81,12 @@ public class TransferOrder {
*/
private String ip;
/**
* 订单附加信息,可用于预设未提供的参数,这里会覆盖以上所有的订单信息,
*/
private Map<String, Object> attr;
public String getBatchNo() {
return batchNo;
}
@@ -190,4 +198,28 @@ public class TransferOrder {
public void setIp(String ip) {
this.ip = ip;
}
@Override
public Map<String, Object> getAttrs() {
if (null == attr){
attr = new HashMap<>();
}
return attr;
}
@Override
public Object getAttr(String key) {
return getAttrs().get(key);
}
/**
* 添加订单信息
* @param key key
* @param value 值
*/
public void addAttr(String key, Object value) {
getAttrs().put(key, value);
}
}

View File

@@ -90,39 +90,7 @@
</dependency>
</dependencies>
<profiles>
<profile>
<id>port8080</id>
<properties>
<port>8080</port>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>port9096</id>
<properties>
<port>9096</port>
</properties>
</profile>
<profile>
<id>local</id>
<properties>
<env>local</env>
</properties>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>proc</id>
<properties>
<env>proc</env>
</properties>
</profile>
</profiles>
<build>
<finalName>pay-java-demo</finalName>
<plugins>
@@ -140,7 +108,7 @@
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.0</version>
<configuration>
<port>${port}</port>
<port>8080</port>
<path>/</path>
<uriEncoding>UTF-8</uriEncoding>
</configuration>

View File

@@ -203,7 +203,7 @@ public class FuiouPayService extends BasePayService<FuiouPayConfigStorage> {
parameters.put("rem", "");
//版本号
parameters.put("ver", "1.0.1");
parameters.putAll(order.getAttr());
parameters.putAll(order.getAttrs());
return preOrderHandler(parameters, order);
}

View File

@@ -18,7 +18,6 @@ import org.apache.http.Header;
import org.apache.http.entity.ContentType;
import org.apache.http.message.BasicHeader;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.util.*;
@@ -184,7 +183,7 @@ public class PayoneerPayService extends BasePayService<PayoneerConfigStorage> im
}
params.put("currency", order.getCurType());
params.put("description", order.getSubject());
params.putAll(order.getAttr());
params.putAll(order.getAttrs());
return preOrderHandler(params, order);
}

View File

@@ -20,7 +20,6 @@ import com.egzosn.pay.union.bean.SDKConstants;
import com.egzosn.pay.union.bean.UnionPayMessage;
import com.egzosn.pay.union.bean.UnionTransactionType;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
@@ -284,7 +283,7 @@ public class UnionPayService extends BasePayService<UnionPayConfigStorage> {
params.put(SDKConstants.param_payTimeout, getPayTimeout(order.getExpirationTime()));
params.put("orderDesc", order.getSubject());
}
params.putAll(order.getAttr());
params.putAll(order.getAttrs());
params = preOrderHandler(params, order);
return setSign(params);
}

View File

@@ -227,7 +227,7 @@ public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorag
Map<String, Object> data = new TreeMap<>();
data.put("access_token", getAccessToken());
data.put("paymoney", Util.conversionAmount(order.getPrice()).toString());
data.putAll(order.getAttr());
data.putAll(order.getAttrs());
data = preOrderHandler(data, order);
String apbNonce = SignUtils.randomStr();
String sign = createSign(SignUtils.parameterText(data, "") + apbNonce, payConfigStorage.getInputCharset());

View File

@@ -0,0 +1,42 @@
package com.egzosn.pay.wx.api;
import com.egzosn.pay.common.bean.Order;
import com.egzosn.pay.common.bean.PayOrder;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
/**
* @author egan
* @date 2020/3/10 21:22
* <a href="mailto:zheng.zaosheng@iwhalecloud.com">郑灶生</a>
* <br/>
* email: zheng.zaosheng@iwhalecloud.com
*/
public interface WxConst {
/**
* 微信请求地址
*/
String URI = "https://api.mch.weixin.qq.com/";
/**
* 沙箱
*/
String SANDBOXNEW = "sandboxnew/";
String SUCCESS = "SUCCESS";
String RETURN_CODE = "return_code";
String SIGN = "sign";
String CIPHER_ALGORITHM = "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING";
String FAILURE = "failure";
String APPID = "appid";
String HMAC_SHA256 = "HMAC-SHA256";
String HMACSHA256 = "HMACSHA256";
String RETURN_MSG_CODE = "return_msg";
String RESULT_CODE = "result_code";
String MCH_ID = "mch_id";
String NONCE_STR = "nonce_str";
String OUT_TRADE_NO = "out_trade_no";
}

View File

@@ -8,7 +8,6 @@ import com.egzosn.pay.common.bean.result.PayException;
import com.egzosn.pay.common.exception.PayErrorException;
import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.common.util.DateUtils;
import com.egzosn.pay.common.util.MatrixToImageWriter;
import com.egzosn.pay.common.util.Util;
import com.egzosn.pay.common.util.sign.SignUtils;
import com.egzosn.pay.common.util.sign.encrypt.RSA2;
@@ -18,13 +17,13 @@ import com.egzosn.pay.wx.bean.WxPayMessage;
import com.egzosn.pay.wx.bean.WxTransactionType;
import com.egzosn.pay.common.util.XML;
import com.egzosn.pay.wx.bean.WxTransferType;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.*;
import static com.egzosn.pay.wx.api.WxConst.*;
import static com.egzosn.pay.wx.bean.WxTransferType.*;
/**
@@ -39,27 +38,6 @@ import static com.egzosn.pay.wx.bean.WxTransferType.*;
public class WxPayService extends BasePayService<WxPayConfigStorage> {
/**
* 微信请求地址
*/
public static final String URI = "https://api.mch.weixin.qq.com/";
/**
* 沙箱
*/
public static final String SANDBOXNEW = "sandboxnew/";
public static final String SUCCESS = "SUCCESS";
public static final String RETURN_CODE = "return_code";
public static final String SIGN = "sign";
public static final String CIPHER_ALGORITHM = "RSA/ECB/OAEPWITHSHA-1ANDMGF1PADDING";
public static final String FAILURE = "failure";
public static final String APPID = "appid";
private static final String HMAC_SHA256 = "HMAC-SHA256";
private static final String HMACSHA256 = "HMACSHA256";
private static final String RETURN_MSG_CODE = "return_msg";
private static final String RESULT_CODE = "result_code";
private static final String MCH_ID = "mch_id";
private static final String NONCE_STR = "nonce_str";
/**
@@ -118,17 +96,21 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
public boolean verify(Map<String, Object> params) {
if (!(SUCCESS.equals(params.get(RETURN_CODE)) && SUCCESS.equals(params.get(RESULT_CODE)))) {
LOG.debug(String.format("微信支付异常return_code=%s,参数集=%s", params.get(RETURN_CODE), params));
if (LOG.isErrorEnabled()){
LOG.error(String.format("微信支付异常return_code=%s,参数集=%s", params.get(RETURN_CODE), params));
}
return false;
}
if (null == params.get(SIGN)) {
LOG.debug("微信支付异常签名为空out_trade_no=" + params.get("out_trade_no"));
if (LOG.isDebugEnabled()){
LOG.debug(String.format("微信支付异常:签名为空!%s=%s", OUT_TRADE_NO, params.get(OUT_TRADE_NO)));
}
return false;
}
try {
return signVerify(params, (String) params.get(SIGN)) && verifySource((String) params.get("out_trade_no"));
return signVerify(params, (String) params.get(SIGN)) && verifySource((String) params.get(OUT_TRADE_NO));
} catch (PayErrorException e) {
LOG.error(e);
}
@@ -203,9 +185,9 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
// 购买支付信息
parameters.put("body", order.getSubject());
// 购买支付信息
// parameters.put("detail", order.getBody());
setParameters(parameters, "detail", order);
// 订单号
parameters.put("out_trade_no", order.getOutTradeNo());
parameters.put(OUT_TRADE_NO, order.getOutTradeNo());
parameters.put("spbill_create_ip", StringUtils.isEmpty(order.getSpbillCreateIp()) ? "192.168.1.150" : order.getSpbillCreateIp());
// 总金额单位为分
parameters.put("total_fee", Util.conversionCentAmount(order.getPrice()));
@@ -222,7 +204,12 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
}
((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order);
parameters.putAll(order.getAttr());
//可覆盖参数
setParameters(parameters, "notify_url", order);
setParameters(parameters, "goods_tag", order);
setParameters(parameters, "limit_pay", order);
setParameters(parameters, "receipt", order);
setParameters(parameters, "product_id", order);
parameters = preOrderHandler(parameters, order);
setSign(parameters);
@@ -276,7 +263,6 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
params.put("noncestr", result.get(NONCE_STR));
params.put("package", "Sign=WXPay");
}
params = preOrderHandler(params, order);
String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset());
params.put(SIGN, paySign);
return params;
@@ -513,12 +499,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
}
private Map<String, Object> setParameters(Map<String, Object> parameters, String key, String value) {
if (StringUtils.isNotEmpty(value)) {
parameters.put(key, value);
}
return parameters;
}
/**
* 申请退款接口
@@ -532,7 +513,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
Map<String, Object> parameters = getPublicParameters();
setParameters(parameters, "transaction_id", refundOrder.getTradeNo());
setParameters(parameters, "out_trade_no", refundOrder.getOutTradeNo());
setParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo());
setParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
parameters.put("total_fee", Util.conversionCentAmount(refundOrder.getTotalAmount()));
parameters.put("refund_fee", Util.conversionCentAmount(refundOrder.getRefundAmount()));
@@ -571,7 +552,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
//获取公共参数
Map<String, Object> parameters = getPublicParameters();
setParameters(parameters, "transaction_id", refundOrder.getTradeNo());
setParameters(parameters, "out_trade_no", refundOrder.getOutTradeNo());
setParameters(parameters, OUT_TRADE_NO, refundOrder.getOutTradeNo());
setParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
//设置签名
setSign(parameters);
@@ -638,7 +619,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage> {
//获取公共参数
Map<String, Object> parameters = getPublicParameters();
setParameters(parameters, "out_trade_no", outTradeNoBillType);
setParameters(parameters, OUT_TRADE_NO, outTradeNoBillType);
setParameters(parameters, "transaction_id", (String) transactionIdOrBillDate);
//设置签名
setSign(parameters);

View File

@@ -10,8 +10,6 @@ import com.egzosn.pay.common.util.Util;
import com.egzosn.pay.common.util.sign.SignUtils;
import com.egzosn.pay.common.util.str.StringUtils;
import com.egzosn.pay.yiji.bean.YiJiTransactionType;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.util.Collections;
import java.util.Date;
@@ -175,7 +173,7 @@ public class YiJiPayService extends BasePayService<YiJiPayConfigStorage> {
if (null != order.getCurType()){
orderInfo.put("currency", order.getCurType());
}
orderInfo.putAll(order.getAttr());
orderInfo.putAll(order.getAttrs());
return preOrderHandler(orderInfo, order);
}

141
pom.xml
View File

@@ -140,68 +140,85 @@
<encoding>utf-8</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.3</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>false</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<autoVersionSubmodules>false</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.3</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>none</phase>
<!-- <goals>
<goal>sign</goal>
</goals>-->
</execution>
</executions>
</plugin>
</plugins>
</build>
<profiles>
<profile>
<id>local</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
</profile>
<profile>
<id>proc</id>
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.3</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>false</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-release-plugin</artifactId>
<version>2.5.1</version>
<configuration>
<autoVersionSubmodules>false</autoVersionSubmodules>
<useReleaseProfile>false</useReleaseProfile>
<releaseProfiles>release</releaseProfiles>
<goals>deploy</goals>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.3</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>3.1.0</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.6</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>install</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</profile>
</profiles>
</project>