From 3ff7198798786c9c7d9ffbf296c9d3af95964e44 Mon Sep 17 00:00:00 2001 From: "egzosn@gmail.com" <930928lI1> Date: Sat, 30 Sep 2017 09:26:49 +0800 Subject: [PATCH 1/5] =?UTF-8?q?=E7=89=88=E6=9C=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 84ef648..2fa0bf6 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ android 例子 [pay-java-android](http://git.oschina.net/egzosn/pay-java-android 这里感谢[ouyangxiangshao](https://github.com/ouyangxiangshao),[ZhuangXiong](https://github.com/ZhuangXiong) 与[Actinian](http://git.oschina.net/Actinia517) 所提交的安卓例子或者分支 +也感谢各大友友同学帮忙进行接口测试 + 非常欢迎和感谢对本项目发起Pull Request的同学,不过本项目基于git flow开发流程,因此在发起Pull Request的时候请选择develop分支。 E-Mail:egzosn@gmail.com From fdc1e4627f7fa9846fdebdbec6619b8cd41bcefb Mon Sep 17 00:00:00 2001 From: "egzosn@gmail.com" <930928lI1> Date: Wed, 11 Oct 2017 17:09:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?=E5=90=8C=E6=AD=A5=E5=9B=9E=E8=B0=83?= =?UTF-8?q?=E4=B9=B1=E7=A0=81=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/egzosn/pay/ali/api/AliPayService.java | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java index a09aed9..68c94bb 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayService.java @@ -17,6 +17,7 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import java.awt.image.BufferedImage; import java.io.InputStream; +import java.io.UnsupportedEncodingException; import java.math.BigDecimal; import java.text.DateFormat; import java.text.SimpleDateFormat; @@ -243,6 +244,17 @@ public class AliPayService extends BasePayService { for (int i = 0,len = values.length; i < len; i++) { valueStr += (i == len - 1) ? values[i] : values[i] + ","; } + //乱码解决,这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化 + //valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk"); + if (!valueStr.matches("\\w+")){ + try { + if(valueStr.equals(new String(valueStr.getBytes("iso8859-1"), "iso8859-1"))){ + valueStr=new String(valueStr.getBytes("iso8859-1"), payConfigStorage.getInputCharset()); + } + } catch (UnsupportedEncodingException e) { + e.printStackTrace(); + } + } params.put(name, valueStr); } From eb3a94efc86bb466e79fc9c3b180c44ddbba30e2 Mon Sep 17 00:00:00 2001 From: egzosn Date: Tue, 17 Oct 2017 10:47:32 +0800 Subject: [PATCH 3/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/ali/before/api/AliPayService.java | 20 ++++---- .../pay/common/api/PayMessageRouter.java | 34 +++++++++---- .../pay/common/http/ClientHttpRequest.java | 8 ++-- .../java/com/egzosn/pay/common/util/XML.java | 11 +++-- .../wx/youdian/api/WxYouDianPayService.java | 32 ++++++------- .../com/egzosn/pay/wx/api/WxPayService.java | 48 ++++++++++++------- 6 files changed, 89 insertions(+), 64 deletions(-) diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java index 263d014..bc64224 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/before/api/AliPayService.java @@ -33,11 +33,11 @@ import java.util.*; * @see com.egzosn.pay.ali.api.AliPayService */ public class AliPayService extends BasePayService { - protected final Log log = LogFactory.getLog(AliPayService.class); + protected final Log LOG = LogFactory.getLog(AliPayService.class); - private String httpsReqUrl = "https://mapi.alipay.com/gateway.do"; - private String queryReqUrl = "https://openapi.alipay.com/gateway.do"; + private String HTTPS_REQ_URL = "https://mapi.alipay.com/gateway.do"; + private String QUERY_REQ_URL = "https://openapi.alipay.com/gateway.do"; public AliPayService(PayConfigStorage payConfigStorage) { super(payConfigStorage); @@ -49,7 +49,7 @@ public class AliPayService extends BasePayService { public String getHttpsVerifyUrl() { - return httpsReqUrl + "?service=notify_verify"; + return HTTPS_REQ_URL + "?service=notify_verify"; } /** @@ -62,14 +62,14 @@ public class AliPayService extends BasePayService { public boolean verify(Map params) { if (params.get("sign") == null || params.get("notify_id") == null) { - log.debug("支付宝支付异常:params:" + params); + LOG.debug("支付宝支付异常:params:" + params); return false; } try { return signVerify(params, (String) params.get("sign")) && verifySource((String) params.get("notify_id")); } catch (PayErrorException e) { - e.printStackTrace(); + LOG.error(e); } return false; @@ -299,7 +299,7 @@ public class AliPayService extends BasePayService { StringBuffer formHtml = new StringBuffer(); formHtml.append("
rules = new ArrayList(); - + /** + * 支付服务 + */ private final PayService payService; - + /** + * 异步线程处理器 + */ private ExecutorService executorService; - + /** + * 支付异常处理器 + */ private PayErrorExceptionHandler exceptionHandler; + /** + * 根据支付服务创建路由 + * @param payService 支付服务 + */ public PayMessageRouter(PayService payService) { this.payService = payService; this.executorService = Executors.newFixedThreadPool(DEFAULT_THREAD_POOL_SIZE); @@ -138,7 +152,7 @@ public class PayMessageRouter { } else { res = rule.service(payMessage, payService, exceptionHandler); // 在同步操作结束,session访问结束 - log.debug("End session access: async=false, fromPay=" + payMessage.getFromPay()); + LOG.debug("End session access: async=false, fromPay=" + payMessage.getFromPay()); } } @@ -149,12 +163,12 @@ public class PayMessageRouter { for (Future future : futures) { try { future.get(); - log.debug("End session access: async=true, fromPay=" + payMessage.getFromPay()); + LOG.debug("End session access: async=true, fromPay=" + payMessage.getFromPay()); } catch (InterruptedException e) { - log.error("Error happened when wait task finish", e); + LOG.error("Error happened when wait task finish", e); } catch (ExecutionException e) { - log.error("Error happened when wait task finish", e); + LOG.error("Error happened when wait task finish", e); } } } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java index a0673b8..774a057 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java @@ -153,11 +153,11 @@ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase impleme entity.writeTo((OutputStream)t); return t; } catch (InstantiationException e) { - e.printStackTrace(); + throw new PayErrorException(new PayException("InstantiationException", e.getMessage())); } catch (IllegalAccessException e) { - e.printStackTrace(); + throw new PayErrorException(new PayException("IllegalAccessException", e.getMessage())); } - throw new HttpResponseException(statusLine.getStatusCode(), responseType + " 无法进行类型转换"); + } } String charset = "UTF-8"; @@ -174,7 +174,7 @@ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase impleme try { return JSON.parseObject(result, responseType); }catch (JSONException e){ - throw new PayErrorException(new PayException("failure", "类型转化异常,contentType:" + entity.getContentType().getValue(), result)); + throw new PayErrorException(new PayException("failure", String.format("类型转化异常,contentType: %s\n%s", entity.getContentType().getValue(), e.getMessage() ), result)); } } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java index c3a565a..56cf186 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/XML.java @@ -2,6 +2,8 @@ package com.egzosn.pay.common.util; import com.alibaba.fastjson.JSONObject; +import com.egzosn.pay.common.bean.result.PayException; +import com.egzosn.pay.common.exception.PayErrorException; import org.jdom2.Document; import org.jdom2.Element; import org.jdom2.JDOMException; @@ -38,9 +40,9 @@ public class XML { try (InputStream in = new ByteArrayInputStream(content.getBytes("UTF-8"))){ return (JSONObject) inputStream2Map(in, null); } catch (IOException e) { - e.printStackTrace(); + throw new PayErrorException(new PayException("IOException", e.getMessage())); } - return null; + } @@ -58,9 +60,8 @@ public class XML { try { return (JSONObject)inputStream2Map(in, null); } catch (IOException e) { - e.printStackTrace(); + throw new PayErrorException(new PayException("IOException", e.getMessage())); } - return null; } @@ -95,7 +96,7 @@ public class XML { m.put(k, v); } } catch (JDOMException e) { - e.printStackTrace(); + throw new PayErrorException(new PayException("JDOMException", e.getMessage())); } return m; } diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java index 39155db..ae27f28 100644 --- a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java +++ b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java @@ -32,15 +32,15 @@ import java.util.concurrent.locks.Lock; * date 2017/01/12 22:58 */ public class WxYouDianPayService extends BasePayService { - protected final Log log = LogFactory.getLog(WxYouDianPayService.class); + protected static final Log LOG = LogFactory.getLog(WxYouDianPayService.class); //登录获取授权码 - public final static String loginUrl = "http://life.51youdian.com/Api/CheckoutCounter/login"; + public final static String LOGIN_URL = "http://life.51youdian.com/Api/CheckoutCounter/login"; //刷新授权码 - public final static String resetLoginUrl = "http://life.51youdian.com/Api/CheckoutCounter/resetLogin"; + public final static String RESET_LOGIN_URL = "http://life.51youdian.com/Api/CheckoutCounter/resetLogin"; //查看付款订单状态 - public final static String unifiedorderStatusUrl = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorderStatus"; + public final static String UNIFIEDORDER_STATUS_URL = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorderStatus"; //预下单链接 - public final static String unifiedOrderUrl = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorder"; + public final static String UNIFIED_ORDER_URL = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorder"; /** @@ -51,9 +51,8 @@ public class WxYouDianPayService extends BasePayService { try { return getAccessToken(false); } catch (PayErrorException e) { - e.printStackTrace(); + throw e; } - return null; } /** @@ -80,7 +79,7 @@ public class WxYouDianPayService extends BasePayService { StringBuilder param = new StringBuilder().append("access_token=").append(payConfigStorage.getAccessToken()); String sign = createSign(param.toString() + apbNonce, payConfigStorage.getInputCharset()); param.append("&apb_nonce=").append(apbNonce).append("&sign=").append(sign); - JSONObject json = execute(resetLoginUrl + "?" + param.toString(), MethodType.GET, null ); + JSONObject json = execute(RESET_LOGIN_URL + "?" + param.toString(), MethodType.GET, null ); int errorcode = json.getIntValue("errorcode"); if (0 == errorcode){ payConfigStorage.updateAccessToken(payConfigStorage.getAccessToken(), 7200); @@ -112,7 +111,7 @@ public class WxYouDianPayService extends BasePayService { String sign = createSign(SignUtils.parameterText(data, "") + apbNonce, payConfigStorage.getInputCharset()); String queryParam = SignUtils.parameterText(data) + "&apb_nonce=" + apbNonce + "&sign=" + sign; - JSONObject json = execute(loginUrl + "?" + queryParam, MethodType.GET, null); + JSONObject json = execute(LOGIN_URL + "?" + queryParam, MethodType.GET, null); payConfigStorage.updateAccessToken(json.getString("access_token"), json.getLongValue("viptime")); return json; } @@ -124,7 +123,7 @@ public class WxYouDianPayService extends BasePayService { * @return 请求地址 */ public String getHttpsVerifyUrl() { - return unifiedorderStatusUrl; + return UNIFIEDORDER_STATUS_URL; } /** * 回调校验 @@ -135,15 +134,15 @@ public class WxYouDianPayService extends BasePayService { @Override public boolean verify(Map params) { if (!"SUCCESS".equals(params.get("return_code"))){ - log.debug(String.format("友店微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params)); + LOG.debug(String.format("友店微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params)); return false; } - if(params.get("sign") == null) {log.debug("友店微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no"));} + if(params.get("sign") == null) {LOG.debug("友店微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no"));} try { return signVerify(params, (String) params.get("sign")) && verifySource((String)params.get("out_trade_no")); } catch (PayErrorException e) { - e.printStackTrace(); + LOG.error(e.getMessage()); } return false; } @@ -217,7 +216,7 @@ public class WxYouDianPayService extends BasePayService { if ("401".equals(error.getErrorCode()) || "500".equals(error.getErrorCode())) { try { int sleepMillis = retrySleepMillis * (1 << retryTimes); - log.debug(String.format("友店微信系统繁忙,(%s)ms 后重试(第%s次)", sleepMillis, retryTimes + 1)); + LOG.debug(String.format("友店微信系统繁忙,(%s)ms 后重试(第%s次)", sleepMillis, retryTimes + 1)); Thread.sleep(sleepMillis); } catch (InterruptedException e1) { throw new PayErrorException(new YdPayError(-1, "友店支付服务端重试失败", e1.getMessage())); @@ -255,14 +254,13 @@ public class WxYouDianPayService extends BasePayService { data.put("PayMoney", data.remove("paymoney")); String params = SignUtils.parameterText(data) + "&apb_nonce=" + apbNonce + "&sign=" + sign; try { - JSONObject json = execute(unifiedOrderUrl+ "?" + params, MethodType.GET, null); + JSONObject json = execute(UNIFIED_ORDER_URL+ "?" + params, MethodType.GET, null); //友店比较特殊,需要在下完预订单后,自己存储 order_sn 对应 微信官方文档 out_trade_no order.setOutTradeNo(json.getString("order_sn")); return json; } catch (PayErrorException e) { - e.printStackTrace(); + throw e; } - return null; } diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java index 58a6c0e..853d4d1 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java @@ -10,6 +10,7 @@ import com.egzosn.pay.common.exception.PayErrorException; import com.egzosn.pay.common.http.HttpConfigStorage; import com.egzosn.pay.common.util.MatrixToImageWriter; import com.egzosn.pay.common.util.sign.SignUtils; +import com.egzosn.pay.common.util.str.StringUtils; import com.egzosn.pay.wx.bean.WxPayError; import com.egzosn.pay.wx.bean.WxTransactionType; import com.egzosn.pay.common.util.XML; @@ -32,21 +33,29 @@ import java.util.*; * */ public class WxPayService extends BasePayService { - protected final Log log = LogFactory.getLog(WxPayService.class); + protected final Log LOG = LogFactory.getLog(WxPayService.class); - - - public final static String uri = "https://api.mch.weixin.qq.com/"; + /** + * 微信请求地址 + */ + public final static String URI = "https://api.mch.weixin.qq.com/"; // public final static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // public final static String orderqueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery"; - + /** + * 创建支付服务 + * @param payConfigStorage 微信对应的支付配置 + */ public WxPayService(PayConfigStorage payConfigStorage) { super(payConfigStorage); } - + /** + * 创建支付服务 + * @param payConfigStorage 微信对应的支付配置 + * @param configStorage 微信对应的网络配置,包含代理配置、ssl证书配置 + */ public WxPayService(PayConfigStorage payConfigStorage, HttpConfigStorage configStorage) { super(payConfigStorage, configStorage); } @@ -58,7 +67,7 @@ public class WxPayService extends BasePayService { */ private String getUrl(TransactionType transactionType){ - return uri + transactionType.getMethod(); + return URI + transactionType.getMethod(); } /** @@ -70,19 +79,19 @@ public class WxPayService extends BasePayService { @Override public boolean verify(Map params) { if (!"SUCCESS".equals(params.get("return_code"))){ - log.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params)); + LOG.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params)); return false; } if(null == params.get("sign")) { - log.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no")); + LOG.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no")); return false; } try { return signVerify(params, (String) params.get("sign")) && verifySource((String)params.get("out_trade_no")); } catch (PayErrorException e) { - e.printStackTrace(); + LOG.error(e); } return false; } @@ -183,7 +192,7 @@ public class WxPayService extends BasePayService { parameters.put("sign", sign); String requestXML = XML.getMap2Xml(parameters); - log.debug("requestXML:" + requestXML); + LOG.debug("requestXML:" + requestXML); //调起支付的参数列表 JSONObject result = requestTemplate.postForObject(getUrl(order.getTransactionType()), requestXML, JSONObject.class); @@ -268,9 +277,9 @@ public class WxPayService extends BasePayService { try { return XML.inputStream2Map(is, map); } catch (IOException e) { - e.printStackTrace(); + throw new PayErrorException(new PayException("IOException", e.getMessage())); } - return map; + } /** @@ -544,7 +553,7 @@ public class WxPayService extends BasePayService { * @return 返回支付方对应接口的结果 */ @Override - public T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { + public T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { if (transactionType == WxTransactionType.REFUND){ throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType)); @@ -558,13 +567,13 @@ public class WxPayService extends BasePayService { throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass())); } - if (!(transactionIdOrBillDate instanceof String)){ + if (!(null == transactionIdOrBillDate || transactionIdOrBillDate instanceof String)){ throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass())); } //获取公共参数 - Map parameters = getPublicParameters(); - if (null == transactionIdOrBillDate || "".equals(transactionIdOrBillDate)){ + Map parameters = new HashMap<>();//getPublicParameters(); + if (StringUtils.isEmpty((String)transactionIdOrBillDate)){ parameters.put("out_trade_no", outTradeNoBillType); }else { parameters.put("transaction_id", transactionIdOrBillDate); @@ -574,6 +583,9 @@ public class WxPayService extends BasePayService { return callback.perform(requestTemplate.postForObject(getUrl(transactionType), XML.getMap2Xml(parameters) , JSONObject.class)); } - + public static void main(String[] args) { + WxPayService service = new WxPayService(null); + service.secondaryInterface(null, "aaa", WxTransactionType.MWEB, null); + } } From 5e594e1fa27eff5c05ba11d863d5d8bebe2fbbb0 Mon Sep 17 00:00:00 2001 From: egan Date: Sun, 22 Oct 2017 20:23:06 +0800 Subject: [PATCH 4/5] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=BE=AE=E4=BF=A1?= =?UTF-8?q?=E5=85=AC=E4=BC=97=E5=8F=B7=E6=94=AF=E4=BB=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/common/util/sign/SignUtils.java | 2 +- .../com/egzosn/pay/wx/api/WxPayService.java | 205 +++++++++--------- 2 files changed, 108 insertions(+), 99 deletions(-) diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java index b998c14..6e846b1 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java @@ -87,7 +87,7 @@ public enum SignUtils { * @return 去掉空值与签名参数后的新签名,拼接后字符串 */ public static String parameterText(Map parameters, String separator) { - return parameterText(parameters, separator, "sign", "key", "appId", "sign_type"); + return parameterText(parameters, separator, "sign", "key", "sign_type"); } /** diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java index 58a6c0e..8264e88 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayService.java @@ -15,6 +15,7 @@ import com.egzosn.pay.wx.bean.WxTransactionType; import com.egzosn.pay.common.util.XML; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import java.awt.image.BufferedImage; import java.io.IOException; import java.io.InputStream; @@ -24,25 +25,23 @@ import java.text.SimpleDateFormat; import java.util.*; /** - * 微信支付服务 - * @author egan - *
- * email egzosn@gmail.com
- * date 2016-5-18 14:09:01
- * 
+ * 微信支付服务 + * + * @author egan + *
+ *         email egzosn@gmail.com
+ *         date 2016-5-18 14:09:01
+ *         
*/ public class WxPayService extends BasePayService { protected final Log log = LogFactory.getLog(WxPayService.class); - - public final static String uri = "https://api.mch.weixin.qq.com/"; // public final static String unifiedOrderUrl = "https://api.mch.weixin.qq.com/pay/unifiedorder"; // public final static String orderqueryUrl = "https://api.mch.weixin.qq.com/pay/orderquery"; - public WxPayService(PayConfigStorage payConfigStorage) { super(payConfigStorage); } @@ -53,10 +52,11 @@ public class WxPayService extends BasePayService { /** * 根据交易类型获取url + * * @param transactionType 交易类型 * @return 请求url */ - private String getUrl(TransactionType transactionType){ + private String getUrl(TransactionType transactionType) { return uri + transactionType.getMethod(); } @@ -69,18 +69,18 @@ public class WxPayService extends BasePayService { */ @Override public boolean verify(Map params) { - if (!"SUCCESS".equals(params.get("return_code"))){ + if (!"SUCCESS".equals(params.get("return_code"))) { log.debug(String.format("微信支付异常:return_code=%s,参数集=%s", params.get("return_code"), params)); return false; } - if(null == params.get("sign")) { + if (null == params.get("sign")) { log.debug("微信支付异常:签名为空!out_trade_no=" + params.get("out_trade_no")); return false; } try { - return signVerify(params, (String) params.get("sign")) && verifySource((String)params.get("out_trade_no")); + return signVerify(params, (String) params.get("sign")) && verifySource((String) params.get("out_trade_no")); } catch (PayErrorException e) { e.printStackTrace(); } @@ -90,6 +90,7 @@ public class WxPayService extends BasePayService { /** * 微信是否也需要再次校验来源,进行订单查询 + * * @param id 商户单号 * @return true通过 */ @@ -101,19 +102,21 @@ public class WxPayService extends BasePayService { /** * 根据反馈回来的信息,生成签名结果 + * * @param params 通知返回来的参数数组 - * @param sign 比对的签名结果 + * @param sign 比对的签名结果 * @return 生成的签名结果 */ public boolean signVerify(Map params, String sign) { - return SignUtils.valueOf(payConfigStorage.getSignType()).verify(params, sign, "&key=" + payConfigStorage.getKeyPublic(), payConfigStorage.getInputCharset()); + return SignUtils.valueOf(payConfigStorage.getSignType()).verify(params, sign, "&key=" + payConfigStorage.getKeyPublic(), payConfigStorage.getInputCharset()); } /** * 获取公共参数 + * * @return 公共参数 */ - private Map getPublicParameters() { + private Map getPublicParameters() { Map parameters = new TreeMap(); parameters.put("appid", payConfigStorage.getAppid()); @@ -139,20 +142,20 @@ public class WxPayService extends BasePayService { parameters.put("body", order.getSubject());// 购买支付信息 parameters.put("out_trade_no", order.getOutTradeNo());// 订单号 parameters.put("spbill_create_ip", "192.168.1.150"); - parameters.put("total_fee", order.getPrice().multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue());// 总金额单位为分 + parameters.put("total_fee", order.getPrice().multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue());// 总金额单位为分 parameters.put("attach", order.getBody()); parameters.put("notify_url", payConfigStorage.getNotifyUrl()); parameters.put("trade_type", order.getTransactionType().getType()); - switch ((WxTransactionType)order.getTransactionType()){ + switch ((WxTransactionType) order.getTransactionType()) { //刷卡付 case MICROPAY: parameters.put("auth_code", order.getAuthCode()); parameters.remove("notify_url"); parameters.remove("trade_type"); break; - // 公众号支付 + // 公众号支付 case JSAPI: parameters.put("openid", order.getOpenid()); break; @@ -166,7 +169,7 @@ public class WxPayService extends BasePayService { //场景类型 " {\"type\": \"Wap\", " + //WAP网站URL地址 同步回调地址 - " \"wap_url\": \""+ payConfigStorage.getReturnUrl()+"\"," + + " \"wap_url\": \"" + payConfigStorage.getReturnUrl() + "\"," + //WAP 网站名 " \"wap_name\": \"支付充值\"}}"; @@ -175,10 +178,6 @@ public class WxPayService extends BasePayService { } - - - - String sign = createSign(SignUtils.parameterText(parameters), payConfigStorage.getInputCharset()); parameters.put("sign", sign); @@ -187,8 +186,8 @@ public class WxPayService extends BasePayService { //调起支付的参数列表 JSONObject result = requestTemplate.postForObject(getUrl(order.getTransactionType()), requestXML, JSONObject.class); - if (!"SUCCESS".equals(result.get("return_code"))){ - throw new PayErrorException(new WxPayError(result.getString("return_code"), result.getString("return_msg"), result.toJSONString())); + if (!"SUCCESS".equals(result.get("return_code"))) { + throw new PayErrorException(new WxPayError(result.getString("return_code"), result.getString("return_msg"), result.toJSONString())); } return result; } @@ -208,22 +207,26 @@ public class WxPayService extends BasePayService { JSONObject result = unifiedOrder(order); //如果是扫码支付或者刷卡付无需处理,直接返回 - if (WxTransactionType.NATIVE == order.getTransactionType() || WxTransactionType.MICROPAY == order.getTransactionType()|| WxTransactionType.MWEB == order.getTransactionType()) { + if (WxTransactionType.NATIVE == order.getTransactionType() || WxTransactionType.MICROPAY == order.getTransactionType() || WxTransactionType.MWEB == order.getTransactionType()) { return result; } SortedMap params = new TreeMap(); - params.put("appid", payConfigStorage.getAppid()); - params.put("partnerid", payConfigStorage.getPid()); - params.put("prepayid", result.get("prepay_id")); - params.put("timestamp", System.currentTimeMillis() / 1000); - params.put("noncestr", result.get("nonce_str")); - if (WxTransactionType.JSAPI == order.getTransactionType()){ - params.put("package", "prepay_id=" + result.get("prepay_id")); + + params.put("partnerid", payConfigStorage.getPid()); + params.put("package", "prepay_id=" + result.get("prepay_id")); + if (WxTransactionType.JSAPI == order.getTransactionType()) { params.put("signType", payConfigStorage.getSignType()); - }else if (WxTransactionType.APP == order.getTransactionType()){ - params.put("package", "Sign=WXPay"); + params.put("appId", payConfigStorage.getAppid()); + params.put("prepayid", result.get("prepay_id")); + params.put("timeStamp", System.currentTimeMillis() / 1000); + params.put("nonceStr", result.get("nonce_str")); + } else if (WxTransactionType.APP == order.getTransactionType()) { + params.put("appid", payConfigStorage.getAppid()); + params.put("prepayid", result.get("prepay_id")); + params.put("timestamp", System.currentTimeMillis() / 1000); + params.put("noncestr", result.get("nonce_str")); } String paySign = createSign(SignUtils.parameterText(params), payConfigStorage.getInputCharset()); params.put("sign", paySign); @@ -233,26 +236,28 @@ public class WxPayService extends BasePayService { } /** - * 生成并设置签名 + * 生成并设置签名 + * * @param parameters 请求参数 * @return 请求参数 */ - private Map setSign(Map parameters){ + private Map setSign(Map parameters) { parameters.put("sign_type", payConfigStorage.getSignType()); - String sign = createSign( SignUtils.parameterText(parameters, "&", "sign", "appId"), payConfigStorage.getInputCharset()); + String sign = createSign(SignUtils.parameterText(parameters, "&", "sign", "appId"), payConfigStorage.getInputCharset()); parameters.put("sign", sign); return parameters; } /** * 签名 - * @param content 需要签名的内容 不包含key + * + * @param content 需要签名的内容 不包含key * @param characterEncoding 字符编码 * @return 签名结果 */ @Override public String createSign(String content, String characterEncoding) { - return SignUtils.valueOf(payConfigStorage.getSignType().toUpperCase()).createSign(content, "&key=" + payConfigStorage.getKeyPrivate(), characterEncoding).toUpperCase(); + return SignUtils.valueOf(payConfigStorage.getSignType().toUpperCase()).createSign(content, "&key=" + payConfigStorage.getKeyPrivate(), characterEncoding).toUpperCase(); } /** @@ -266,7 +271,7 @@ public class WxPayService extends BasePayService { public Map getParameter2Map(Map parameterMap, InputStream is) { TreeMap map = new TreeMap(); try { - return XML.inputStream2Map(is, map); + return XML.inputStream2Map(is, map); } catch (IOException e) { e.printStackTrace(); } @@ -276,7 +281,7 @@ public class WxPayService extends BasePayService { /** * 获取输出消息,用户返回给支付端 * - * @param code 状态 + * @param code 状态 * @param message 消息 * @return 返回输出消息 */ @@ -289,12 +294,13 @@ public class WxPayService extends BasePayService { /** * 获取成功输出消息,用户返回给支付端 * 主要用于拦截器中返回 + * * @param payMessage 支付回调消息 * @return 返回输出消息 */ @Override public PayOutMessage successPayOutMessage(PayMessage payMessage) { - return PayOutMessage.XML().code("Success").content("成功").build(); + return PayOutMessage.XML().code("Success").content("成功").build(); } @@ -308,11 +314,11 @@ public class WxPayService extends BasePayService { */ @Override public String buildRequest(Map orderInfo, MethodType method) { - if (!"SUCCESS".equals(orderInfo.get("return_code")) ){ + if (!"SUCCESS".equals(orderInfo.get("return_code"))) { throw new PayErrorException(new WxPayError((String) orderInfo.get("return_code"), (String) orderInfo.get("return_msg"))); } - if (WxTransactionType.MWEB.equals(orderInfo.get("trade_type"))){ - return ""; + if (WxTransactionType.MWEB.equals(orderInfo.get("trade_type"))) { + return ""; } throw new UnsupportedOperationException(); @@ -320,6 +326,7 @@ public class WxPayService extends BasePayService { /** * 获取输出二维码,用户返回给支付端, + * * @param order 发起支付的订单信息 * @return 返回图片信息,支付时需要的 */ @@ -332,11 +339,12 @@ public class WxPayService extends BasePayService { } - return MatrixToImageWriter.writeInfoToJpgBuff((String) orderInfo.get("code_url")); + return MatrixToImageWriter.writeInfoToJpgBuff((String) orderInfo.get("code_url")); } /** * 刷卡付,pos主动扫码付款 + * * @param order 发起支付的订单信息 * @return 返回支付结果 */ @@ -350,14 +358,14 @@ public class WxPayService extends BasePayService { /** * 交易查询接口 * - * @param transactionId 微信支付平台订单号 - * @param outTradeNo 商户单号 + * @param transactionId 微信支付平台订单号 + * @param outTradeNo 商户单号 * @return 返回查询回来的结果集,支付方原值返回 */ @Override public Map query(String transactionId, String outTradeNo) { - return query(transactionId, outTradeNo, new Callback>() { + return query(transactionId, outTradeNo, new Callback>() { @Override public Map perform(Map map) { return map; @@ -366,11 +374,10 @@ public class WxPayService extends BasePayService { } /** - * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param transactionId 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 * @return 处理过后的类型对象,返回查询回来的结果集,支付方原值返回 */ @Override @@ -382,46 +389,48 @@ public class WxPayService extends BasePayService { /** * 交易关闭接口 * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 + * @param transactionId 支付平台订单号 + * @param outTradeNo 商户单号 * @return 返回支付方交易关闭后的结果 */ @Override public Map close(String transactionId, String outTradeNo) { - return close(transactionId, outTradeNo, new Callback>() { + return close(transactionId, outTradeNo, new Callback>() { @Override public Map perform(Map map) { return map; } }); } + /** * 交易关闭接口 * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 + * @param transactionId 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 * @return 处理过后的类型对象,返回支付方交易关闭后的结果 */ @Override public T close(String transactionId, String outTradeNo, Callback callback) { - return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback); + return secondaryInterface(transactionId, outTradeNo, WxTransactionType.CLOSE, callback); } /** * 退款 + * * @param transactionId 微信订单号 - * @param outTradeNo 商户单号 - * @param refundAmount 退款金额 - * @param totalAmount 总金额 + * @param outTradeNo 商户单号 + * @param refundAmount 退款金额 + * @param totalAmount 总金额 * @return 返回支付方申请退款后的结果 */ @Override public Map refund(String transactionId, String outTradeNo, BigDecimal refundAmount, BigDecimal totalAmount) { - return refund(transactionId, outTradeNo, refundAmount, totalAmount, new Callback>() { + return refund(transactionId, outTradeNo, refundAmount, totalAmount, new Callback>() { @Override public Map perform(Map map) { return map; @@ -437,7 +446,7 @@ public class WxPayService extends BasePayService { * @param refundAmount 退款金额 * @param totalAmount 总金额 * @param callback 处理器 - * @param 返回类型 + * @param 返回类型 * @return 处理过后的类型对象, 返回支付方申请退款后的结果 */ @Override @@ -452,8 +461,8 @@ public class WxPayService extends BasePayService { parameters.put("out_trade_no", outTradeNo); parameters.put("out_refund_no", outTradeNo); } - parameters.put("total_fee", totalAmount.multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue()); - parameters.put("refund_fee", refundAmount.multiply(new BigDecimal(100)).setScale( 0, BigDecimal.ROUND_HALF_UP).intValue()); + parameters.put("total_fee", totalAmount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); + parameters.put("refund_fee", refundAmount.multiply(new BigDecimal(100)).setScale(0, BigDecimal.ROUND_HALF_UP).intValue()); parameters.put("op_user_id", payConfigStorage.getPid()); //设置签名 @@ -464,13 +473,13 @@ public class WxPayService extends BasePayService { /** * 查询退款 * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 + * @param transactionId 支付平台订单号 + * @param outTradeNo 商户单号 * @return 返回支付方查询退款后的结果 */ @Override public Map refundquery(String transactionId, String outTradeNo) { - return refundquery(transactionId, outTradeNo, new Callback>() { + return refundquery(transactionId, outTradeNo, new Callback>() { @Override public Map perform(Map map) { return map; @@ -481,11 +490,11 @@ public class WxPayService extends BasePayService { /** * 查询退款 * - * @param transactionId 支付平台订单号 - * @param outTradeNo 商户单号 - * @param callback 处理器 - * @param 返回类型 - * @return 处理过后的类型对象,返回支付方查询退款后的结果 + * @param transactionId 支付平台订单号 + * @param outTradeNo 商户单号 + * @param callback 处理器 + * @param 返回类型 + * @return 处理过后的类型对象,返回支付方查询退款后的结果 */ @Override public T refundquery(String transactionId, String outTradeNo, Callback callback) { @@ -494,13 +503,14 @@ public class WxPayService extends BasePayService { /** * 目前只支持日账单 + * * @param billDate 账单类型,商户通过接口或商户经开放平台授权后其所属服务商通过接口可以获取以下账单类型:trade、signcustomer;trade指商户基于支付宝交易收单的业务账单;signcustomer是指基于商户支付宝余额收入及支出等资金变动的帐务账单; * @param billType 账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM。 * @return 返回支付方下载对账单的结果 */ @Override public Map downloadbill(Date billDate, String billType) { - return downloadbill(billDate, billType, new Callback>() { + return downloadbill(billDate, billType, new Callback>() { @Override public Map perform(Map map) { return map; @@ -509,11 +519,12 @@ public class WxPayService extends BasePayService { } /** - * 目前只支持日账单 + * 目前只支持日账单 + * * @param billDate 账单时间:具体请查看对应支付平台 * @param billType 账单类型,具体请查看对应支付平台 * @param callback 处理器 - * @param 返回类型 + * @param 返回类型 * @return 处理过后的类型对象,返回支付方下载对账单的结果 */ @Override @@ -531,49 +542,47 @@ public class WxPayService extends BasePayService { //设置签名 setSign(parameters); - return callback.perform(requestTemplate.postForObject(getUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), JSONObject.class)); + return callback.perform(requestTemplate.postForObject(getUrl(WxTransactionType.DOWNLOADBILL), XML.getMap2Xml(parameters), JSONObject.class)); } /** - * * @param transactionIdOrBillDate 支付平台订单号或者账单类型, 具体请 类型为{@link String }或者 {@link Date },类型须强制限制,类型不对应则抛出异常{@link PayErrorException} - * @param outTradeNoBillType 商户单号或者 账单类型 - * @param transactionType 交易类型 - * @param callback 处理器 - * @param 返回类型 + * @param outTradeNoBillType 商户单号或者 账单类型 + * @param transactionType 交易类型 + * @param callback 处理器 + * @param 返回类型 * @return 返回支付方对应接口的结果 */ @Override public T secondaryInterface(Object transactionIdOrBillDate, String outTradeNoBillType, TransactionType transactionType, Callback callback) { - if (transactionType == WxTransactionType.REFUND){ + if (transactionType == WxTransactionType.REFUND) { throw new PayErrorException(new PayException("failure", "通用接口不支持:" + transactionType)); } - - - if (transactionType == WxTransactionType.DOWNLOADBILL){ - if (transactionIdOrBillDate instanceof Date){ + + + if (transactionType == WxTransactionType.DOWNLOADBILL) { + if (transactionIdOrBillDate instanceof Date) { return downloadbill((Date) transactionIdOrBillDate, outTradeNoBillType, callback); } throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass())); } - if (!(transactionIdOrBillDate instanceof String)){ + if (!(transactionIdOrBillDate instanceof String)) { throw new PayErrorException(new PayException("failure", "非法类型异常:" + transactionIdOrBillDate.getClass())); } //获取公共参数 Map parameters = getPublicParameters(); - if (null == transactionIdOrBillDate || "".equals(transactionIdOrBillDate)){ + if (null == transactionIdOrBillDate || "".equals(transactionIdOrBillDate)) { parameters.put("out_trade_no", outTradeNoBillType); - }else { + } else { parameters.put("transaction_id", transactionIdOrBillDate); } //设置签名 setSign(parameters); - return callback.perform(requestTemplate.postForObject(getUrl(transactionType), XML.getMap2Xml(parameters) , JSONObject.class)); + return callback.perform(requestTemplate.postForObject(getUrl(transactionType), XML.getMap2Xml(parameters), JSONObject.class)); } - } From 1401334d9ea83d35fa3f5b0fd2c0f115f045af98 Mon Sep 17 00:00:00 2001 From: egzosn Date: Thu, 26 Oct 2017 18:44:29 +0800 Subject: [PATCH 5/5] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=B3=A8=E9=87=8A?= =?UTF-8?q?=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 18 +++--- pay-java-ali/README.md | 28 ++++----- .../pay/ali/api/AliPayConfigStorage.java | 41 +++++-------- .../pay/common/api/BasePayConfigStorage.java | 48 +++++++++++---- .../pay/common/api/PayConfigStorage.java | 11 +--- .../pay/common/api/PayMessageRouter.java | 2 + .../egzosn/pay/common/bean/MethodType.java | 3 +- .../pay/common/http/ClientHttpRequest.java | 60 ++++++++++++++++--- .../pay/common/util/sign/SignUtils.java | 1 + pay-java-demo/README.md | 10 ++-- .../pay/demo/service/ApyAccountService.java | 4 +- .../egzosn/pay/demo/service/PayResponse.java | 12 ++-- pay-java-fuiou/README.md | 12 ++-- .../pay/fuiou/api/FuiouPayConfigStorage.java | 10 ---- pay-java-wx-youdian/README.md | 12 ++-- .../api/WxYouDianPayConfigStorage.java | 9 +-- .../wx/youdian/api/WxYouDianPayService.java | 32 ++++++---- .../youdian/bean/YoudianTransactionType.java | 8 ++- pay-java-wx/README.md | 28 ++++----- .../egzosn/pay/wx/api/WxPayConfigStorage.java | 26 +++++--- 20 files changed, 219 insertions(+), 156 deletions(-) diff --git a/README.md b/README.md index 2fa0bf6..8b4c667 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,13 @@ #pay-java-parent -##整合支付模块(微信支付,支付宝) +## 整合支付模块 声明: 本项目最初想法自 https://github.com/chanjarster/weixin-java-tools, 15年1月左右关注chanjarster/weixin-java-tools,并将其回调处理修改并进行使用。 开发版 https://git.oschina.net/egzosn/pay-java-parent/tree/develop -###特性 - - +### 特性 1. 不依赖任何 mvc 框架 2. 也不依赖 servlet,仅仅作为工具使用,可轻松嵌入到任何系统里(项目例子利用spring mvc的 @PathVariable进行,推荐使用类似的框架) @@ -17,14 +15,14 @@ 4. 控制层统一异常处理 5. LogBack日志记录 6. 简单快速完成支付模块的开发 - 7. 支持多种支付类型多支付账户扩展(目前已支持微信支付,支付宝支付,友店支付) + 7. 支持多种支付类型多支付账户扩展 -###本项目包含 3 个部分: +### 本项目包含 3 个部分: 1. pay-java-common 公共lib,支付核心与规范定义 2. pay-java-demo 具体的支付demo 3. pay-java-* 具体的支付实现库 -###Maven配置 +### Maven配置 支付核心模块 ```xml @@ -50,12 +48,12 @@ -###使用 +### 使用 这里不多说直接上代码 集群的话,友店可能会有bug。 测试链接 : http://pay.egzosn.com/index.html -######单一支付教程 +###### 单一支付教程 [支付宝](pay-java-ali?dir=1&filepath=pay-java-ali) [微信](pay-java-wx?dir=1&filepath=pay-java-wx) @@ -67,7 +65,7 @@ android 例子 [pay-java-android](http://git.oschina.net/egzosn/pay-java-android) -##交流 +## 交流 很希望更多志同道合友友一起扩展新的的支付接口。 这里感谢[ouyangxiangshao](https://github.com/ouyangxiangshao),[ZhuangXiong](https://github.com/ZhuangXiong) 与[Actinian](http://git.oschina.net/Actinia517) 所提交的安卓例子或者分支 diff --git a/pay-java-ali/README.md b/pay-java-ali/README.md index 7a13917..8cec50e 100644 --- a/pay-java-ali/README.md +++ b/pay-java-ali/README.md @@ -1,8 +1,8 @@ -##支付宝支付简单例子 +## 支付宝支付简单例子 -####支付配置 +#### 支付配置 ```java @@ -49,7 +49,7 @@ ``` -####创建支付服务 +#### 创建支付服务 ```java @@ -61,7 +61,7 @@ ``` -####创建支付订单信息 +#### 创建支付订单信息 ```java @@ -70,7 +70,7 @@ ``` -####扫码付 +#### 扫码付 ```java @@ -83,7 +83,7 @@ ``` -####APP支付 +#### APP支付 ```java @@ -95,7 +95,7 @@ ``` -####即时到帐 WAP 网页支付 +#### 即时到帐 WAP 网页支付 ```java @@ -111,7 +111,7 @@ ``` -####条码付 声波付 +#### 条码付 声波付 ```java @@ -127,7 +127,7 @@ ``` -####回调处理 +#### 回调处理 ```java @@ -146,7 +146,7 @@ ``` -####支付订单查询 +#### 支付订单查询 ```java @@ -155,7 +155,7 @@ ``` -####交易关闭接口 +#### 交易关闭接口 ```java Map result = service..query("支付宝单号", "我方系统单号"); @@ -163,7 +163,7 @@ ``` -####申请退款接口 +#### 申请退款接口 ```java Map result = service.refund("支付宝单号", "我方系统单号", "退款金额", "订单总金额"); @@ -171,14 +171,14 @@ ``` -####查询退款 +#### 查询退款 ```java Map result = service.refundquery("支付宝单号", "我方系统单号"); ``` -####下载对账单 +#### 下载对账单 ```java Map result = service.downloadbill("账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM", "账单类型"); diff --git a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java index 8598b24..54acd26 100644 --- a/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java +++ b/pay-java-ali/src/main/java/com/egzosn/pay/ali/api/AliPayConfigStorage.java @@ -4,23 +4,29 @@ import com.egzosn.pay.common.api.BasePayConfigStorage; /** * 支付配置存储 - * author egan + * @author egan * * email egzosn@gmail.com * date 2016-5-18 14:09:01 */ public class AliPayConfigStorage extends BasePayConfigStorage { - // 商户PID + /** + * 商户PID + */ public volatile String appId ; - // 商户签约拿到的pid,partner_id的简称,合作伙伴身份等同于 partner + /** + * 商户签约拿到的pid,partner_id的简称,合作伙伴身份等同于 partner + */ public volatile String pid ; - //partner_id的简称,合作伙伴身份 -// public volatile String partner ; - // 商户收款账号 + /** + * 商户收款账号 + */ public volatile String seller; - //公钥 + /** + * 公钥 + */ private volatile String aliPublicKey; @@ -44,26 +50,6 @@ public class AliPayConfigStorage extends BasePayConfigStorage { return appId; } - /** - * @see #getPid() - * @return 合作者id - */ - @Deprecated - @Override - public String getPartner() { - return pid; - } - - - /** - * 设置合作者id - * @see #setPid(String) - * @param partner 合作者id - */ - @Deprecated - public void setPartner(String partner) { - this.pid = partner; - } @Override public String getPid() { @@ -74,6 +60,7 @@ public class AliPayConfigStorage extends BasePayConfigStorage { this.pid = pid; } + @Override public String getSeller() { return seller; } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java index 71da64f..6384319 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/BasePayConfigStorage.java @@ -16,22 +16,35 @@ import java.util.concurrent.locks.ReentrantLock; public abstract class BasePayConfigStorage implements PayConfigStorage{ - // ali rsa_private 商户私钥,pkcs8格式 - //wx api_key 应用私钥(生成签名时使用) - private volatile String keyPrivate ; - // 支付平台公钥(签名校验使用) + /** + * 应用私钥,rsa_private pkcs8格式 生成签名时使用 + */ + private volatile String keyPrivate; + /** + * 支付平台公钥(签名校验使用) + */ private volatile String keyPublic; - //异步回调地址 + /** + * 异步回调地址 + */ private volatile String notifyUrl; - //同步回调地址 + /** + * 同步回调地址,支付完成后展示的页面 + */ private volatile String returnUrl;; - //签名加密类型 + /** + * 签名加密类型 + */ private volatile String signType; - //字符类型 + /** + * 字符类型 + */ private volatile String inputCharset; - //支付类型 aliPay 支付宝, wxPay微信..等等,开发者自定义,唯一 + /** + * 支付类型 aliPay 支付宝, wxPay微信..等等,扩展支付模块定义唯一。 + */ private volatile String payType; /** @@ -40,13 +53,21 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{ private volatile MsgType msgType; - // 访问令牌 每次请求其他方法都要传入的值 + /** + * 访问令牌 每次请求其他方法都要传入的值 + */ private volatile String accessToken; - // access token 到期时间时间戳 + /** + * access token 到期时间时间戳 + */ private volatile long expiresTime; - //授权码锁 + /** + * 授权码锁 + */ private Lock accessTokenLock = new ReentrantLock(); - + /** + * 是否为沙箱环境,默认为正式环境 + */ private boolean isTest = false; @@ -77,6 +98,7 @@ public abstract class BasePayConfigStorage implements PayConfigStorage{ this.notifyUrl = notifyUrl; } + @Override public String getReturnUrl() { return returnUrl; diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java index fdbedf4..f5321fc 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayConfigStorage.java @@ -14,21 +14,14 @@ import java.util.concurrent.locks.Lock; */ public interface PayConfigStorage { - /* + /** * 应用id * @return 应用id */ String getAppid(); + /** * 合作商唯一标识 - * @see #getPid() 代替者 - * @return 合作商唯一标识 - */ - @Deprecated - String getPartner(); - /** - * 合作商唯一标识 - * @see #getPartner() 代替者 * @return 合作商唯一标识 */ String getPid(); diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java index eceb744..01b1754 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/api/PayMessageRouter.java @@ -2,6 +2,7 @@ package com.egzosn.pay.common.api; import com.egzosn.pay.common.bean.PayMessage; import com.egzosn.pay.common.bean.PayOutMessage; + import com.egzosn.pay.common.util.LogExceptionHandler; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; @@ -144,6 +145,7 @@ public class PayMessageRouter { if(rule.isAsync()) { futures.add( executorService.submit(new Runnable() { + @Override public void run() { rule.service(payMessage, payService, exceptionHandler); } diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/MethodType.java b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/MethodType.java index 387bd63..36b02f5 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/bean/MethodType.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/bean/MethodType.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2017 the original huodull or egan. + * Copyright 2002-2017 the original egan. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ package com.egzosn.pay.common.bean; * email egzosn@gmail.com * date 2017/2/7 9:52 * + * 请求方式 */ public enum MethodType { GET, POST diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java index 774a057..9018abb 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/http/ClientHttpRequest.java @@ -32,9 +32,13 @@ import static com.egzosn.pay.common.http.UriVariables.getMapToParameters; * */ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase implements org.apache.http.client.ResponseHandler{ - //http请求 + /** + * http请求方式 get pos + */ private MethodType method; - //响应类型 + /** + * 响应类型 + */ private Class responseType; @@ -43,40 +47,80 @@ public class ClientHttpRequest extends HttpEntityEnclosingRequestBase impleme return this; } + /** + * 空构造 + */ public ClientHttpRequest() { } + /** + * 根据请求地址 请求方法,请求内容对象 + * @param uri 请求地址 + * @param method 请求方法 + * @param request 请求内容 + */ public ClientHttpRequest(URI uri, MethodType method, Object request) { - this.setURI(uri); - this.method = method; + this(uri, method); setParameters(request); } + /** + * 根据请求地址 请求方法 + * @param uri 请求地址 + * @param method 请求方法 + */ public ClientHttpRequest(URI uri, MethodType method) { this.setURI(uri); this.method = method; } + + /** + * 根据请求地址 + * @param uri 请求地址 + */ public ClientHttpRequest(URI uri) { this.setURI(uri); } - + /** + * 根据请求地址 + * @param uri 请求地址 + */ public ClientHttpRequest(String uri) { this.setURI(URI.create(uri)); } + /** + * 根据请求地址 请求方法 + * @param uri 请求地址 + * @param method 请求方法 + */ public ClientHttpRequest(String uri, MethodType method) { this.setURI(URI.create(uri)); this.method = method; } - + /** + * 根据请求地址 请求方法,请求内容对象 + * @param uri 请求地址 + * @param method 请求方法 + * @param request 请求内容 + */ public ClientHttpRequest(String uri, MethodType method, Object request) { - this.setURI(URI.create(uri)); - this.method = method; + this(uri, method); setParameters(request); } + /** + * 设置请求方式 + * + * @param method 请求方式 + * {@link com.egzosn.pay.common.bean.MethodType} 请求方式 + */ public void setMethod(MethodType method) { this.method = method; } + /** + * 获取请求方式 + * @return 请求方式 + */ @Override public String getMethod() { return method.name(); diff --git a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java index 6e846b1..6b4da14 100644 --- a/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java +++ b/pay-java-common/src/main/java/com/egzosn/pay/common/util/sign/SignUtils.java @@ -39,6 +39,7 @@ public enum SignUtils { * @param characterEncoding 编码格式 * @return 签名结果 */ + @Override public boolean verify(String text, String sign, String key, String characterEncoding) { return com.egzosn.pay.common.util.sign.encrypt.MD5.verify(text, sign, key, characterEncoding); } diff --git a/pay-java-demo/README.md b/pay-java-demo/README.md index 6b3cb84..fe23432 100644 --- a/pay-java-demo/README.md +++ b/pay-java-demo/README.md @@ -1,6 +1,6 @@ ### 快速入门 -#####1.支付整合配置 +##### 1.支付整合配置 ```java @@ -220,7 +220,7 @@ public class PayResponse { ``` -#####2.支付处理器与拦截器简单实现 +##### 2.支付处理器与拦截器简单实现 ```java /** @@ -271,7 +271,7 @@ public class PayResponse { ``` -#####3.支付响应PayResponse的获取 +##### 3.支付响应PayResponse的获取 ```java @@ -318,7 +318,7 @@ public class ApyAccountService { ``` -#####4.根据账户id与业务id,组拼订单信息(支付宝、微信支付订单)获取支付信息所需的数据 +##### 4.根据账户id与业务id,组拼订单信息(支付宝、微信支付订单)获取支付信息所需的数据 ```java @@ -466,7 +466,7 @@ public class ApyAccountService { ``` -#####5.支付回调 +##### 5.支付回调 ```java diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/ApyAccountService.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/ApyAccountService.java index 7c497c1..496d52c 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/ApyAccountService.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/service/ApyAccountService.java @@ -23,7 +23,9 @@ public class ApyAccountService { @Resource private AutowireCapableBeanFactory spring; - //缓存 + /** + * 缓存 + */ private final static Map payResponses = new HashMap(); /** 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 e556fa1..5a2f43e 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 @@ -92,10 +92,14 @@ public class PayResponse { router .rule() .async(false) - .msgType(MsgType.text.name()) //消息类型 - .payType(PayType.aliPay.name()) //支付账户事件类型 - .interceptor(new AliPayMessageInterceptor()) //拦截器 - .handler(autowire(new AliPayMessageHandler(payId))) //处理器 + //消息类型 + .msgType(MsgType.text.name()) + //支付账户事件类型 + .payType(PayType.aliPay.name()) + //拦截器 + .interceptor(new AliPayMessageInterceptor()) + //处理器 + .handler(autowire(new AliPayMessageHandler(payId))) .end() .rule() .async(false) diff --git a/pay-java-fuiou/README.md b/pay-java-fuiou/README.md index ccd1d66..f799eb4 100644 --- a/pay-java-fuiou/README.md +++ b/pay-java-fuiou/README.md @@ -1,8 +1,8 @@ -##富友支付简单例子 +## 富友支付简单例子 -####支付配置 +#### 支付配置 ```java @@ -22,7 +22,7 @@ ``` -####创建支付服务 +#### 创建支付服务 ```java @@ -31,7 +31,7 @@ ``` -####创建支付订单信息 +#### 创建支付订单信息 ```java @@ -41,7 +41,7 @@ ``` -####网页支付 +#### 网页支付 ```java @@ -57,7 +57,7 @@ ``` -####回调处理 +#### 回调处理 ```java diff --git a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayConfigStorage.java b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayConfigStorage.java index db69a38..8cb051f 100644 --- a/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayConfigStorage.java +++ b/pay-java-fuiou/src/main/java/com/egzosn/pay/fuiou/api/FuiouPayConfigStorage.java @@ -20,20 +20,10 @@ public class FuiouPayConfigStorage extends BasePayConfigStorage { return null; } - /** - * 合作商唯一标识 - * - * @see #getPid() 代替者 - */ - @Override - public String getPartner () { - return mchntCd; - } /** * 合作商唯一标识 * - * @see #getPartner() 代替者 */ @Override public String getPid () { diff --git a/pay-java-wx-youdian/README.md b/pay-java-wx-youdian/README.md index ebef4f8..4017d50 100644 --- a/pay-java-wx-youdian/README.md +++ b/pay-java-wx-youdian/README.md @@ -1,8 +1,8 @@ -##友店支付简单例子 +## 友店支付简单例子 -####支付配置 +#### 支付配置 ```java @@ -22,7 +22,7 @@ ``` -####创建支付服务 +#### 创建支付服务 ```java @@ -31,7 +31,7 @@ ``` -####创建支付订单信息 +#### 创建支付订单信息 ```java @@ -41,7 +41,7 @@ ``` -####扫码付 +#### 扫码付 ```java @@ -54,7 +54,7 @@ ``` -####回调处理 +#### 回调处理 ```java diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayConfigStorage.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayConfigStorage.java index e42d1cb..8523223 100644 --- a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayConfigStorage.java +++ b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayConfigStorage.java @@ -12,7 +12,9 @@ import com.egzosn.pay.common.api.BasePayConfigStorage; public class WxYouDianPayConfigStorage extends BasePayConfigStorage { - //账号 + /** + * 账号 + */ public volatile String seller; @@ -26,11 +28,6 @@ public class WxYouDianPayConfigStorage extends BasePayConfigStorage { } - @Override - public String getPartner() { - return null; - } - @Override public String getPid() { return null; diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java index ae27f28..c588d1c 100644 --- a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java +++ b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/api/WxYouDianPayService.java @@ -33,13 +33,21 @@ import java.util.concurrent.locks.Lock; */ public class WxYouDianPayService extends BasePayService { protected static final Log LOG = LogFactory.getLog(WxYouDianPayService.class); - //登录获取授权码 + /** + * 登录获取授权码 + */ public final static String LOGIN_URL = "http://life.51youdian.com/Api/CheckoutCounter/login"; - //刷新授权码 + /** + * 刷新授权码 + */ public final static String RESET_LOGIN_URL = "http://life.51youdian.com/Api/CheckoutCounter/resetLogin"; - //查看付款订单状态 + /** + * 查看付款订单状态 + */ public final static String UNIFIEDORDER_STATUS_URL = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorderStatus"; - //预下单链接 + /** + * 预下单链接 + */ public final static String UNIFIED_ORDER_URL = "http://life.51youdian.com/Api/CheckoutCounter/unifiedorder"; @@ -310,14 +318,16 @@ public class WxYouDianPayService extends BasePayService { /** * 具体需要返回的数据为 - *return_code 返回码只有SUCCESS和FAIL - *return_msg 返回具体信息 - *nonce_str 您的服务器新生成随机生成32位字符串 - *sign 为签名,签名规则是您需要发送的所有数据(除了sign)按照字典升序排列后加上&key=xxxxxxxx您的密钥后md5加密,最后转成小写 - *最后把得到的所有需要返回的数据用json格式化成json对象格式如下 - *{"return_code":"SUCCESS","return_msg":"ok","nonce_str":"dddddddddddddddddddd’,’sign’:’sdddddddddddddddddd"} - * @param code return_code + * return_code 返回码只有SUCCESS和FAIL + * return_msg 返回具体信息 + * nonce_str 您的服务器新生成随机生成32位字符串 + * sign 为签名,签名规则是您需要发送的所有数据(除了sign)按照字典升序排列后加上&key=xxxxxxxx您的密钥后md5加密,最后转成小写 + * 最后把得到的所有需要返回的数据用json格式化成json对象格式如下 + * {"return_code":"SUCCESS","return_msg":"ok","nonce_str":"dddddddddddddddddddd’,’sign’:’sdddddddddddddddddd"} + * + * @param code return_code * @param message return_msg + * * @return 返回输出消息 */ @Override diff --git a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/bean/YoudianTransactionType.java b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/bean/YoudianTransactionType.java index a25008d..31fa49a 100644 --- a/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/bean/YoudianTransactionType.java +++ b/pay-java-wx-youdian/src/main/java/com/egzosn/pay/wx/youdian/bean/YoudianTransactionType.java @@ -11,9 +11,13 @@ import com.egzosn.pay.common.bean.TransactionType; */ public enum YoudianTransactionType implements TransactionType { - //扫码付 + /** + * 扫码付 + */ NATIVE("unifiedorder"), - //刷卡付 + /** + * 刷卡付 + */ MICROPAY("micropay");//暂未接触 private String method; diff --git a/pay-java-wx/README.md b/pay-java-wx/README.md index 3d53f39..9dc3e90 100644 --- a/pay-java-wx/README.md +++ b/pay-java-wx/README.md @@ -1,8 +1,8 @@ -##微信支付简单例子 +## 微信支付简单例子 -####支付配置 +#### 支付配置 ```java @@ -45,7 +45,7 @@ ``` -####创建支付服务 +#### 创建支付服务 ```java @@ -57,7 +57,7 @@ ``` -####创建支付订单信息 +#### 创建支付订单信息 ```java @@ -66,7 +66,7 @@ ``` -####扫码付 +#### 扫码付 ```java @@ -80,7 +80,7 @@ ``` -####APP支付 +#### APP支付 ```java @@ -92,7 +92,7 @@ ``` -####网页支付 +#### 网页支付 ```java @@ -107,7 +107,7 @@ ``` -####条码付 刷卡付 +#### 条码付 刷卡付 ```java @@ -121,7 +121,7 @@ ``` -####回调处理 +#### 回调处理 ```java @@ -139,7 +139,7 @@ ``` -####支付订单查询 +#### 支付订单查询 ```java @@ -148,7 +148,7 @@ ``` -####交易关闭接口 +#### 交易关闭接口 ```java Map result = service..query("微信单号", "我方系统单号"); @@ -156,7 +156,7 @@ ``` -####申请退款接口 +#### 申请退款接口 ```java Map result = service.refund("微信单号", "我方系统单号", "退款金额", "订单总金额"); @@ -164,14 +164,14 @@ ``` -####查询退款 +#### 查询退款 ```java Map result = service.refundquery("微信单号", "我方系统单号"); ``` -####下载对账单 +#### 下载对账单 ```java Map result = service.downloadbill("账单时间:日账单格式为yyyy-MM-dd,月账单格式为yyyy-MM", "账单类型"); diff --git a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java index a4afd52..b8ba922 100644 --- a/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java +++ b/pay-java-wx/src/main/java/com/egzosn/pay/wx/api/WxPayConfigStorage.java @@ -15,8 +15,13 @@ public class WxPayConfigStorage extends BasePayConfigStorage { public String appSecret; + /** + * 应用id + */ public String appid ; - // 商户号 合作者id + /** + * 商户号 合作者id + */ public String mchId; @@ -35,17 +40,11 @@ public class WxPayConfigStorage extends BasePayConfigStorage { this.appid = appid; } - /** - * 合作商唯一标识 - * @see #getPid() 代替者 - */ - public String getPartner() { - return mchId; - } + + /** * 合作商唯一标识 - * @see #getPartner() 代替者 */ @Override public String getPid() { @@ -53,6 +52,15 @@ public class WxPayConfigStorage extends BasePayConfigStorage { } + /** + * 合作商唯一标识 + */ + public void setPid(String mchId) { + this.mchId = mchId; + } + + + @Override public String getSeller() { return null;