diff --git a/README.md b/README.md index 51d2760..128cf50 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,9 @@ 测试链接 : http://pay.egan.in/index.html -详细使用与简单教程请看 [pay-java-demo](pay-java-demo?dir=1&filepath=pay-java-demo) +服务端+网页端详细使用与简单教程请看 [pay-java-demo](pay-java-demo?dir=1&filepath=pay-java-demo) +android 案例 [pay-java-demo](http://git.oschina.net/egzosn/pay-java-android) + ##交流 很希望更多志同道合友友一起扩展新的的支付接口。 diff --git a/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java b/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java index f0d28c3..bc5771e 100644 --- a/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java +++ b/pay-java-ali/src/main/java/in/egan/pay/ali/api/AliPayService.java @@ -35,11 +35,23 @@ import java.util.*; public class AliPayService extends BasePayService { protected final Log log = LogFactory.getLog(AliPayService.class); - -// private String httpsReqUrl = "https://openapi.alipay.com/gateway.do"; - private String httpsReqUrl = "https://openapi.alipaydev.com/gateway.do"; + //正式测试环境 + private String httpsReqUrl = "https://openapi.alipay.com/gateway.do"; + //沙箱测试环境账号 + private String devReqUrl = "https://openapi.alipaydev.com/gateway.do"; + //兼容上一版本即时收款 private String httpsReqUrlBefore = "https://mapi.alipay.com/gateway.do"; + + /** + * 获取对应的请求地址 + * @return + */ + public String getReqUrl(){ + return payConfigStorage.isTest() ? devReqUrl : httpsReqUrl; + } + + public AliPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { super(payConfigStorage, configStorage); } @@ -50,7 +62,7 @@ public class AliPayService extends BasePayService { public String getHttpsVerifyUrl() { - return httpsReqUrl + "?service=notify_verify"; + return getReqUrl() + "?service=notify_verify"; } @Override @@ -105,11 +117,6 @@ public class AliPayService extends BasePayService { parameters.put("sign_type", payConfigStorage.getSignType()); String sign = createSign( SignUtils.parameterText(parameters, "&", "sign"), payConfigStorage.getInputCharset()); - /* try { - sign = URLEncoder.encode(sign, payConfigStorage.getInputCharset()); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - }*/ parameters.put("sign", sign); return parameters; } @@ -124,17 +131,6 @@ public class AliPayService extends BasePayService { @Override public Map orderInfo(PayOrder order) { -/* Map orderInfo = getOrder(order); - - String sign = createSign( SignUtils.parameterText(orderInfo, "&"), "UTF-8"); - - try { - sign = URLEncoder.encode(sign, "UTF-8"); - } catch (UnsupportedEncodingException e) { - e.printStackTrace(); - } - orderInfo.put("sign", sign); - orderInfo.put("sign_type", payConfigStorage.getSignType());*/ return setSign(getOrder(order)); } @@ -149,19 +145,12 @@ public class AliPayService extends BasePayService { */ private Map getOrder(PayOrder order) { - //兼容上一版本 + //兼容上一版本 即时收款 /* if (AliTransactionType.DIRECT == order.getTransactionType() || AliTransactionType.MOBILE == order.getTransactionType() || AliTransactionType.WAPPAY == order.getTransactionType()){ return getOrderBefore(order); } */ - /* Map orderInfo = new TreeMap<>(); - orderInfo.put("app_id", payConfigStorage.getAppid()); - orderInfo.put("method", order.getTransactionType().getType()); - orderInfo.put("charset", payConfigStorage.getInputCharset()); - DateFormat formatter = DateFormat.getDateTimeInstance(); - orderInfo.put("timestamp", formatter.format( new Date())); - orderInfo.put("version", "1.0");*/ Map orderInfo = getPublicParameters(order.getTransactionType()); orderInfo.put("notify_url", payConfigStorage.getNotifyUrl()); @@ -313,7 +302,7 @@ public class AliPayService extends BasePayService { } else { String biz_content = (String)orderInfo.remove("biz_content"); - formHtml.append(httpsReqUrl).append("?").append(ClientHttpRequest.getMapToParameters(orderInfo)) + formHtml.append(getReqUrl()).append("?").append(ClientHttpRequest.getMapToParameters(orderInfo)) .append("\" method=\"") .append(method.name().toLowerCase()).append("\">"); @@ -405,12 +394,12 @@ public class AliPayService extends BasePayService { Map parameters = getPublicParameters(AliTransactionType.REFUND); Map bizContent = getBizContent(tradeNo, outTradeNo, null); - bizContent.put("refund_amount", refundAmount); + bizContent.put("refund_amount", refundAmount.setScale(2, BigDecimal.ROUND_HALF_UP).toString()); //设置请求参数的集合 parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); + return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); } @Override @@ -468,7 +457,7 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", JSON.toJSONString(bizContent)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); + return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); } /** @@ -505,7 +494,7 @@ public class AliPayService extends BasePayService { parameters.put("biz_content", getContentToJson(tradeNoOrBillDate.toString(), outTradeNoBillType)); //设置签名 setSign(parameters); - return callback.perform(requestTemplate.getForObject(httpsReqUrl + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); + return callback.perform(requestTemplate.getForObject(getReqUrl() + "?" + ClientHttpRequest.getMapToParameters(parameters), JSONObject.class)); } diff --git a/pay-java-common/src/main/java/in/egan/pay/common/api/BasePayConfigStorage.java b/pay-java-common/src/main/java/in/egan/pay/common/api/BasePayConfigStorage.java index 17d5f1a..9926cf4 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/api/BasePayConfigStorage.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/api/BasePayConfigStorage.java @@ -45,6 +45,9 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{ //授权码锁 private Lock accessTokenLock = new ReentrantLock(); + private boolean isTest = false; + + @Override public String getKeyPrivate() { return keyPrivate; @@ -160,4 +163,24 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{ return null; } + public void setAccessToken(String accessToken) { + this.accessToken = accessToken; + } + + public void setExpiresTime(long expiresTime) { + this.expiresTime = expiresTime; + } + + public void setAccessTokenLock(Lock accessTokenLock) { + this.accessTokenLock = accessTokenLock; + } + + @Override + public boolean isTest() { + return isTest; + } + + public void setTest(boolean test) { + isTest = test; + } } diff --git a/pay-java-common/src/main/java/in/egan/pay/common/api/PayConfigStorage.java b/pay-java-common/src/main/java/in/egan/pay/common/api/PayConfigStorage.java index fb8f0f6..cdbe959 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/api/PayConfigStorage.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/api/PayConfigStorage.java @@ -127,4 +127,9 @@ import java.util.concurrent.locks.Lock; */ void updateAccessToken(String accessToken, long expiresTime); + /** + * 是否为测试环境, true测试环境 + * @return + */ + boolean isTest(); } diff --git a/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java b/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java index a067835..ba1c601 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/api/PayService.java @@ -224,8 +224,8 @@ public interface PayService { /** * 下载对账单 * - * @param billDate 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; - * @param billType 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 + * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 + * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; * @return */ Object downloadbill(Date billDate, String billType); @@ -242,9 +242,9 @@ public interface PayService { T downloadbill(Date billDate, String billType, Callback callback); /** - * 交易辅助接口 + * 通用查询接口 * - * @param tradeNoOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link in.egan.pay.common.exception.PayErrorException} + * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link in.egan.pay.common.exception.PayErrorException} * * @param outTradeNoBillType 商户单号或者 账单类型 * @param transactionType 交易类型 diff --git a/pay-java-common/src/main/java/in/egan/pay/common/before/api/BasePayConfigStorage.java b/pay-java-common/src/main/java/in/egan/pay/common/before/api/BasePayConfigStorage.java index 4fad378..89afd4e 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/before/api/BasePayConfigStorage.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/before/api/BasePayConfigStorage.java @@ -54,6 +54,7 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{ protected volatile String httpProxyUsername; protected volatile String httpProxyPassword; + private boolean isTest = false; /** * 合作商唯一标识 @@ -226,5 +227,12 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{ public void expireAccessToken() { this.expiresTime = 0; } + @Override + public boolean isTest() { + return isTest; + } + public void setTest(boolean test) { + isTest = test; + } } diff --git a/pay-java-common/src/main/java/in/egan/pay/common/before/api/PayConfigStorage.java b/pay-java-common/src/main/java/in/egan/pay/common/before/api/PayConfigStorage.java index 13ab2e3..a4fbef5 100644 --- a/pay-java-common/src/main/java/in/egan/pay/common/before/api/PayConfigStorage.java +++ b/pay-java-common/src/main/java/in/egan/pay/common/before/api/PayConfigStorage.java @@ -164,4 +164,10 @@ import java.util.concurrent.locks.Lock; @Deprecated String getHttpProxyPassword(); + + /** + * 是否为测试环境, true测试环境 + * @return + */ + boolean isTest(); } diff --git a/pay-java-demo/README.md b/pay-java-demo/README.md index ba9bf18..57ecbac 100644 --- a/pay-java-demo/README.md +++ b/pay-java-demo/README.md @@ -127,7 +127,7 @@ public class PayResponse { /** * 初始化支付配置 * @param apyAccount 账户信息 - * @see ApyAccount 对应表结构详情--》 pay-java-demo/resources/apy_account.sql + * @see in.egan.pay.demo.entity.ApyAccount 对应表结构详情--》 pay-java-demo/resources/apy_account.sql */ public void init(ApyAccount apyAccount) { @@ -305,6 +305,7 @@ public class ApyAccountService { * @param bankType 针对刷卡支付,卡的类型,类型值 * @return */ + @RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8") public String toPay( Integer payId, String transactionType, String bankType, BigDecimal price) { //获取对应的支付账户操作工具(可根据账户id) @@ -358,6 +359,83 @@ public class ApyAccountService { } + /** + * 查询 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("query") + public Map query(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + return payResponse.getService().query(order.getTradeNo(), order.getOutTradeNo()); + } + /** + * 交易关闭接口 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("close") + public Map close(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + return payResponse.getService().close(order.getTradeNo(), order.getOutTradeNo()); + } + + /** + * 申请退款接口 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("refund") + public Map refund(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + + + return payResponse.getService().refund(order.getTradeNo(), order.getOutTradeNo(), order.getRefundAmount(), order.getTotalAmount()); + } + + /** + * 查询退款 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("refundquery") + public Map refundquery(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + return payResponse.getService().refundquery(order.getTradeNo(), order.getOutTradeNo()); + } + + /** + * 下载对账单 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("downloadbill") + public Object downloadbill(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + + return payResponse.getService().downloadbill(order.getBillDate(), order.getBillType()); + } + + + /** + * 通用查询接口,根据 TransactionType 类型进行实现,此接口不包括退款 + * @param order 订单的请求体 + * + * @return + */ + @RequestMapping("secondaryInterface") + public Map secondaryInterface(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + TransactionType type = PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(order.getTransactionType()); + return payResponse.getService().secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback>() { + @Override + public Map perform(Map map) { + return map; + } + }); + } + + ``` diff --git a/pay-java-demo/pom.xml b/pay-java-demo/pom.xml index 4d6b79d..a893771 100644 --- a/pay-java-demo/pom.xml +++ b/pay-java-demo/pom.xml @@ -38,6 +38,11 @@ pay-java-wx-youdian ${pay.version} + + in.egan + pay-java-fuiou + ${pay.version} + diff --git a/pay-java-demo/src/main/java/in/egan/pay/demo/controller/PayController.java b/pay-java-demo/src/main/java/in/egan/pay/demo/controller/PayController.java index 8fe931a..5cc0097 100644 --- a/pay-java-demo/src/main/java/in/egan/pay/demo/controller/PayController.java +++ b/pay-java-demo/src/main/java/in/egan/pay/demo/controller/PayController.java @@ -8,6 +8,7 @@ import in.egan.pay.common.bean.*; import in.egan.pay.common.util.str.StringUtils; import in.egan.pay.demo.entity.ApyAccount; import in.egan.pay.demo.entity.PayType; +import in.egan.pay.demo.request.QueryOrder; import in.egan.pay.demo.service.ApyAccountService; import in.egan.pay.demo.service.PayResponse; import in.egan.pay.common.api.PayConfigStorage; @@ -149,27 +150,73 @@ public class PayController{ /** * 查询 - * @param payId + * @param order 订单的请求体 * @return */ @RequestMapping("query") - public Map query(Integer payId) { - PayResponse payResponse = service.getPayResponse(payId); - - - return payResponse.getService().query("4009922001201703072549284850", "8a2950f95a8e17e1015aa7a6eb872ccb"); + public Map query(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + return payResponse.getService().query(order.getTradeNo(), order.getOutTradeNo()); + } + /** + * 交易关闭接口 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("close") + public Map close(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + return payResponse.getService().close(order.getTradeNo(), order.getOutTradeNo()); } /** - * 通用接口,根据 TransactionType 类型进行实现 - * @param payId + * 申请退款接口 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("refund") + public Map refund(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + + + return payResponse.getService().refund(order.getTradeNo(), order.getOutTradeNo(), order.getRefundAmount(), order.getTotalAmount()); + } + + /** + * 查询退款 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("refundquery") + public Map refundquery(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + return payResponse.getService().refundquery(order.getTradeNo(), order.getOutTradeNo()); + } + + /** + * 下载对账单 + * @param order 订单的请求体 + * @return + */ + @RequestMapping("downloadbill") + public Object downloadbill(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + + return payResponse.getService().downloadbill(order.getBillDate(), order.getBillType()); + } + + + /** + * 通用查询接口,根据 TransactionType 类型进行实现,此接口不包括退款 + * @param order 订单的请求体 + * * @return */ @RequestMapping("secondaryInterface") - public Map secondaryInterface(Integer payId, String transactionType) { - PayResponse payResponse = service.getPayResponse(payId); - TransactionType type = PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType); - return payResponse.getService().secondaryInterface("2017012921001004530273937216", "8a2950f959cf08740159ea0666fc04bd", type, new Callback>() { + public Map secondaryInterface(QueryOrder order) { + PayResponse payResponse = service.getPayResponse(order.getPayId()); + TransactionType type = PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(order.getTransactionType()); + return payResponse.getService().secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback>() { @Override public Map perform(Map map) { return map; diff --git a/pay-java-demo/src/main/java/in/egan/pay/demo/dao/ApyAccountRepository.java b/pay-java-demo/src/main/java/in/egan/pay/demo/dao/ApyAccountRepository.java index 59ce2c2..efdef0c 100644 --- a/pay-java-demo/src/main/java/in/egan/pay/demo/dao/ApyAccountRepository.java +++ b/pay-java-demo/src/main/java/in/egan/pay/demo/dao/ApyAccountRepository.java @@ -29,15 +29,16 @@ public class ApyAccountRepository { { ApyAccount apyAccount1 = new ApyAccount(); apyAccount1.setPayId(1); - apyAccount1.setPartner("2088****78307"); - apyAccount1.setAppid("20160****2728"); + apyAccount1.setPartner("2088102169916436"); + apyAccount1.setAppid("2016080400165436"); // TODO 2017/2/9 16:20 author: egan sign_type只有单一key时public_key与private_key相等,比如sign_type=MD5的情况 - apyAccount1.setPublicKey("MIGfMA0GCSqGSIb3DQE************LCUYuLkxpLQIDAQAB"); - apyAccount1.setPrivateKey("MIICdwIBADANBg************ZBBpE/RtR9Mty8CQFqhVygF3FIiz5Sc38sz12RqOT7kUQK3R0FiATOtXkKHLzb/QyolOXi/avhLp/gIl7+IqZg51Vx8BvyypnIfKgw="); + apyAccount1.setPublicKey("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB"); + apyAccount1.setPrivateKey("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw==\n"); apyAccount1.setNotifyUrl("http://pay.egan.in/payBack2.json"); // 无需同步回调可不填 - apyAccount1.setReturnUrl(""); +// apyAccount1.setReturnUrl(""); apyAccount1.setInputCharset("UTF-8"); + apyAccount1.setSeller("2088102169916436"); apyAccount1.setSignType(SignUtils.RSA.name()); apyAccount1.setPayType(PayType.aliPay); apyAccount1.setMsgType(MsgType.text); diff --git a/pay-java-demo/src/main/java/in/egan/pay/demo/entity/ApyAccount.java b/pay-java-demo/src/main/java/in/egan/pay/demo/entity/ApyAccount.java index e6ac02b..456e5ca 100644 --- a/pay-java-demo/src/main/java/in/egan/pay/demo/entity/ApyAccount.java +++ b/pay-java-demo/src/main/java/in/egan/pay/demo/entity/ApyAccount.java @@ -54,7 +54,8 @@ public class ApyAccount { // @Enumerated(EnumType.STRING) // @Column(name = "msg_type") private MsgType msgType; - + //是否为测试环境 + private boolean isTest = false; public Integer getPayId() { return payId; } @@ -151,6 +152,14 @@ public class ApyAccount { this.inputCharset = inputCharset; } + public boolean isTest() { + return isTest; + } + + public void setTest(boolean test) { + isTest = test; + } + @Override public String toString() { return "ApyAccount{" + diff --git a/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java b/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java index 9c9b0f0..d896d46 100644 --- a/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java +++ b/pay-java-demo/src/main/java/in/egan/pay/demo/entity/PayType.java @@ -43,6 +43,7 @@ public enum PayType implements BasePayType { aliPayConfigStorage.setPayType(apyAccount.getPayType().toString()); aliPayConfigStorage.setMsgType(apyAccount.getMsgType()); aliPayConfigStorage.setInputCharset(apyAccount.getInputCharset()); + aliPayConfigStorage.setTest(apyAccount.isTest()); return new AliPayService(aliPayConfigStorage); } @@ -67,6 +68,7 @@ public enum PayType implements BasePayType { wxPayConfigStorage.setPayType(apyAccount.getPayType().toString()); wxPayConfigStorage.setMsgType(apyAccount.getMsgType()); wxPayConfigStorage.setInputCharset(apyAccount.getInputCharset()); + wxPayConfigStorage.setTest(apyAccount.isTest()); return new WxPayService(wxPayConfigStorage); } @@ -95,6 +97,7 @@ public enum PayType implements BasePayType { wxPayConfigStorage.setMsgType(apyAccount.getMsgType()); wxPayConfigStorage.setSeller(apyAccount.getSeller()); wxPayConfigStorage.setInputCharset(apyAccount.getInputCharset()); + wxPayConfigStorage.setTest(apyAccount.isTest()); return new WxYouDianPayService(wxPayConfigStorage); } diff --git a/pay-java-demo/src/main/java/in/egan/pay/demo/request/QueryOrder.java b/pay-java-demo/src/main/java/in/egan/pay/demo/request/QueryOrder.java new file mode 100644 index 0000000..79c21f3 --- /dev/null +++ b/pay-java-demo/src/main/java/in/egan/pay/demo/request/QueryOrder.java @@ -0,0 +1,116 @@ +package in.egan.pay.demo.request; + +import in.egan.pay.common.bean.TransactionType; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 订单辅助接口 + * @author: egan + * @email egzosn@gmail.com + * @date 2017/3/12 14:50 + */ +public class QueryOrder { + + private Integer payId; +// 支付平台订单号 + private String tradeNo; + +// 商户单号 + private String outTradeNo; +// 退款金额 + private BigDecimal refundAmount; +// 总金额 + private BigDecimal totalAmount; +// 账单时间:具体请查看对应支付平台 + private Date billDate; +// 账单时间:具体请查看对应支付平台 + private String billType; + // 支付平台订单号或者账单日期 + private Object tradeNoOrBillDate; + // 商户单号或者 账单类型 + private String outTradeNoBillType; + // 交易类型 + private String transactionType; + + public Integer getPayId() { + return payId; + } + + public void setPayId(Integer payId) { + this.payId = payId; + } + + public String getTradeNo() { + return tradeNo; + } + + public void setTradeNo(String tradeNo) { + this.tradeNo = tradeNo; + } + + public String getOutTradeNo() { + return outTradeNo; + } + + public void setOutTradeNo(String outTradeNo) { + this.outTradeNo = outTradeNo; + } + + public BigDecimal getRefundAmount() { + return refundAmount; + } + + public void setRefundAmount(BigDecimal refundAmount) { + this.refundAmount = refundAmount; + } + + public BigDecimal getTotalAmount() { + return totalAmount; + } + + public void setTotalAmount(BigDecimal totalAmount) { + this.totalAmount = totalAmount; + } + + public Date getBillDate() { + return billDate; + } + + public void setBillDate(Date billDate) { + this.billDate = billDate; + } + + public String getBillType() { + return billType; + } + + public void setBillType(String billType) { + this.billType = billType; + } + + public Object getTradeNoOrBillDate() { + return tradeNoOrBillDate; + } + + public void setTradeNoOrBillDate(Object tradeNoOrBillDate) { + this.tradeNoOrBillDate = tradeNoOrBillDate; + } + + public String getOutTradeNoBillType() { + return outTradeNoBillType; + } + + public void setOutTradeNoBillType(String outTradeNoBillType) { + this.outTradeNoBillType = outTradeNoBillType; + } + + public String getTransactionType() { + return transactionType; + } + + public void setTransactionType(String transactionType) { + this.transactionType = transactionType; + } +} diff --git a/pay-java-demo/src/main/webapp/index.html b/pay-java-demo/src/main/webapp/index.html index d5b98f1..fffa00e 100644 --- a/pay-java-demo/src/main/webapp/index.html +++ b/pay-java-demo/src/main/webapp/index.html @@ -7,6 +7,7 @@ + 账户信息添加用于下面测试
@@ -31,7 +32,7 @@
- 编码类型(建议UTF-8) + 编码类型(建议UTF-8)
支付账户类型 +
+ 是否为沙箱环境
@@ -51,7 +57,8 @@
各个支付对应的交易类型可自行查看对应的官方文档,本项目已实现几种交易类型,对应各个支付类型的in.egan.pay.common.bean.TransactionType具体实现
-
支付宝(in.egan.pay.ali.bean.AliTransactionType): 即时付款=DIRECT , 移动支付=APP , 手机网站支付=WAP
+
旧版支付宝(in.egan.pay.ali.before.bean.AliTransactionType): 即时付款=DIRECT , 移动支付=APP , 手机网站支付=WAP
+
新版支付宝(in.egan.pay.ali.bean.AliTransactionType): app支付=APP , 手机网站支付=WAP , 扫码付=SWEEPPAY, 条码付=BAR_CODE, 声波付=WAVE_CODE
微信(in.egan.pay.wx.bean.WxTransactionType): 公众号支付=JSAPI , 移动支付=APP , 扫码付=NATIVE
友店微信(in.egan.pay.wx.youdian.bean.YoudianTransactionType): 扫码付=NATIVE
@@ -92,6 +99,80 @@ APP提交(返回对应的json,具体实现,app端demo暂时未实现)
+
+查询账单 +
+ 账户id +
+ 支付平台订单号 +
+ 商户单号 +
+ +
+
+交易关闭接口 +
+ 账户id +
+ 支付平台订单号 +
+ 商户单号 +
+ +
+
+申请退款接口 +
+ 账户id +
+ 支付平台订单号 +
+ 商户单号 +
+ 退款金额 +
+ 总金额(微信必填) +
+ +
+
+查询退款 +
+ 账户id +
+ 支付平台订单号 +
+ 商户单号 +
+ +
+ +
+下载对账单(日期,不支持月份) +
+ 账户id +
+ 账单时间:具体请查看对应支付平台 +
+ 账单类型 +
+ +
+ +
+通用查询接口,根据 交易类型(TransactionType) 进行实现,此接口不包括退款 +
+ 账户id +
+ 支付平台订单号或者账单日期 +
+ 商户单号或者 账单类型 +
+ 交易类型 +
+ +