mirror of
https://gitee.com/egzosn/pay-java-parent.git
synced 2026-05-22 09:26:54 +08:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
24
.gitignore
vendored
Normal file
24
.gitignore
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
# Compiled class file
|
||||
*.class
|
||||
|
||||
# Log file
|
||||
*.log
|
||||
|
||||
# BlueJ files
|
||||
*.ctxt
|
||||
|
||||
# Mobile Tools for Java (J2ME)
|
||||
.mtj.tmp/
|
||||
|
||||
# Package Files #
|
||||
*.jar
|
||||
*.war
|
||||
*.nar
|
||||
*.ear
|
||||
*.zip
|
||||
*.tar.gz
|
||||
*.rar
|
||||
|
||||
.idea
|
||||
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
|
||||
hs_err_pid*
|
||||
@@ -21,7 +21,7 @@
|
||||
<dependency>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<artifactId>{module-name}</artifactId>
|
||||
<version>2.12.8</version>
|
||||
<version>2.12.9</version>
|
||||
</dependency>
|
||||
|
||||
```
|
||||
@@ -67,4 +67,4 @@ E-Mail:egzosn@gmail.com
|
||||
|
||||
QQ群:542193977
|
||||
|
||||
微信群: 
|
||||
微信群: 
|
||||
|
||||
@@ -197,7 +197,7 @@
|
||||
|
||||
```java
|
||||
|
||||
Map result = service..query("支付宝单号", "我方系统单号");
|
||||
Map result = service.query("支付宝单号", "我方系统单号");
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>pay-java-ali</artifactId>
|
||||
@@ -19,12 +19,6 @@
|
||||
<artifactId>pay-java-common</artifactId>
|
||||
</dependency>
|
||||
<!-- /pay-java -->
|
||||
<!--
|
||||
<dependency>
|
||||
<groupId>org.bouncycastle</groupId>
|
||||
<artifactId>bcprov-jdk15on</artifactId>
|
||||
<version>1.54</version>
|
||||
</dependency>-->
|
||||
|
||||
</dependencies>
|
||||
|
||||
|
||||
@@ -26,7 +26,7 @@ import java.util.*;
|
||||
* email egzosn@gmail.com
|
||||
* date 2017-2-22 20:09
|
||||
*/
|
||||
public class AliPayService extends BasePayService<AliPayConfigStorage, PayOrder> {
|
||||
public class AliPayService extends BasePayService<AliPayConfigStorage> {
|
||||
|
||||
/**
|
||||
* 正式测试环境
|
||||
@@ -200,7 +200,6 @@ public class AliPayService extends BasePayService<AliPayConfigStorage, PayOrder>
|
||||
bizContent.put("total_amount", Util.conversionAmount(order.getPrice()).toString());
|
||||
switch ((AliTransactionType) order.getTransactionType()) {
|
||||
case PAGE:
|
||||
case DIRECT:
|
||||
bizContent.put(PASSBACK_PARAMS, order.getAddition());
|
||||
bizContent.put(PRODUCT_CODE, "FAST_INSTANT_TRADE_PAY");
|
||||
orderInfo.put(RETURN_URL, payConfigStorage.getReturnUrl());
|
||||
@@ -272,6 +271,16 @@ public class AliPayService extends BasePayService<AliPayConfigStorage, PayOrder>
|
||||
return PayOutMessage.TEXT().content("success").build();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toPay(PayOrder order) {
|
||||
if (null == order.getTransactionType()) {
|
||||
order.setTransactionType(AliTransactionType.PAGE);
|
||||
} else if (order.getTransactionType() != AliTransactionType.PAGE && order.getTransactionType() != AliTransactionType.WAP) {
|
||||
throw new PayErrorException(new PayException("-1", "错误的交易类型:" + order.getTransactionType()));
|
||||
}
|
||||
return super.toPay(order);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param orderInfo 发起支付的订单信息
|
||||
* @param method 请求方式 "post" "get",
|
||||
@@ -301,6 +310,7 @@ public class AliPayService extends BasePayService<AliPayConfigStorage, PayOrder>
|
||||
*/
|
||||
@Override
|
||||
public String getQrPay(PayOrder order){
|
||||
order.setTransactionType(AliTransactionType.SWEEPPAY);
|
||||
Map<String, Object> orderInfo = orderInfo(order);
|
||||
//预订单
|
||||
JSONObject result = getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(orderInfo), null, JSONObject.class);
|
||||
@@ -320,6 +330,12 @@ public class AliPayService extends BasePayService<AliPayConfigStorage, PayOrder>
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> microPay(PayOrder order) {
|
||||
if (null == order.getTransactionType()){
|
||||
order.setTransactionType(AliTransactionType.BAR_CODE);
|
||||
}else if (order.getTransactionType() != AliTransactionType.BAR_CODE && order.getTransactionType() != AliTransactionType.WAVE_CODE && order.getTransactionType() != AliTransactionType.SECURITY_CODE){
|
||||
throw new PayErrorException(new PayException("-1", "错误的交易类型:" + order.getTransactionType()));
|
||||
}
|
||||
|
||||
Map<String, Object> orderInfo = orderInfo(order);
|
||||
//预订单
|
||||
JSONObject result = getHttpRequestTemplate().postForObject(getReqUrl() + "?" + UriVariables.getMapToParameters(orderInfo), null, JSONObject.class);
|
||||
|
||||
@@ -18,12 +18,7 @@ import com.egzosn.pay.common.bean.TransactionType;
|
||||
* date 2016/10/19 22:58
|
||||
*/
|
||||
public enum AliTransactionType implements TransactionType {
|
||||
/**
|
||||
* 即时到帐
|
||||
* 过时的名称,请换至 {@link #PAGE}
|
||||
*/
|
||||
@Deprecated
|
||||
DIRECT("alipay.trade.page.pay"),
|
||||
|
||||
/**
|
||||
* 网页支付
|
||||
*/
|
||||
|
||||
@@ -35,7 +35,7 @@ import static com.egzosn.pay.ali.api.AliPayService.SIGN;
|
||||
* @see com.egzosn.pay.ali.api.AliPayService
|
||||
*/
|
||||
@Deprecated
|
||||
public class AliPayService extends BasePayService<AliPayConfigStorage, PayOrder> {
|
||||
public class AliPayService extends BasePayService<AliPayConfigStorage> {
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<packaging>jar</packaging>
|
||||
|
||||
@@ -26,7 +26,7 @@ import java.util.*;
|
||||
* date 2017/3/5 20:36
|
||||
* </pre>
|
||||
*/
|
||||
public abstract class BasePayService<PC extends PayConfigStorage, O extends PayOrder> implements PayService<PC, O> {
|
||||
public abstract class BasePayService<PC extends PayConfigStorage> implements PayService<PC> {
|
||||
protected final Log LOG = LogFactory.getLog(getClass());
|
||||
protected PC payConfigStorage;
|
||||
|
||||
@@ -138,7 +138,7 @@ public abstract class BasePayService<PC extends PayConfigStorage, O extends PayO
|
||||
* @return 对应页面重定向信息
|
||||
*/
|
||||
@Override
|
||||
public String toPay(O order) {
|
||||
public <O extends PayOrder> String toPay(O order) {
|
||||
Map orderInfo = orderInfo(order);
|
||||
return buildRequest(orderInfo, MethodType.POST);
|
||||
}
|
||||
@@ -150,7 +150,7 @@ public abstract class BasePayService<PC extends PayConfigStorage, O extends PayO
|
||||
* @return 返回图片信息,支付时需要的
|
||||
*/
|
||||
@Override
|
||||
public BufferedImage genQrPay(O order) {
|
||||
public <O extends PayOrder> BufferedImage genQrPay(O order) {
|
||||
return MatrixToImageWriter.writeInfoToJpgBuff(getQrPay(order));
|
||||
}
|
||||
|
||||
@@ -463,7 +463,7 @@ public abstract class BasePayService<PC extends PayConfigStorage, O extends PayO
|
||||
* @param orderInfo 订单信息
|
||||
* @return 处理后订单信息
|
||||
*/
|
||||
public Map<String, Object> preOrderHandler(Map<String, Object> orderInfo, O payOrder){
|
||||
public <O extends PayOrder> Map<String, Object> preOrderHandler(Map<String, Object> orderInfo, O payOrder){
|
||||
return orderInfo;
|
||||
}
|
||||
|
||||
|
||||
@@ -124,6 +124,7 @@ public class PayMessageRouter {
|
||||
* 处理支付消息
|
||||
*
|
||||
* @param payMessage 支付消息
|
||||
* @param storage 支付配置
|
||||
* @return 支付输出结果
|
||||
*/
|
||||
public PayOutMessage route(Map<String, Object> payMessage, PayConfigStorage storage) {
|
||||
|
||||
@@ -20,7 +20,7 @@ import java.util.Map;
|
||||
* date 2016-5-18 14:09:01
|
||||
* </pre>
|
||||
*/
|
||||
public interface PayService<PC extends PayConfigStorage, O extends PayOrder> {
|
||||
public interface PayService<PC extends PayConfigStorage> {
|
||||
|
||||
|
||||
/**
|
||||
@@ -86,17 +86,19 @@ public interface PayService<PC extends PayConfigStorage, O extends PayOrder> {
|
||||
*
|
||||
* @param order 支付订单
|
||||
* @return 订单信息
|
||||
* @param <O> 预订单类型
|
||||
* @see PayOrder 支付订单信息
|
||||
*/
|
||||
Map<String, Object> orderInfo(O order);
|
||||
<O extends PayOrder>Map<String, Object> orderInfo(O order);
|
||||
|
||||
/**
|
||||
* 页面转跳支付, 返回对应页面重定向信息
|
||||
*
|
||||
* @param order 订单信息
|
||||
* @param <O> 预订单类型
|
||||
* @return 对应页面重定向信息
|
||||
*/
|
||||
String toPay(O order);
|
||||
<O extends PayOrder>String toPay(O order);
|
||||
|
||||
/**
|
||||
* 创建签名
|
||||
@@ -158,24 +160,27 @@ public interface PayService<PC extends PayConfigStorage, O extends PayOrder> {
|
||||
* 获取输出二维码,用户返回给支付端,
|
||||
*
|
||||
* @param order 发起支付的订单信息
|
||||
* @param <O> 预订单类型
|
||||
* @return 返回图片信息,支付时需要的
|
||||
*/
|
||||
BufferedImage genQrPay(O order);
|
||||
<O extends PayOrder>BufferedImage genQrPay(O order);
|
||||
/**
|
||||
* 获取输出二维码信息,
|
||||
*
|
||||
* @param order 发起支付的订单信息
|
||||
* @param <O> 预订单类型
|
||||
* @return 返回二维码信息,,支付时需要的
|
||||
*/
|
||||
String getQrPay(O order);
|
||||
<O extends PayOrder>String getQrPay(O order);
|
||||
|
||||
/**
|
||||
* 刷卡付,pos主动扫码付款(条码付)
|
||||
* 刷脸付
|
||||
* @param order 发起支付的订单信息
|
||||
* @param <O> 预订单类型
|
||||
* @return 返回支付结果
|
||||
*/
|
||||
Map<String, Object> microPay(O order);
|
||||
<O extends PayOrder>Map<String, Object> microPay(O order);
|
||||
|
||||
/**
|
||||
* 交易查询接口
|
||||
@@ -460,8 +465,9 @@ public interface PayService<PC extends PayConfigStorage, O extends PayOrder> {
|
||||
* 如果需要进行扩展请重写该方法即可
|
||||
* @param orderInfo 商户平台预订单信息
|
||||
* @param payOrder 订单信息
|
||||
* @param <O> 预订单类型
|
||||
* @return 处理后订单信息
|
||||
*/
|
||||
Map<String, Object> preOrderHandler(Map<String, Object> orderInfo, O payOrder);
|
||||
<O extends PayOrder>Map<String, Object> preOrderHandler(Map<String, Object> orderInfo, O payOrder);
|
||||
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ import java.util.Date;
|
||||
* 支付订单信息
|
||||
*
|
||||
* @author egan
|
||||
* <pre>
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2016/10/19 22:34
|
||||
* </pre>
|
||||
@@ -66,7 +66,7 @@ public class PayOrder {
|
||||
private String wapName;
|
||||
/**
|
||||
* 用户唯一标识
|
||||
* 微信含 sub_openid 字段
|
||||
* 微信含 sub_openid 字段
|
||||
*/
|
||||
private String openid;
|
||||
/**
|
||||
@@ -83,6 +83,21 @@ public class PayOrder {
|
||||
private Date expirationTime;
|
||||
|
||||
|
||||
public PayOrder() {
|
||||
}
|
||||
|
||||
|
||||
public PayOrder(String subject, String body, BigDecimal price, String outTradeNo) {
|
||||
this(subject, body, price, outTradeNo, null);
|
||||
}
|
||||
|
||||
public PayOrder(String subject, String body, BigDecimal price, String outTradeNo, TransactionType transactionType) {
|
||||
this.subject = tryTrim(subject);
|
||||
this.body = tryTrim(body);
|
||||
this.price = price;
|
||||
this.outTradeNo = tryTrim(outTradeNo);
|
||||
this.transactionType = transactionType;
|
||||
}
|
||||
|
||||
|
||||
public CurType getCurType() {
|
||||
@@ -127,13 +142,16 @@ public class PayOrder {
|
||||
|
||||
/**
|
||||
* 支付平台订单号,交易号
|
||||
* @return 支付平台订单号,交易号
|
||||
*
|
||||
* @return 支付平台订单号, 交易号
|
||||
*/
|
||||
public String getTradeNo() {
|
||||
return tradeNo;
|
||||
}
|
||||
|
||||
/**
|
||||
* 支付平台订单号,交易号
|
||||
*
|
||||
* @param tradeNo 支付平台订单号,交易号
|
||||
*/
|
||||
public void setTradeNo(String tradeNo) {
|
||||
@@ -141,7 +159,8 @@ public class PayOrder {
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取商户订单号
|
||||
* 获取商户订单号
|
||||
*
|
||||
* @return 商户订单号
|
||||
*/
|
||||
public String getOutTradeNo() {
|
||||
@@ -150,7 +169,8 @@ public class PayOrder {
|
||||
|
||||
/**
|
||||
* 设置商户订单号
|
||||
* @param outTradeNo 商户订单号
|
||||
*
|
||||
* @param outTradeNo 商户订单号
|
||||
*/
|
||||
public void setOutTradeNo(String outTradeNo) {
|
||||
this.outTradeNo = outTradeNo;
|
||||
@@ -196,24 +216,6 @@ public class PayOrder {
|
||||
this.deviceInfo = deviceInfo;
|
||||
}
|
||||
|
||||
public PayOrder() {
|
||||
}
|
||||
|
||||
|
||||
public PayOrder(String subject, String body, BigDecimal price, String outTradeNo, TransactionType transactionType) {
|
||||
this.subject = subject;
|
||||
this.body = body;
|
||||
this.price = price;
|
||||
this.outTradeNo = outTradeNo;
|
||||
this.transactionType = transactionType;
|
||||
}
|
||||
public PayOrder(String subject, String body, BigDecimal price, String outTradeNo) {
|
||||
this.subject = subject;
|
||||
this.body = body;
|
||||
this.price = price;
|
||||
this.outTradeNo = outTradeNo;
|
||||
}
|
||||
|
||||
public String getWapUrl() {
|
||||
return wapUrl;
|
||||
}
|
||||
@@ -246,6 +248,16 @@ public class PayOrder {
|
||||
this.expirationTime = expirationTime;
|
||||
}
|
||||
|
||||
/**
|
||||
* 对 subject body 进行 trim 运算,
|
||||
* 以防止在签名是可能造成的签名错误问题
|
||||
* @param str
|
||||
* @return
|
||||
*/
|
||||
private static String tryTrim(String str) {
|
||||
return str == null ? null : str.trim();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "PayOrder{" +
|
||||
|
||||
@@ -127,27 +127,27 @@ public class HttpRequestTemplate {
|
||||
}
|
||||
}
|
||||
|
||||
//读取本机存放的PKCS12证书文件
|
||||
//读取本机存放的PKCS12证书文件
|
||||
try(InputStream instream = configStorage.getKeystoreInputStream()){
|
||||
//指定读取证书格式为PKCS12
|
||||
KeyStore keyStore = KeyStore.getInstance("PKCS12");
|
||||
//指定读取证书格式为PKCS12
|
||||
KeyStore keyStore = KeyStore.getInstance("PKCS12");
|
||||
|
||||
char[] password = configStorage.getStorePassword().toCharArray();
|
||||
//指定PKCS12的密码
|
||||
keyStore.load(instream, password);
|
||||
// 实例化密钥库 & 初始化密钥工厂
|
||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
|
||||
kmf.init(keyStore, password);
|
||||
// 创建 SSLContext
|
||||
SSLContext sslcontext = SSLContexts.custom()
|
||||
.loadKeyMaterial(keyStore, password).build();
|
||||
char[] password = configStorage.getStorePassword().toCharArray();
|
||||
//指定PKCS12的密码
|
||||
keyStore.load(instream, password);
|
||||
// 实例化密钥库 & 初始化密钥工厂
|
||||
KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
|
||||
kmf.init(keyStore, password);
|
||||
// 创建 SSLContext
|
||||
SSLContext sslcontext = SSLContexts.custom()
|
||||
.loadKeyMaterial(keyStore, password).build();
|
||||
|
||||
//指定TLS版本
|
||||
sslsf = new SSLConnectionSocketFactory(
|
||||
sslcontext, new String[]{"TLSv1"}, null,
|
||||
new DefaultHostnameVerifier());
|
||||
//指定TLS版本
|
||||
sslsf = new SSLConnectionSocketFactory(
|
||||
sslcontext, new String[]{"TLSv1"}, null,
|
||||
new DefaultHostnameVerifier());
|
||||
|
||||
return sslsf;
|
||||
return sslsf;
|
||||
} catch (IOException e) {
|
||||
LOG.error(e);
|
||||
} catch (GeneralSecurityException e) {
|
||||
@@ -172,7 +172,7 @@ public class HttpRequestTemplate {
|
||||
// 需要用户认证的代理服务器
|
||||
CredentialsProvider credsProvider = new BasicCredentialsProvider();
|
||||
credsProvider.setCredentials(
|
||||
AuthScope.ANY,
|
||||
AuthScope.ANY,
|
||||
new UsernamePasswordCredentials(configStorage.getAuthUsername(), configStorage.getAuthPassword()));
|
||||
|
||||
|
||||
@@ -352,9 +352,9 @@ public class HttpRequestTemplate {
|
||||
}
|
||||
httpRequest.setResponseType(responseType);
|
||||
try (CloseableHttpResponse response = getHttpClient().execute(httpRequest)) {
|
||||
return httpRequest.handleResponse(response);
|
||||
return httpRequest.handleResponse(response);
|
||||
}catch (IOException e){
|
||||
throw new PayErrorException(new PayException("IOException", e.getLocalizedMessage()));
|
||||
throw new PayErrorException(new PayException("IOException", e.getLocalizedMessage()));
|
||||
}finally {
|
||||
httpRequest.releaseConnection();
|
||||
}
|
||||
@@ -372,6 +372,6 @@ public class HttpRequestTemplate {
|
||||
* @return 类型对象
|
||||
*/
|
||||
public <T>T doExecute(String uri, Object request, Class<T> responseType, MethodType method){
|
||||
return doExecute(URI.create(uri), request, responseType, method);
|
||||
return doExecute(URI.create(uri), request, responseType, method);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -27,6 +27,7 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.StringWriter;
|
||||
import java.nio.charset.Charset;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
|
||||
@@ -232,10 +233,11 @@ public class XML {
|
||||
for (int idx = 0; idx < children.getLength(); ++idx) {
|
||||
Node node = children.item(idx);
|
||||
NodeList nodeList = node.getChildNodes();
|
||||
if (node.getNodeType() == Node.ELEMENT_NODE && nodeList.getLength() <= 1) {
|
||||
m.put(node.getNodeName(), node.getTextContent());
|
||||
} else if (node.getNodeType() == Node.ELEMENT_NODE && nodeList.getLength() > 1) {
|
||||
int length = nodeList.getLength();
|
||||
if (node.getNodeType() == Node.ELEMENT_NODE && length >= 1 && nodeList.item(0).hasChildNodes()) {
|
||||
m.put(node.getNodeName(), getChildren(nodeList));
|
||||
} else if (node.getNodeType() == Node.ELEMENT_NODE ) {
|
||||
m.put(node.getNodeName(), node.getTextContent());
|
||||
}
|
||||
}
|
||||
} catch (Exception e) {
|
||||
@@ -323,13 +325,47 @@ public class XML {
|
||||
value = "";
|
||||
}
|
||||
org.w3c.dom.Element filed = document.createElement(entry.getKey());
|
||||
if (value instanceof Map){
|
||||
/* if (value instanceof Map){
|
||||
map2Xml((Map)value, document, filed);
|
||||
}else if (value instanceof List){
|
||||
List vs = (List)value;
|
||||
for (Object v : vs ){
|
||||
if (value instanceof Map){
|
||||
map2Xml((Map)value, document, filed);
|
||||
}
|
||||
}
|
||||
map2Xml((Map)value, document, filed);
|
||||
}else {
|
||||
value = value.toString().trim();
|
||||
filed.appendChild(document.createTextNode(value.toString()));
|
||||
}
|
||||
}*/
|
||||
object2Xml(value, document, filed);
|
||||
element.appendChild(filed);
|
||||
}
|
||||
}
|
||||
|
||||
private static void object2Xml(Object value, Document document, org.w3c.dom.Element element){
|
||||
|
||||
if (value instanceof Map){
|
||||
map2Xml((Map)value, document, element);
|
||||
}else if (value instanceof List){
|
||||
List vs = (List)value;
|
||||
for (Object v : vs ){
|
||||
object2Xml(v, document, element);
|
||||
}
|
||||
// map2Xml((Map)value, document, element);
|
||||
}else {
|
||||
value = value.toString().trim();
|
||||
element.appendChild(document.createTextNode(value.toString()));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
public static void main(String[] args) {
|
||||
String text = "<data><code>0</code><users><user><id>1</id><name>张三</name></user><user><id>2</id><name>张4</name></user></users></data>";
|
||||
System.out.println( getMap2Xml(toJSONObject(text), "data", "utf-8"));
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.egzosn.pay.common.util.sign;
|
||||
|
||||
|
||||
import com.egzosn.pay.common.bean.SignType;
|
||||
import com.egzosn.pay.common.bean.result.PayException;
|
||||
import com.egzosn.pay.common.exception.PayErrorException;
|
||||
import com.egzosn.pay.common.util.str.StringUtils;
|
||||
@@ -22,7 +23,7 @@ import java.util.*;
|
||||
* date 2016/11/9 17:45
|
||||
* </pre>
|
||||
*/
|
||||
public enum SignUtils {
|
||||
public enum SignUtils implements SignType {
|
||||
|
||||
MD5 {
|
||||
/**
|
||||
@@ -51,6 +52,11 @@ public enum SignUtils {
|
||||
return com.egzosn.pay.common.util.sign.encrypt.MD5.verify(text, sign, key, characterEncoding);
|
||||
}
|
||||
},HMACSHA256{
|
||||
@Override
|
||||
public String getName() {
|
||||
return "HMAC-SHA256";
|
||||
}
|
||||
|
||||
/**
|
||||
* 签名
|
||||
*
|
||||
@@ -279,6 +285,11 @@ public enum SignUtils {
|
||||
return UUID.randomUUID().toString().replace("-", "");
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getName() {
|
||||
return this.name();
|
||||
}
|
||||
|
||||
/**
|
||||
* 签名
|
||||
*
|
||||
@@ -305,15 +316,6 @@ public enum SignUtils {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 签名
|
||||
*
|
||||
* @param content 需要签名的内容
|
||||
* @param key 密钥
|
||||
* @param characterEncoding 字符编码
|
||||
* @return 签名值
|
||||
*/
|
||||
public abstract String createSign(String content, String key, String characterEncoding);
|
||||
|
||||
/**
|
||||
* 签名字符串
|
||||
@@ -330,16 +332,5 @@ public enum SignUtils {
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 签名字符串
|
||||
*
|
||||
* @param text 需要签名的字符串
|
||||
* @param sign 签名结果
|
||||
* @param key 密钥
|
||||
* @param characterEncoding 编码格式
|
||||
* @return 签名结果
|
||||
*/
|
||||
public abstract boolean verify(String text, String sign, String key, String characterEncoding);
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<packaging>war</packaging>
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>pay-java-fuiou</artifactId>
|
||||
|
||||
@@ -9,6 +9,8 @@ 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;
|
||||
import com.egzosn.pay.fuiou.bean.FuiouTransactionType;
|
||||
|
||||
import java.awt.image.BufferedImage;
|
||||
import java.io.InputStream;
|
||||
import java.math.BigDecimal;
|
||||
@@ -21,7 +23,7 @@ import java.util.*;
|
||||
* create 2017 2017/1/16 0016
|
||||
* </pre>
|
||||
*/
|
||||
public class FuiouPayService extends BasePayService<FuiouPayConfigStorage, PayOrder> {
|
||||
public class FuiouPayService extends BasePayService<FuiouPayConfigStorage> {
|
||||
|
||||
/**
|
||||
* 正式域名
|
||||
@@ -134,7 +136,7 @@ public class FuiouPayService extends BasePayService<FuiouPayConfigStorage, PayOr
|
||||
*/
|
||||
@Override
|
||||
public boolean verifySource(String orderId) {
|
||||
LinkedHashMap<String, Object> params = new LinkedHashMap<>();
|
||||
LinkedHashMap<String, Object> params = new LinkedHashMap<String, Object>(3);
|
||||
params.put("mchnt_cd", payConfigStorage.getPid());
|
||||
params.put("order_id", orderId);
|
||||
params.put("md5", createSign(SignUtils.parameters2MD5Str(params, "|"), payConfigStorage.getInputCharset()));
|
||||
@@ -153,6 +155,10 @@ public class FuiouPayService extends BasePayService<FuiouPayConfigStorage, PayOr
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> orderInfo(PayOrder order) {
|
||||
if (null == order.getTransactionType()){
|
||||
order.setTransactionType(FuiouTransactionType.B2C);
|
||||
}
|
||||
|
||||
Map<String, Object> parameters = getOrderInfo(order);
|
||||
String sign = createSign(SignUtils.parameters2MD5Str(parameters, "|"), payConfigStorage.getInputCharset());
|
||||
parameters.put("md5", sign);
|
||||
@@ -165,6 +171,7 @@ public class FuiouPayService extends BasePayService<FuiouPayConfigStorage, PayOr
|
||||
* @return 返回支付请求参数集合
|
||||
*/
|
||||
private Map<String, Object> getOrderInfo(PayOrder order) {
|
||||
|
||||
LinkedHashMap<String, Object> parameters = new LinkedHashMap<String, Object>();
|
||||
//商户代码
|
||||
parameters.put("mchnt_cd", payConfigStorage.getPid());
|
||||
|
||||
@@ -102,7 +102,7 @@
|
||||
|
||||
```java
|
||||
|
||||
Map result = service..query(null, "我方系统单号");
|
||||
Map result = service.query(null, "我方系统单号");
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>pay-java-payoneer</artifactId>
|
||||
|
||||
@@ -16,7 +16,7 @@ import java.util.Map;
|
||||
*
|
||||
*/
|
||||
|
||||
public interface AdvancedPayService extends PayService<PayoneerConfigStorage, PayOrder> {
|
||||
public interface AdvancedPayService extends PayService<PayoneerConfigStorage> {
|
||||
/**
|
||||
* 获取授权页面
|
||||
* @param payeeId 用户id
|
||||
|
||||
@@ -33,7 +33,7 @@ import java.util.*;
|
||||
* create 2018-01-19
|
||||
* </pre>
|
||||
*/
|
||||
public class PayoneerPayService extends BasePayService<PayoneerConfigStorage, PayOrder> implements AdvancedPayService {
|
||||
public class PayoneerPayService extends BasePayService<PayoneerConfigStorage> implements AdvancedPayService {
|
||||
/**
|
||||
* 测试地址
|
||||
*/
|
||||
@@ -263,6 +263,8 @@ public class PayoneerPayService extends BasePayService<PayoneerConfigStorage, Pa
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> microPay(PayOrder order) {
|
||||
order.setTransactionType(PayoneerTransactionType.CHARGE);
|
||||
|
||||
HttpStringEntity entity = new HttpStringEntity(JSON.toJSONString(orderInfo(order)), ContentType.APPLICATION_JSON);
|
||||
//设置 base atuh
|
||||
entity.setHeaders(authHeader());
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -29,7 +29,7 @@ import java.util.concurrent.locks.Lock;
|
||||
* email egzosn@gmail.com
|
||||
* date 2018-4-8 22:15:09
|
||||
*/
|
||||
public class PayPalPayService extends BasePayService<PayPalConfigStorage, PayOrder>{
|
||||
public class PayPalPayService extends BasePayService<PayPalConfigStorage>{
|
||||
|
||||
/**
|
||||
* 沙箱环境
|
||||
@@ -146,6 +146,10 @@ public class PayPalPayService extends BasePayService<PayPalConfigStorage, PayOrd
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> orderInfo(PayOrder order) {
|
||||
if (null == order.getTransactionType()){
|
||||
order.setTransactionType(PayPalTransactionType.sale);
|
||||
}
|
||||
|
||||
Amount amount = new Amount();
|
||||
if (null == order.getCurType()){
|
||||
order.setCurType(DefaultCurType.USD);
|
||||
|
||||
@@ -180,7 +180,7 @@
|
||||
|
||||
```java
|
||||
|
||||
Map result = service..query(null, "我方系统单号");
|
||||
Map result = service.query(null, "我方系统单号");
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -38,7 +38,7 @@ import java.util.*;
|
||||
* create 2017 2017/11/5
|
||||
* </pre>
|
||||
*/
|
||||
public class UnionPayService extends BasePayService<UnionPayConfigStorage, PayOrder> {
|
||||
public class UnionPayService extends BasePayService<UnionPayConfigStorage> {
|
||||
/**
|
||||
* 测试域名
|
||||
*/
|
||||
@@ -379,6 +379,18 @@ public class UnionPayService extends BasePayService<UnionPayConfigStorage, PayOr
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toPay(PayOrder order) {
|
||||
|
||||
if (null == order.getTransactionType()){
|
||||
order.setTransactionType(UnionTransactionType.WEB);
|
||||
}else if (UnionTransactionType.WEB != order.getTransactionType() && UnionTransactionType.WAP != order.getTransactionType() && UnionTransactionType.B2B != order.getTransactionType()){
|
||||
throw new PayErrorException(new PayException("-1", "错误的交易类型:" + order.getTransactionType()));
|
||||
}
|
||||
|
||||
return super.toPay(order);
|
||||
}
|
||||
|
||||
/**
|
||||
* 获取输出二维码,用户返回给支付端,
|
||||
*
|
||||
@@ -387,6 +399,7 @@ public class UnionPayService extends BasePayService<UnionPayConfigStorage, PayOr
|
||||
*/
|
||||
@Override
|
||||
public String getQrPay(PayOrder order) {
|
||||
order.setTransactionType(UnionTransactionType.APPLY_QR_CODE);
|
||||
Map<String, Object> params = orderInfo(order);
|
||||
String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class);
|
||||
Map<String, Object> response = UriVariables.getParametersToMap(responseStr);
|
||||
@@ -411,6 +424,7 @@ public class UnionPayService extends BasePayService<UnionPayConfigStorage, PayOr
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> microPay(PayOrder order) {
|
||||
order.setTransactionType(UnionTransactionType.CONSUME);
|
||||
Map<String, Object> params = orderInfo(order);
|
||||
String responseStr = getHttpRequestTemplate().postForObject(this.getBackTransUrl(), params, String.class);
|
||||
return UriVariables.getParametersToMap(responseStr);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>pay-java-wx-youdian</artifactId>
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.concurrent.locks.Lock;
|
||||
* email egzosn@gmail.com
|
||||
* date 2017/01/12 22:58
|
||||
*/
|
||||
public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorage, PayOrder> {
|
||||
public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorage> {
|
||||
|
||||
private final static String URL = "http://life.51youdian.com/Api/CheckoutCounter/";
|
||||
|
||||
@@ -336,6 +336,7 @@ public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorag
|
||||
|
||||
@Override
|
||||
public String getQrPay(PayOrder order) {
|
||||
order.setTransactionType(YoudianTransactionType.NATIVE);
|
||||
JSONObject orderInfo = orderInfo(order);
|
||||
return (String) orderInfo.get("code_url");
|
||||
}
|
||||
@@ -347,6 +348,7 @@ public class WxYouDianPayService extends BasePayService<WxYouDianPayConfigStorag
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> microPay(PayOrder order) {
|
||||
order.setTransactionType(YoudianTransactionType.MICROPAY);
|
||||
JSONObject orderInfo = orderInfo(order);
|
||||
return orderInfo;
|
||||
}
|
||||
|
||||
@@ -194,7 +194,7 @@
|
||||
|
||||
```java
|
||||
|
||||
Map result = service..query("微信单号", "我方系统单号");
|
||||
Map result = service.query("微信单号", "我方系统单号");
|
||||
|
||||
```
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
<artifactId>pay-java-wx</artifactId>
|
||||
|
||||
@@ -31,12 +31,12 @@ import static com.egzosn.pay.wx.bean.WxTransferType.*;
|
||||
* 微信支付服务
|
||||
*
|
||||
* @author egan
|
||||
* <pre>
|
||||
* <pre>
|
||||
* email egzosn@gmail.com
|
||||
* date 2016-5-18 14:09:01
|
||||
* </pre>
|
||||
*/
|
||||
public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
public class WxPayService extends BasePayService<WxPayConfigStorage> {
|
||||
|
||||
|
||||
/**
|
||||
@@ -95,6 +95,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
this.payConfigStorage = payConfigStorage;
|
||||
return this;
|
||||
}
|
||||
|
||||
/**
|
||||
* 根据交易类型获取url
|
||||
*
|
||||
@@ -222,7 +223,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
parameters.put("time_expire", DateUtils.formatDate(order.getExpirationTime(), DateUtils.YYYYMMDDHHMMSS));
|
||||
}
|
||||
((WxTransactionType) order.getTransactionType()).setAttribute(parameters, order);
|
||||
parameters = preOrderHandler(parameters, order);
|
||||
parameters = preOrderHandler(parameters, order);
|
||||
setSign(parameters);
|
||||
|
||||
String requestXML = XML.getMap2Xml(parameters);
|
||||
@@ -275,7 +276,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
params.put("noncestr", result.get(NONCE_STR));
|
||||
params.put("package", "Sign=WXPay");
|
||||
}
|
||||
params = preOrderHandler(params, order);
|
||||
params = preOrderHandler(params, order);
|
||||
String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset());
|
||||
params.put(SIGN, paySign);
|
||||
return params;
|
||||
@@ -291,11 +292,12 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
* @return 请求参数
|
||||
*/
|
||||
private Map<String, Object> setSign(Map<String, Object> parameters) {
|
||||
String signType = payConfigStorage.getSignType();
|
||||
if (HMACSHA256.equals(signType)) {
|
||||
signType = HMAC_SHA256;
|
||||
|
||||
String signTypeStr = payConfigStorage.getSignType();
|
||||
if (HMACSHA256.equals(signTypeStr)) {
|
||||
signTypeStr = SignUtils.HMACSHA256.getName();
|
||||
}
|
||||
parameters.put("sign_type", signType);
|
||||
parameters.put("sign_type", signTypeStr);
|
||||
String sign = createSign(SignUtils.parameterText(parameters, "&", SIGN, "appId"), payConfigStorage.getInputCharset());
|
||||
parameters.put(SIGN, sign);
|
||||
return parameters;
|
||||
@@ -338,21 +340,22 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
|
||||
return createSign(content, characterEncoding, payConfigStorage.isTest());
|
||||
}
|
||||
|
||||
/**
|
||||
* 签名
|
||||
*
|
||||
* @param content 需要签名的内容 不包含key
|
||||
* @param characterEncoding 字符编码
|
||||
* @param test 是否为沙箱环境
|
||||
* @param test 是否为沙箱环境
|
||||
* @return 签名结果
|
||||
*/
|
||||
public String createSign(String content, String characterEncoding, boolean test) {
|
||||
SignUtils signUtils = SignUtils.valueOf(payConfigStorage.getSignType().toUpperCase());
|
||||
SignType signType = SignUtils.valueOf(payConfigStorage.getSignType().toUpperCase());
|
||||
String keyPrivate = payConfigStorage.getKeyPrivate();
|
||||
if (test){
|
||||
if (test) {
|
||||
keyPrivate = getKeyPrivate();
|
||||
}
|
||||
return signUtils.createSign(content + "&key=" + (signUtils == SignUtils.MD5 ? "" : keyPrivate), keyPrivate, characterEncoding).toUpperCase();
|
||||
return signType.createSign(content + "&key=" + (signType == SignUtils.MD5 ? "" : keyPrivate), keyPrivate, characterEncoding).toUpperCase();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -426,14 +429,16 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
* @return 返回二维码信息,,支付时需要的
|
||||
*/
|
||||
@Override
|
||||
public String getQrPay(PayOrder order){
|
||||
public String getQrPay(PayOrder order) {
|
||||
order.setTransactionType(WxTransactionType.NATIVE);
|
||||
Map<String, Object> orderInfo = orderInfo(order);
|
||||
//获取对应的支付账户操作工具(可根据账户id)
|
||||
if (!SUCCESS.equals(orderInfo.get(RESULT_CODE))) {
|
||||
throw new PayErrorException(new WxPayError((String)orderInfo.get("err_code"), orderInfo.toString()));
|
||||
throw new PayErrorException(new WxPayError((String) orderInfo.get("err_code"), orderInfo.toString()));
|
||||
}
|
||||
return (String) orderInfo.get("code_url");
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷卡付,pos主动扫码付款
|
||||
*
|
||||
@@ -442,7 +447,12 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
*/
|
||||
@Override
|
||||
public Map<String, Object> microPay(PayOrder order) {
|
||||
if (null == order.getTransactionType()) {
|
||||
order.setTransactionType(WxTransactionType.MICROPAY);
|
||||
|
||||
} else if (WxTransactionType.MICROPAY != order.getTransactionType() && WxTransactionType.FACEPAY != order.getTransactionType()) {
|
||||
throw new PayErrorException(new PayException("-1", "错误的交易类型:" + order.getTransactionType()));
|
||||
}
|
||||
return orderInfo(order);
|
||||
}
|
||||
|
||||
@@ -527,7 +537,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
parameters.put("total_fee", Util.conversionCentAmount(refundOrder.getTotalAmount()));
|
||||
parameters.put("refund_fee", Util.conversionCentAmount(refundOrder.getRefundAmount()));
|
||||
parameters.put("op_user_id", payConfigStorage.getPid());
|
||||
setParameters(parameters, "notify_url", payConfigStorage.getNotifyUrl());
|
||||
setParameters(parameters, "notify_url", payConfigStorage.getNotifyUrl());
|
||||
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
@@ -563,7 +573,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
setParameters(parameters, "out_refund_no", refundOrder.getRefundNo());
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
return requestTemplate.postForObject(getReqUrl( WxTransactionType.REFUNDQUERY), XML.getMap2Xml(parameters) , JSONObject.class);
|
||||
return requestTemplate.postForObject(getReqUrl(WxTransactionType.REFUNDQUERY), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
}
|
||||
|
||||
|
||||
@@ -633,7 +643,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
}
|
||||
//设置签名
|
||||
setSign(parameters);
|
||||
return requestTemplate.postForObject(getReqUrl(transactionType), XML.getMap2Xml(parameters) , JSONObject.class);
|
||||
return requestTemplate.postForObject(getReqUrl(transactionType), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -642,13 +652,13 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
* @param order 转账订单
|
||||
* <pre>
|
||||
*
|
||||
* 注意事项:
|
||||
* ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
|
||||
* ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
|
||||
* ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
|
||||
* ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
|
||||
* 注意事项:
|
||||
* ◆ 当返回错误码为“SYSTEMERROR”时,请不要更换商户订单号,一定要使用原商户订单号重试,否则可能造成重复支付等资金风险。
|
||||
* ◆ XML具有可扩展性,因此返回参数可能会有新增,而且顺序可能不完全遵循此文档规范,如果在解析回包的时候发生错误,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新回包字段,会更新到此API文档中。
|
||||
* ◆ 因为错误代码字段err_code的值后续可能会增加,所以商户如果遇到回包返回新的错误码,请商户务必不要换单重试,请商户联系客服确认付款情况。如果有新的错误码,会更新到此API文档中。
|
||||
* ◆ 错误代码描述字段err_code_des只供人工定位问题时做参考,系统实现时请不要依赖这个字段来做自动化处理。
|
||||
*
|
||||
* </pre>
|
||||
* </pre>
|
||||
* @return 对应的转账结果
|
||||
*/
|
||||
@Override
|
||||
@@ -672,7 +682,7 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
}
|
||||
parameters.put(SIGN, createSign(SignUtils.parameterText(parameters, "&", SIGN), payConfigStorage.getInputCharset()));
|
||||
|
||||
return getHttpRequestTemplate().postForObject(getReqUrl(order.getTransferType()), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
return getHttpRequestTemplate().postForObject(getReqUrl(order.getTransferType()), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -740,11 +750,11 @@ public class WxPayService extends BasePayService<WxPayConfigStorage, PayOrder> {
|
||||
throw new PayErrorException(new WxPayError(FAILURE, "微信转账类型 #transferQuery(String outNo, String wxTransferType) 必填,详情com.egzosn.pay.wx.bean.WxTransferType"));
|
||||
}
|
||||
//如果类型为余额方式
|
||||
if (TRANSFERS.getType().equals(wxTransferType) || GETTRANSFERINFO.getType().equals(wxTransferType)){
|
||||
return getHttpRequestTemplate().postForObject(getReqUrl(GETTRANSFERINFO), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
if (TRANSFERS.getType().equals(wxTransferType) || GETTRANSFERINFO.getType().equals(wxTransferType)) {
|
||||
return getHttpRequestTemplate().postForObject(getReqUrl(GETTRANSFERINFO), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
}
|
||||
//默认查询银行卡的记录
|
||||
return getHttpRequestTemplate().postForObject(getReqUrl(QUERY_BANK), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
return getHttpRequestTemplate().postForObject(getReqUrl(QUERY_BANK), XML.getMap2Xml(parameters), JSONObject.class);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
<parent>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<groupId>com.egzosn</groupId>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
</parent>
|
||||
<modelVersion>4.0.0</modelVersion>
|
||||
|
||||
|
||||
@@ -27,7 +27,7 @@ import java.util.TreeMap;
|
||||
* email egzosn@gmail.com
|
||||
* * date 2019/04/15 22:51
|
||||
*/
|
||||
public class YiJiPayService extends BasePayService<YiJiPayConfigStorage, PayOrder> {
|
||||
public class YiJiPayService extends BasePayService<YiJiPayConfigStorage> {
|
||||
|
||||
/**
|
||||
* 正式测试环境
|
||||
|
||||
8
pom.xml
8
pom.xml
@@ -7,7 +7,7 @@
|
||||
<groupId>com.egzosn</groupId>
|
||||
<artifactId>pay-java-parent</artifactId>
|
||||
<packaging>pom</packaging>
|
||||
<version>2.12.9-SNAPSHOT</version>
|
||||
<version>2.13.1-SNAPSHOT</version>
|
||||
|
||||
<name>Pay Java - Parent</name>
|
||||
<description>Pay Java Parent</description>
|
||||
@@ -58,7 +58,7 @@
|
||||
|
||||
|
||||
<properties>
|
||||
<pay.version>2.12.9-SNAPSHOT</pay.version>
|
||||
<pay.version>2.13.1-SNAPSHOT</pay.version>
|
||||
<httpmime.version>4.5.4</httpmime.version>
|
||||
<log4j.version>1.2.17</log4j.version>
|
||||
<fastjson.version>1.2.58</fastjson.version>
|
||||
@@ -184,9 +184,9 @@
|
||||
<execution>
|
||||
<id>sign-artifacts</id>
|
||||
<phase>none</phase>
|
||||
<goals>
|
||||
<!-- <goals>
|
||||
<goal>sign</goal>
|
||||
</goals>
|
||||
</goals>-->
|
||||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
|
||||
Reference in New Issue
Block a user