From a2c83236cf5c04bcc17487e5c69937b927492683 Mon Sep 17 00:00:00 2001 From: egan Date: Thu, 5 Jul 2018 16:13:49 +0800 Subject: [PATCH] =?UTF-8?q?=E9=93=B6=E8=81=94=E6=94=AF=E4=BB=98=E6=95=99?= =?UTF-8?q?=E7=A8=8B=EF=BC=8C=E7=89=88=E6=9C=AC=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 4 +- pay-java-ali/pom.xml | 2 +- pay-java-common/pom.xml | 4 +- .../java/com/egzosn/pay/common/util/XML.java | 2 +- pay-java-demo/pom.xml | 2 +- .../demo/controller/UnionPayController.java | 225 ++++++++++++++++++ pay-java-fuiou/pom.xml | 2 +- pay-java-payoneer/pom.xml | 2 +- pay-java-paypal/pom.xml | 2 +- pay-java-union/README.md | 154 +++++++++++- pay-java-union/pom.xml | 2 +- pay-java-wx-youdian/pom.xml | 2 +- pay-java-wx/pom.xml | 2 +- pom.xml | 4 +- 14 files changed, 392 insertions(+), 17 deletions(-) create mode 100644 pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java diff --git a/README.md b/README.md index b030965..af47b49 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ com.egzosn pay-java-common - 2.0.9-RELEASE + 2.10.1-RELEASE ``` @@ -45,7 +45,7 @@ com.egzosn {module-name} - 2.0.9-RELEASE + 2.10.1-RELEASE ``` diff --git a/pay-java-ali/pom.xml b/pay-java-ali/pom.xml index 842a3a1..fd78ef1 100644 --- a/pay-java-ali/pom.xml +++ b/pay-java-ali/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 pay-java-ali diff --git a/pay-java-common/pom.xml b/pay-java-common/pom.xml index e6ad9c3..ef8383a 100644 --- a/pay-java-common/pom.xml +++ b/pay-java-common/pom.xml @@ -5,13 +5,13 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 jar com.egzosn pay-java-common - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 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 c4e118d..6b29f92 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 @@ -193,7 +193,7 @@ public class XML { m = new JSONObject(); } try { - DocumentBuilder documentBuilder = newDocumentBuilder();; + DocumentBuilder documentBuilder = newDocumentBuilder(); org.w3c.dom.Document doc = documentBuilder.parse(in); doc.getDocumentElement().normalize(); NodeList children = doc.getDocumentElement().getChildNodes(); diff --git a/pay-java-demo/pom.xml b/pay-java-demo/pom.xml index a9997c5..0c936b3 100644 --- a/pay-java-demo/pom.xml +++ b/pay-java-demo/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 war diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java new file mode 100644 index 0000000..2f9a93a --- /dev/null +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/UnionPayController.java @@ -0,0 +1,225 @@ + +package com.egzosn.pay.demo.controller; + + +import com.egzosn.pay.common.api.PayService; +import com.egzosn.pay.common.bean.*; +import com.egzosn.pay.common.util.sign.SignUtils; +import com.egzosn.pay.demo.request.QueryOrder; +import com.egzosn.pay.union.api.UnionPayConfigStorage; +import com.egzosn.pay.union.api.UnionPayService; +import com.egzosn.pay.union.bean.UnionTransactionType; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import javax.annotation.PostConstruct; +import javax.imageio.ImageIO; +import javax.servlet.http.HttpServletRequest; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.math.BigDecimal; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + +import static com.egzosn.pay.union.bean.UnionTransactionType.WEB; + +/** + * 银联相关 + * + * @author: egan + * @email egzosn@gmail.com + * @date 2016/11/18 0:25 + */ +@RestController +@RequestMapping("union") +public class UnionPayController { + + private PayService service = null; + + @PostConstruct + public void init() { + UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage(); + unionPayConfigStorage.setMerId("700000000000001"); + //设置CertSign必须在设置证书前 + unionPayConfigStorage.setCertSign(true); + //公钥,验签证书链格式: 中级证书路径;根证书路径 + unionPayConfigStorage.setKeyPublic("D:/certs/acp_test_middle.cer;D:/certs/acp_test_root.cer"); + //私钥, 私钥证书格式: 私钥证书路径;私钥证书对应的密码 + unionPayConfigStorage.setKeyPrivate("D:/certs/acp_test_sign.pfx;000000"); + unionPayConfigStorage.setNotifyUrl("http://www.pay.egzosn.com/payBack.json"); + // 无需同步回调可不填 app填这个就可以 + unionPayConfigStorage.setReturnUrl("http://www.pay.egzosn.com/payBack.json"); + unionPayConfigStorage.setSignType(SignUtils.RSA2.name()); + //单一支付可不填 + unionPayConfigStorage.setPayType("unionPay"); + unionPayConfigStorage.setInputCharset("UTF-8"); + //是否为测试账号,沙箱环境 + unionPayConfigStorage.setTest(true); + service = new UnionPayService(unionPayConfigStorage); + + + } + + + + /** + * 跳到支付页面 + * 针对实时支付,即时付款 + * + * @param price 金额 + * @return 跳到支付页面 + */ + @RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8") + public String toPay( BigDecimal price) { + //及时收款 + PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), WEB); + //WAP +// PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), UnionTransactionType.WAP); + //企业网银支付(B2B支付) +// PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), UnionTransactionType.B2B); + + Map orderInfo = service.orderInfo(order); + return service.buildRequest(orderInfo, MethodType.POST); + } + + + + + /** + * APP 获取支付预订单信息 + * + * @return 支付预订单信息 + */ + @RequestMapping("app") + public Map app() { + Map data = new HashMap<>(); + data.put("code", 0); + PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), SignUtils.randomStr()); + //App支付 + order.setTransactionType(UnionTransactionType.APP); + + //APPLE支付 苹果付 +// order.setTransactionType(UnionTransactionType.APPLE); + + data.put("orderInfo", service.orderInfo(order)); + return data; + } + + /** + * 获取二维码图像 APPLY_QR_CODE + * 二维码支付 + * @param price 金额 + * @return 二维码图像 + */ + @RequestMapping(value = "toQrPay.jpg", produces = "image/jpeg;charset=UTF-8") + public byte[] toWxQrPay( BigDecimal price) throws IOException { + //获取对应的支付账户操作工具(可根据账户id) + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + ImageIO.write(service.genQrPay( new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, System.currentTimeMillis()+"", UnionTransactionType.APPLY_QR_CODE)), "JPEG", baos); + return baos.toByteArray(); + } + + + /** + * 刷卡付,pos主动扫码付款(条码付) CONSUME + * @param authCode 授权码,条码等 + * @param price 金额 + * @return 支付结果 + */ + @RequestMapping(value = "microPay") + public Map microPay(BigDecimal price, String authCode) throws IOException { + //获取对应的支付账户操作工具(可根据账户id) + //条码付 + PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, SignUtils.randomStr(), UnionTransactionType.CONSUME); + //设置授权码,条码等 + order.setAuthCode(authCode); + //支付结果 + Map params = service.microPay(order); + //校验 + if (service.verify(params)) { + + //支付校验通过后的处理 + //......业务逻辑处理块........ + + + } + //这里开发者自行处理 + return params; + } + + /** + * 支付回调地址 + * + * @param request + * + * @return + */ + @RequestMapping(value = "payBack.json") + public String payBack(HttpServletRequest request) throws IOException { + + //获取支付方返回的对应参数 + Map params = service.getParameter2Map(request.getParameterMap(), request.getInputStream()); + if (null == params) { + return service.getPayOutMessage("fail", "失败").toMessage(); + } + + //校验 + if (service.verify(params)) { + //这里处理业务逻辑 + //......业务逻辑处理块........ + return service.getPayOutMessage("success", "成功").toMessage(); + } + + return service.getPayOutMessage("fail", "失败").toMessage(); + } + + + /** + * 查询 + * + * @param order 订单的请求体 + * @return 返回查询回来的结果集,支付方原值返回 + */ + @RequestMapping("query") + public Map query(QueryOrder order) { + return service.query(order.getTradeNo(), order.getOutTradeNo()); + } + + + /** + * 申请退款接口 + * + * @param order 订单的请求体 + * @return 返回支付方申请退款后的结果 + */ + @RequestMapping("refund") + public Map refund(RefundOrder order) { + return service.refund(order); + } + + /** + * 查询退款 + * + * @param order 订单的请求体 + * @return 返回支付方查询退款后的结果 + */ + @RequestMapping("refundquery") + public Map refundquery(QueryOrder order) { + return service.refundquery(order.getTradeNo(), order.getOutTradeNo()); + } + + /** + * 下载对账单 + * + * @param order 订单的请求体 + * @return 返回支付方下载对账单的结果 + */ + @RequestMapping("downloadbill") + public Object downloadbill(QueryOrder order) { + return service.downloadbill(order.getBillDate(), order.getBillType()); + } + + + +} diff --git a/pay-java-fuiou/pom.xml b/pay-java-fuiou/pom.xml index a5d9c0e..6548f3f 100644 --- a/pay-java-fuiou/pom.xml +++ b/pay-java-fuiou/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 pay-java-fuiou diff --git a/pay-java-payoneer/pom.xml b/pay-java-payoneer/pom.xml index a903773..6bd7bc8 100644 --- a/pay-java-payoneer/pom.xml +++ b/pay-java-payoneer/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 pay-java-payoneer diff --git a/pay-java-paypal/pom.xml b/pay-java-paypal/pom.xml index e133da2..f3f8320 100644 --- a/pay-java-paypal/pom.xml +++ b/pay-java-paypal/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 diff --git a/pay-java-union/README.md b/pay-java-union/README.md index 0e29f92..bbfb124 100644 --- a/pay-java-union/README.md +++ b/pay-java-union/README.md @@ -1,9 +1,159 @@ -## Payoneer简单例子 +## 银联简单例子 #### 支付配置 +```java + + UnionPayConfigStorage unionPayConfigStorage = new UnionPayConfigStorage(); + unionPayConfigStorage.setMerId("700000000000001"); + //设置CertSign必须在设置证书前 + unionPayConfigStorage.setCertSign(true); + //公钥,验签证书链格式: 中级证书路径;根证书路径 + unionPayConfigStorage.setKeyPublic("D:/certs/acp_test_middle.cer;D:/certs/acp_test_root.cer"); + //私钥, 私钥证书格式: 私钥证书路径;私钥证书对应的密码 + unionPayConfigStorage.setKeyPrivate("D:/certs/acp_test_sign.pfx;000000"); + unionPayConfigStorage.setNotifyUrl("http://www.pay.egzosn.com/payBack.json"); + // 无需同步回调可不填 app填这个就可以 + unionPayConfigStorage.setReturnUrl("http://www.pay.egzosn.com/payBack.json"); + unionPayConfigStorage.setSignType(SignUtils.RSA2.name()); + //单一支付可不填 + unionPayConfigStorage.setPayType("unionPay"); + unionPayConfigStorage.setInputCharset("UTF-8"); + //是否为测试账号,沙箱环境 + unionPayConfigStorage.setTest(true); + +``` - \ No newline at end of file +#### 创建支付服务 + + +```java + //支付服务 + PayService service = new UnionPayService(unionPayConfigStorage); + + //设置网络请求配置根据需求进行设置 + //service.setRequestTemplateConfigStorage(httpConfigStorage) + +``` + + +#### 创建支付订单信息 + +```java + + //支付订单基础信息 + PayOrder payOrder = new PayOrder("订单title", "摘要", new BigDecimal(0.01) , UUID.randomUUID().toString().replace("-", "")); + +``` + + +#### 扫码付 + +```java + + + /*-----------扫码付-------------------*/ + payOrder.setTransactionType(UnionTransactionType.APPLY_QR_CODE); + //获取扫码付的二维码 + BufferedImage image = service.genQrPay(payOrder); + /*-----------/扫码付-------------------*/ + +``` + + +#### APP支付, 苹果付 + +```java + + /*-----------APP-------------------*/ + //App支付 + order.setTransactionType(UnionTransactionType.APP); + + //APPLE支付 苹果付 +// order.setTransactionType(UnionTransactionType.APPLE); + + //获取APP支付所需的信息组,直接给app端就可使用 + Map appOrderInfo = service.orderInfo(payOrder); + /*-----------/APP-------------------*/ + +``` + + + +#### 即时到帐 WAP 网页支付 企业网银支付(B2B支付) + +```java + + /*-----------即时到帐 WAP 网页支付-------------------*/ +// payOrder.setTransactionType(UnionTransactionType.WAP); //WAP支付 + +// payOrder.setTransactionType(UnionTransactionType.B2B); //企业网银支付(B2B支付) + + payOrder.setTransactionType(UnionTransactionType.WEB); // PC网页支付 + //获取支付所需的信息 + Map directOrderInfo = service.orderInfo(payOrder); + + //获取表单提交对应的字符串,将其序列化到页面即可, + String directHtml = service.buildRequest(directOrderInfo, MethodType.POST); + /*-----------/即时到帐 WAP 网页支付-------------------*/ + +``` + + +#### 条码付 声波付 + +```java + + /*-----------条码付 -------------------*/ + + payOrder.setTransactionType(UnionTransactionType.CONSUME);//条码付 + + payOrder.setAuthCode("条码信息或者声波信息"); + // 支付结果 + Map params = service.microPay(payOrder); + /*-----------/条码付 声波付-------------------*/ + +``` + + + +#### 回调处理 + +```java + + /*-----------回调处理-------------------*/ + //HttpServletRequest request; + Map params = service.getParameter2Map(request.getParameterMap(), request.getInputStream()); + if (service.verify(params)){ + System.out.println("支付成功"); + return; + } + System.out.println("支付失败"); + + + /*-----------回调处理-------------------*/ + +``` + + + +#### 支付订单查询 + +```java + + Map result = service..query(null, "我方系统单号"); + +``` + + +#### 申请退款接口 + ```java + + RefundOrder order = new RefundOrder(null, "原交易查询流水号", "退款金额", "订单总金额"); + order.setRefundNo("退款单号") + Map result = service.refund(order); + +``` diff --git a/pay-java-union/pom.xml b/pay-java-union/pom.xml index 6b44d64..5877c9f 100644 --- a/pay-java-union/pom.xml +++ b/pay-java-union/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 diff --git a/pay-java-wx-youdian/pom.xml b/pay-java-wx-youdian/pom.xml index f94fa8d..ceafe4e 100644 --- a/pay-java-wx-youdian/pom.xml +++ b/pay-java-wx-youdian/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 pay-java-wx-youdian diff --git a/pay-java-wx/pom.xml b/pay-java-wx/pom.xml index 7cc6cde..6dbe136 100644 --- a/pay-java-wx/pom.xml +++ b/pay-java-wx/pom.xml @@ -5,7 +5,7 @@ pay-java-parent com.egzosn - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.0.0 pay-java-wx diff --git a/pom.xml b/pom.xml index 6e87beb..1c0b6b0 100644 --- a/pom.xml +++ b/pom.xml @@ -7,7 +7,7 @@ com.egzosn pay-java-parent pom - 2.0.9-RELEASE + 2.10.1-SNAPSHOT Pay Java - Parent Pay Java Parent @@ -51,7 +51,7 @@ - 2.0.9-RELEASE + 2.10.1-SNAPSHOT 4.5.4 1.2.17 1.2.41