diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/AdvancedPayService.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/AdvancedPayService.java new file mode 100644 index 0000000..df22fec --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/AdvancedPayService.java @@ -0,0 +1,22 @@ +package com.egzosn.pay.common.api; + +import com.egzosn.pay.common.bean.AuthPageType; + +/** + * 高级支付接口 + * @author Actinia + * @email hayesfu@qq.com + * @date 2018/1/18 + * + */ + +public interface AdvancedPayService extends PayService{ + /** + * 获取授权页面 + * @param payeeId 收款id + * @param authPageType 授权类型 + * @return 返回请求结果 + */ + String getAuthorizationPage(String payeeId,AuthPageType authPageType); + +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/AuthPageType.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/AuthPageType.java new file mode 100644 index 0000000..1d6c856 --- /dev/null +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/AuthPageType.java @@ -0,0 +1,12 @@ +package com.egzosn.pay.common.bean; + +/** + * 授权页面的授权类型 + * @author Actinia + * @email hayesfu@qq.com + * @date 2018/1/18 + */ +public enum AuthPageType { + //注册,登录 + registration,login; +} diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CurType.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CurType.java index e58f8cf..08c3cb4 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CurType.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/CurType.java @@ -1,16 +1,39 @@ -package com.egzosn.pay.common.bean;/** - * Created by Fuzx on 2017/1/24 0024. - */ +package com.egzosn.pay.common.bean; /** - * @author Fuzx 货币类型 - * create 2017 2017/1/24 0024 + * 货币类型 + * @author Actinia + * @email hayesfu@qq.com + *
+ * create 2017 2017/1/16
+ * 
*/ -public interface CurType { +public enum CurType { + + CNY("人民币"), + USD("美元"), + HKD("港币"), + MOP("澳门元"), + EUR("欧元"), + TWD("新台币"), + KRW("韩元"), + JPY("日元"), + SGD("新加坡元"), + AUD("澳大利亚元"); /** - * 货币类型 - * @return 货币类型 + * 币种名称 */ - String getCurType(); + private String name; + //索引 + private int index; + + /** + * 构造函数 + * @param name + */ + CurType(String name) { + this.name = name; + } + } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpRequestTemplate.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpRequestTemplate.java index 4c0fa1f..687f601 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpRequestTemplate.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/HttpRequestTemplate.java @@ -4,19 +4,26 @@ import com.egzosn.pay.common.bean.MethodType; import com.egzosn.pay.common.util.str.StringUtils; import org.apache.http.HttpHost; import org.apache.http.auth.AuthScope; +import org.apache.http.auth.Credentials; import org.apache.http.auth.UsernamePasswordCredentials; +import org.apache.http.client.AuthCache; import org.apache.http.client.CredentialsProvider; import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.http.client.protocol.HttpClientContext; import org.apache.http.conn.ssl.DefaultHostnameVerifier; import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.impl.auth.BasicScheme; +import org.apache.http.impl.client.BasicAuthCache; import org.apache.http.impl.client.BasicCredentialsProvider; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.ssl.SSLContexts; + import javax.net.ssl.SSLContext; import java.io.*; import java.net.URI; -import java.security.*; +import java.security.GeneralSecurityException; +import java.security.KeyStore; import java.util.Map; /** @@ -108,7 +115,7 @@ public class HttpRequestTemplate { //http代理地址设置 httpProxy = new HttpHost(configStorage.getHttpProxyHost(), configStorage.getHttpProxyPort()); - if (StringUtils.isNotBlank(configStorage.getHttpProxyHost())) { + if (StringUtils.isBlank(configStorage.getHttpProxyUsername())) { return null; } @@ -164,6 +171,9 @@ public class HttpRequestTemplate { public T postForObject(String uri, Object request, Class responseType, Map uriVariables) { return doExecute(URI.create(UriVariables.getUri(uri, uriVariables)), request, responseType, MethodType.POST); } + public T postForObjectAndBasicAuth(String uri, Object request, Class responseType, Object... uriVariables) { + return doExecuteAndBasicAuth(URI.create(UriVariables.getUri(uri, uriVariables)), request, responseType, MethodType.POST); + } public T postForObject(URI uri, Object request, Class responseType){ return doExecute(uri, request, responseType, MethodType.POST); @@ -233,6 +243,28 @@ public class HttpRequestTemplate { return null; } + /** + * http 请求执行 + * @param uri 地址 + * @param request 请求数据 + * @param responseType 响应类型 + * @param method 请求方法 + * @param 响应类型 + * @return 类型对象 + */ + public T doExecuteAndBasicAuth(URI uri, Object request, Class responseType, MethodType method){ + ClientHttpRequest httpRequest = new ClientHttpRequest(uri ,method, request); + httpRequest.setProxy(httpProxy).setResponseType(responseType); + try (CloseableHttpResponse response = httpClient.execute(httpRequest,createBasicAuthContext(uri,"Huodull6190","12BkDT8152Zj"))) { + return httpRequest.handleResponse(response); + }catch ( IOException e){ + e.printStackTrace(); + }finally { + httpRequest.releaseConnection(); + } + return null; + } + /** * http 请求执行 * @param uri 地址 @@ -246,6 +278,28 @@ public class HttpRequestTemplate { return doExecute(URI.create(uri), request, responseType, method); } + /** + * 创建Basic Auth + * @param uri + * @param username + * @param password + * @return + */ + private HttpClientContext createBasicAuthContext(URI uri,String username, String password) { + CredentialsProvider credsProvider = new BasicCredentialsProvider(); + Credentials defaultCreds = new UsernamePasswordCredentials(username, password); + credsProvider.setCredentials(new AuthScope(uri.getHost(), uri.getPort()), defaultCreds); + + AuthCache authCache = new BasicAuthCache(); + BasicScheme basicAuth = new BasicScheme(); + HttpHost host = new HttpHost(uri.getHost(),uri.getPort(),"https"); + authCache.put(host, basicAuth); + + HttpClientContext context = HttpClientContext.create(); + context.setCredentialsProvider(credsProvider); + context.setAuthCache(authCache); + return context; + } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java index 113eb76..0322c12 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java @@ -9,6 +9,9 @@ import com.egzosn.pay.common.bean.TransactionType; import com.egzosn.pay.fuiou.api.FuiouPayConfigStorage; import com.egzosn.pay.fuiou.api.FuiouPayService; import com.egzosn.pay.fuiou.bean.FuiouTransactionType; +import com.egzosn.pay.payoneer.api.PayoneerConfigStorage; +import com.egzosn.pay.payoneer.api.PayoneerPayService; +import com.egzosn.pay.payoneer.bean.PayoneerTransactionType; import com.egzosn.pay.union.api.UnionPayConfigStorage; import com.egzosn.pay.union.api.UnionPayService; import com.egzosn.pay.union.bean.UnionTransactionType; @@ -170,6 +173,31 @@ public enum PayType implements BasePayType { } + },payoneer{ + @Override + public PayService getPayService(ApyAccount apyAccount) { + PayoneerConfigStorage payoneerConfigStorage = new PayoneerConfigStorage(); + payoneerConfigStorage.setProgramId(apyAccount.getPartner()); + payoneerConfigStorage.setApiUserName(apyAccount.getSeller()); + payoneerConfigStorage.setApiPassword(apyAccount.getStorePassword()); + payoneerConfigStorage.setKeyPublic(apyAccount.getPublicKey()); + payoneerConfigStorage.setKeyPrivate(apyAccount.getPrivateKey()); + payoneerConfigStorage.setNotifyUrl(apyAccount.getNotifyUrl()); + payoneerConfigStorage.setReturnUrl(apyAccount.getReturnUrl()); + payoneerConfigStorage.setSignType(apyAccount.getSignType()); + payoneerConfigStorage.setPayType(apyAccount.getPayType().toString()); + payoneerConfigStorage.setMsgType(apyAccount.getMsgType()); + payoneerConfigStorage.setInputCharset(apyAccount.getInputCharset()); + payoneerConfigStorage.setTest(apyAccount.isTest()); + return new PayoneerPayService(payoneerConfigStorage); + } + + @Override + public TransactionType getTransactionType(String transactionType) { + return PayoneerTransactionType.valueOf(transactionType); + } + + }; public abstract PayService getPayService(ApyAccount apyAccount); diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/PayResponse.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/PayResponse.java index cd8b406..9e71a50 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/PayResponse.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/PayResponse.java @@ -115,6 +115,11 @@ public class PayResponse { .payType(PayType.unionPay.name()) .handler(autowire(new UnionPayMessageHandler(payId))) .end() + .rule() + .msgType(MsgType.json.name()) + .payType(PayType.payoneer.name()) + .handler(autowire(new PayoneerMessageHandler(payId))) + .end() ; } diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/handler/PayoneerMessageHandler.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/handler/PayoneerMessageHandler.java new file mode 100644 index 0000000..3c235a1 --- /dev/null +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/handler/PayoneerMessageHandler.java @@ -0,0 +1,34 @@ +package com.egzosn.pay.demo.service.handler; + +import com.egzosn.pay.common.api.PayService; +import com.egzosn.pay.common.bean.PayMessage; +import com.egzosn.pay.common.bean.PayOutMessage; +import com.egzosn.pay.common.exception.PayErrorException; + +import java.util.Map; + +/** + * @descrption + * @author Actinia + * @email hayesfu@qq.com + * @date 2018-01-19 + */ +public class PayoneerMessageHandler extends BasePayMessageHandler { + + + public PayoneerMessageHandler(Integer payId) { + super(payId); + } + + @Override + public PayOutMessage handle(PayMessage payMessage, Map context, PayService payService) throws PayErrorException { + //交易状态 + if ("0".equals(payMessage.getPayMessage().get("code"))) { + /////这里进行成功的处理 + + return payService.successPayOutMessage(payMessage); + } + + return payService.getPayOutMessage("fail", "失败"); + } +} diff --git a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/bean/FuiouCurType.java b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/bean/FuiouCurType.java deleted file mode 100644 index 264c1ed..0000000 --- a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/bean/FuiouCurType.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.egzosn.pay.fuiou.bean; - -import com.egzosn.pay.common.bean.CurType; - -/** - * 货币类型 - * @author Actinia - * @email hayesfu@qq.com - *
- * create 2017 2017/1/16 0016
- * 
- */ -public enum FuiouCurType implements CurType { - - CNY("人民币"), - USD("美元"), - HKD("港币"), - MOP("澳门元"), - EUR("欧元"), - TWD("新台币"), - KRW("韩元"), - JPY("日元"), - SGD("新加坡元"), - AUD("澳大利亚元"); - /** - * 币种名称 - */ - private String name; - //索引 - private int index; - - /** - * 构造函数 - * @param name - */ - FuiouCurType(String name) { - this.name = name; - } - - /** - * 获取币种名称 - * @return 币种名称 - */ - @Override - public String getCurType(){ - return this.name(); - } - -} diff --git a/pay-java-payoneer/README.md b/pay-java-payoneer/README.md new file mode 100644 index 0000000..23105d1 --- /dev/null +++ b/pay-java-payoneer/README.md @@ -0,0 +1,8 @@ + + +## payoneer简单例子 + +#### 支付配置 + + + diff --git a/pay-java-payoneer/pom.xml b/pay-java-payoneer/pom.xml new file mode 100644 index 0000000..cfc11ca --- /dev/null +++ b/pay-java-payoneer/pom.xml @@ -0,0 +1,26 @@ + + + + pay-java-parent + com.egzosn + 2.0.6-SNAPSHOT + + 4.0.0 + pay-java-payoneer + + + + + + + + com.egzosn + pay-java-common + + + + + + \ No newline at end of file diff --git a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerConfigStorage.java b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerConfigStorage.java new file mode 100644 index 0000000..99b5d20 --- /dev/null +++ b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerConfigStorage.java @@ -0,0 +1,73 @@ +package com.egzosn.pay.payoneer.api; +import com.egzosn.pay.common.api.BasePayConfigStorage; + +/** + * @descrption + * @author Actinia + * @email hayesfu@qq.com + * @date 2018-01-19 + */ +public class PayoneerConfigStorage extends BasePayConfigStorage { + /** + * 商户Id + */ + public String programId; + /** + * Api用户名 + */ + public String apiUserName; + /** + * api密码 + */ + public String apiPassword; + + + + /** + * 应用id + * @return 空 + */ + @Override + public String getAppid() { + return null; + } + + + /** + * 合作商唯一标识 + * + */ + @Override + public String getPid () { + return programId; + } + + @Override + public String getSeller() { + return null; + } + + public String getProgramId() { + return programId; + } + + public void setProgramId(String programId) { + this.programId = programId; + } + + public String getApiUserName() { + return apiUserName; + } + + public void setApiUserName(String apiUserName) { + this.apiUserName = apiUserName; + } + + public String getApiPassword() { + return apiPassword; + } + + public void setApiPassword(String apiPassword) { + this.apiPassword = apiPassword; + } +} diff --git a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java new file mode 100644 index 0000000..0a5b86a --- /dev/null +++ b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/api/PayoneerPayService.java @@ -0,0 +1,416 @@ +package com.egzosn.pay.payoneer.api; + +import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.common.api.AdvancedPayService; +import com.egzosn.pay.common.api.BasePayService; +import com.egzosn.pay.common.api.Callback; +import com.egzosn.pay.common.api.PayConfigStorage; +import com.egzosn.pay.common.bean.*; +import com.egzosn.pay.common.bean.result.PayException; +import com.egzosn.pay.common.exception.PayErrorException; +import com.egzosn.pay.common.http.HttpConfigStorage; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + +import java.awt.image.BufferedImage; +import java.io.InputStream; +import java.math.BigDecimal; +import java.util.Date; +import java.util.Map; +import java.util.TreeMap; + +/** + * @descrption payoneer业务逻辑 + * @author Actinia + * @email hayesfu@qq.com + * @date 2018-01-19 + */ +public class PayoneerPayService extends BasePayService implements AdvancedPayService { + /** + * 日志 + */ + protected final Log log = LogFactory.getLog(PayoneerPayService.class); + /** + * 测试地址 + */ + public final static String SANDBOX_DOMAIN= "https://api.sandbox.payoneer.com/v2/programs/"; + + /** + * 正式地址 + */ + public final static String RELEASE_DOMAIN = "https://api.payoneer.com/v2/programs/"; + + /** + * 授权登录url + * https://api.sandbox.payoneer.com/v2/programs/{Program_Id}/payees/login-link + */ + public String URL_LOGIN_LINK = payConfigStorage.getPid()+"/payees/login-link"; + + /** + * 授权注册url + * https://api.sandbox.payoneer.com/v2/programs/{Program_Id}/payees/registration-link + */ + public String URL_REGISTRATION_LINK = payConfigStorage.getPid()+"/payees/registration-link"; + + /** + * 收款url + * https://api.sandbox.payoneer.com/v2/programs/{Program_Id}/charges + */ + public String URL_CHARGES_LINK = payConfigStorage.getPid()+"/charges"; + + /** + * 取消收款url + * https://api.sandbox.payoneer.com/v2/programs/{Program_Id}/charges/{client_reference_id}/cancel + */ + public String URL_CANCEL_CHARGES_LINK = payConfigStorage.getPid()+"/charges/%s/cancel"; + + /** + * 查看收款状态 + * https://api.sandbox.payoneer.com/v2/programs/{Program_Id}/charges/{client_reference_id}/status + */ + public String URL_STATUS_LINK = payConfigStorage.getPid()+"/charges/%s/status"; + + + public PayoneerPayService(PayConfigStorage payConfigStorage) { + super(payConfigStorage); + } + + public PayoneerPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { + super(payConfigStorage, configStorage); + } + + /** + * 获取授权页面 + * + * @param payeeId 收款id + * @param authPageType 授权类型 + * @return 返回请求结果 + */ + @Override + public String getAuthorizationPage(String payeeId, AuthPageType authPageType) { + Map params = new TreeMap<>(); + params.put("payee_id", payeeId); + JSONObject response = getHttpRequestTemplate().postForObject("login".equals(authPageType.name())?URL_LOGIN_LINK:URL_REGISTRATION_LINK,params,JSONObject.class); + if("0".equals(response.getString("code"))){ + return response.getString(authPageType.name()+"_link"); + } + + throw new PayErrorException(new PayException("failure", "Payoneer获取授权页面失败,原因:"+response.getString("hint"), response.toJSONString())); + } + + /** + * 回调校验 + * + * @param params 回调回来的参数集 + * @return 签名校验 true通过 + */ + @Override + public boolean verify(Map params) { + return false; + } + + /** + * 签名校验 + * + * @param params 参数集 + * @param sign 签名原文 + * @return 签名校验 true通过 + */ + @Override + public boolean signVerify(Map params, String sign) { + return false; + } + + /** + * 支付宝需要,微信是否也需要再次校验来源,进行订单查询 + * 校验数据来源 + * + * @param id 业务id, 数据的真实性. + * @return true通过 + */ + @Override + public boolean verifySource(String id) { + return false; + } + + /** + * 返回创建的订单信息 + * + * @param order 支付订单 + * @return 订单信息 + * @see PayOrder 支付订单信息 + */ + @Override + public Map orderInfo(PayOrder order) { + //todo 发起收款 + + + + return null; + } + + /** + * 创建签名 + * + * @param content 需要签名的内容 + * @param characterEncoding 字符编码 + * @return 签名 + */ + @Override + public String createSign(String content, String characterEncoding) { + return null; + } + + /** + * 创建签名 + * + * @param content 需要签名的内容 + * @param characterEncoding 字符编码 + * @return 签名 + */ + @Override + public String createSign(Map content, String characterEncoding) { + return null; + } + + /** + * 将请求参数或者请求流转化为 Map + * + * @param parameterMap 请求参数 + * @param is 请求流 + * @return 获得回调的请求参数 + */ + @Override + public Map getParameter2Map(Map parameterMap, InputStream is) { + return null; + } + + /** + * 获取输出消息,用户返回给支付端 + * + * @param code 状态 + * @param message 消息 + * @return 返回输出消息 + */ + @Override + public PayOutMessage getPayOutMessage(String code, String message) { + return null; + } + + /** + * 获取成功输出消息,用户返回给支付端 + * 主要用于拦截器中返回 + * + * @param payMessage 支付回调消息 + * @return 返回输出消息 + */ + @Override + public PayOutMessage successPayOutMessage(PayMessage payMessage) { + return null; + } + + /** + * 获取输出消息,用户返回给支付端, 针对于web端 + * + * @param orderInfo 发起支付的订单信息 + * @param method 请求方式 "post" "get", + * @return 获取输出消息,用户返回给支付端, 针对于web端 + * @see MethodType 请求类型 + */ + @Override + public String buildRequest(Map orderInfo, MethodType method) { + return null; + } + + /** + * 获取输出二维码,用户返回给支付端, + * + * @param order 发起支付的订单信息 + * @return 返回图片信息,支付时需要的 + */ + @Override + public BufferedImage genQrPay(PayOrder order) { + return null; + } + + /** + * 刷卡付,pos主动扫码付款(条码付) + * + * @param order 发起支付的订单信息 + * @return 返回支付结果 + */ + @Override + public Map microPay(PayOrder order) { + return null; + } + + /** + * 交易查询接口 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @return 返回查询回来的结果集,支付方原值返回 + */ + @Override + public Map query(String tradeNo, String outTradeNo) { + return null; + } + + /** + * 交易查询接口,带处理器 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @return 返回查询回来的结果集 + */ + @Override + public T query(String tradeNo, String outTradeNo, Callback callback) { + return null; + } + + /** + * 交易关闭接口 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @return 返回支付方交易关闭后的结果 + */ + @Override + public Map close(String tradeNo, String outTradeNo) { + return null; + } + + /** + * 交易关闭接口 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @return 返回支付方交易关闭后的结果 + */ + @Override + public T close(String tradeNo, String outTradeNo, Callback callback) { + return null; + } + + /** + * 申请退款接口 + * 废弃 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @return 返回支付方申请退款后的结果 + * @see #refund(RefundOrder) + */ + @Override + public Map refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { + return null; + } + + /** + * 申请退款接口 + * 废弃 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 + * @param callback 处理器 + * @return 返回支付方申请退款后的结果 + * @see #refund(RefundOrder, Callback) + */ + @Override + public T refund(String tradeNo, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount, Callback callback) { + return null; + } + + /** + * 申请退款接口 + * + * @param refundOrder 退款订单信息 + * @return 返回支付方申请退款后的结果 + */ + @Override + public Map refund(RefundOrder refundOrder) { + return null; + } + + /** + * 申请退款接口 + * + * @param refundOrder 退款订单信息 + * @param callback 处理器 + * @return 返回支付方申请退款后的结果 + */ + @Override + public T refund(RefundOrder refundOrder, Callback callback) { + return null; + } + + /** + * 查询退款 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @return 返回支付方查询退款后的结果 + */ + @Override + public Map refundquery(String tradeNo, String outTradeNo) { + return null; + } + + /** + * 查询退款 + * + * @param tradeNo 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @return 返回支付方查询退款后的结果 + */ + @Override + public T refundquery(String tradeNo, String outTradeNo, Callback callback) { + return null; + } + + /** + * 下载对账单 + * + * @param billDate 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 + * @param billType 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; + * @return 返回支付方下载对账单的结果 + */ + @Override + public Object downloadbill(Date billDate, String billType) { + return null; + } + + /** + * 下载对账单 + * + * @param billDate 账单时间:具体请查看对应支付平台 + * @param billType 账单类型,具体请查看对应支付平台 + * @param callback 处理器 + * @return 返回支付方下载对账单的结果 + */ + @Override + public T downloadbill(Date billDate, String billType, Callback callback) { + return null; + } + + /** + * 通用查询接口 + * + * @param tradeNoOrBillDate 支付平台订单号或者账单日期, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @param callback 处理器 + * @return 返回支付方对应接口的结果 + */ + @Override + public T secondaryInterface(Object tradeNoOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + return null; + } +} diff --git a/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/bean/PayoneerTransactionType.java b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/bean/PayoneerTransactionType.java new file mode 100644 index 0000000..ee356f7 --- /dev/null +++ b/pay-java-payoneer/src/main/java/com/egzosn/pay/payoneer/bean/PayoneerTransactionType.java @@ -0,0 +1,35 @@ +package com.egzosn.pay.payoneer.bean; + +import com.egzosn.pay.common.bean.TransactionType; + +/** + * 支付类型 + * @author Actinia + * @email hayesfu@qq.com + *
+ * create 2017 2017/1/16 0016
+ * 
+ */ +public enum PayoneerTransactionType implements TransactionType { + + charge("charge"); + private String method; + + PayoneerTransactionType(String method) { + this.method = method; + } + + @Override + public String getType() { + return this.name(); + } + + /** + * 获取接口名称 + * @return 接口名称 + */ + @Override + public String getMethod() { + return this.method; + } +} diff --git a/pay-java-payoneer/test/java/PayTest.java b/pay-java-payoneer/test/java/PayTest.java new file mode 100644 index 0000000..aab1516 --- /dev/null +++ b/pay-java-payoneer/test/java/PayTest.java @@ -0,0 +1,17 @@ +/** + * + * + * payoneer支付测试 + * @author Actinia + * @email hayesfu@qq.com + * @date 2018/1/18 0018 16:49 + */ +public class PayTest { + + public static void main(String[] args) { + + + } + + +} diff --git a/pay-java-union/README.md b/pay-java-union/README.md index f392343..0e29f92 100644 --- a/pay-java-union/README.md +++ b/pay-java-union/README.md @@ -1,120 +1,9 @@ -## 银联支付简单例子 +## Payoneer简单例子 #### 支付配置 -```java - UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage(); - unionPayConfigStorage.setMerId("商户id"); - unionPayConfigStorage.setKeyPublic("公钥,验签证书链格式: 中级证书路径;根证书路径"); - unionPayConfigStorage.setKeyPrivate("私钥, 私钥证书格式: 私钥证书路径;私钥证书对应的密码"); - unionPayConfigStorage.setNotifyUrl("异步回调地址"); - unionPayConfigStorage.setReturnUrl("同步回调地址"); - unionPayConfigStorage.setSignType("RSA2"); - unionPayConfigStorage.setInputCharset("UTF-8"); - //是否为测试账号,沙箱环境 - unionPayConfigStorage.setTest(true); - -``` - -#### 网络请求配置 - -```java - - HttpConfigStorage httpConfigStorage = new HttpConfigStorage(); - /* 网路代理配置 根据需求进行设置**/ - //http代理地址 - httpConfigStorage.setHttpProxyHost("192.168.1.69"); - //代理端口 - httpConfigStorage.setHttpProxyPort(3308); - //代理用户名 - httpConfigStorage.setHttpProxyUsername("user"); - //代理密码 - httpConfigStorage.setHttpProxyPassword("password"); - /* /网路代理配置 根据需求进行设置**/ - - /* 网络请求ssl证书 根据需求进行设置**/ - //设置ssl证书路径 - httpConfigStorage.setKeystorePath("证书绝对路径"); - //设置ssl证书对应的密码 - httpConfigStorage.setStorePassword("证书对应的密码"); - /* /网络请求ssl证书**/ - -``` - -#### 创建支付服务 - -```java - - UnionPayService service = new UnionPayService(unionPayConfigStorage); - - unionPayConfigStorage.setCertSign(true);//是否为证书签名 - -``` - -#### 创建支付订单信息 - -```java - PayOrder payOrder = new PayOrder("订单title", "摘要", new BigDecimal(0.01) , new SimpleDateFormat("yyyyMMddHHmmss").format(System.currentTimeMillis())); -``` -#### 网页支付 -```java -// 手机网页支付(WAP支付) - payOrder.setTransactionType(UnionTransactionType.WAP); -// 网关支付 -// payOrder.setTransactionType(UnionTransactionType.WEB); -// 企业网银支付(B2B支付) -// payOrder.setTransactionType(UnionTransactionType.B2B); - //获取支付所需的信息 - Map directOrderInfo = service.orderInfo(payOrder); - //获取表单提交对应的字符串,将其序列化到页面即可, - String directHtml = service.buildRequest(directOrderInfo, MethodType.POST); -``` - -#### 主扫申请二维码交易 - -```java - payOrder.setTransactionType(UnionTransactionType.APPLY_QR_CODE); - BufferedImage image = service.genQrPay(payOrder); -``` - -#### 消费(被扫场景)待定 - -```java - payOrder.setTransactionType(UnionTransactionType.CONSUME); - payOrder.setAuthCode("C2B码(条码号),1-20位数字"); - Map params = service.microPay(payOrder); -``` -#### 消费撤销 - -```java - Map params = service.unionRefundOrConsumeUndo("原交易查询流水号", "订单号", new BigDecimal("退款金额" ),UnionTransactionType.CONSUME_UNDO); - -``` -#### 交易状态查询交易:只有同步应答 - - ```java - payOrder.setTransactionType(UnionTransactionType.QUERY); - Map params = service.query(null,"商户单号"); - -``` - - -#### 退货交易:后台资金类交易,有同步应答和后台通知应答 - - ```java - payOrder.setTransactionType(UnionTransactionType.REFUND); - Map params = service.refund("原交易查询流水号", "订单号", null,new BigDecimal("退款金额" )); - -``` - - -#### 文件传输类接口:后台获取对账文件交易,只有同步应答 - - ```java - String fileConten = service.downloadbill("清算日期格式MMDD","文件类型,一般商户填写00即可"); -``` \ No newline at end of file diff --git a/pay-java-union/src/test/java/PayTest.java b/pay-java-union/src/test/java/PayTest.java index 5ae125e..731d621 100644 --- a/pay-java-union/src/test/java/PayTest.java +++ b/pay-java-union/src/test/java/PayTest.java @@ -1,5 +1,6 @@ import com.egzosn.pay.common.bean.MethodType; import com.egzosn.pay.common.bean.PayOrder; +import com.egzosn.pay.common.bean.RefundOrder; import com.egzosn.pay.union.api.UnionPayConfigStorage; import com.egzosn.pay.union.api.UnionPayService; import com.egzosn.pay.union.bean.UnionTransactionType;