From 497699dece9ef697c0669f7482cbf78412efc81b Mon Sep 17 00:00:00 2001 From: egzosn Date: Fri, 26 Jan 2018 19:44:03 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=94=AF=E4=BB=98=E5=AE=9D?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E6=94=AF=E4=BB=98=E6=A1=88=E4=BE=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pay/demo/controller/AliPayController.java | 258 +++++++++++++++++ .../pay/demo/controller/PayController.java | 20 +- .../pay/demo/controller/WxPayController.java | 265 ++++++++++++++++++ pay-java-demo/src/main/webapp/index.html | 15 + 4 files changed, 541 insertions(+), 17 deletions(-) create mode 100644 pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java create mode 100644 pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java new file mode 100644 index 0000000..9d90257 --- /dev/null +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/AliPayController.java @@ -0,0 +1,258 @@ + +package com.egzosn.pay.demo.controller; + + +import com.egzosn.pay.ali.api.AliPayConfigStorage; +import com.egzosn.pay.ali.api.AliPayService; +import com.egzosn.pay.ali.bean.AliTransactionType; +import com.egzosn.pay.common.api.Callback; +import com.egzosn.pay.common.api.PayConfigStorage; +import com.egzosn.pay.common.api.PayService; +import com.egzosn.pay.common.bean.*; +import com.egzosn.pay.common.http.UriVariables; +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.demo.entity.ApyAccount; +import com.egzosn.pay.demo.entity.PayType; +import com.egzosn.pay.demo.request.QueryOrder; +import com.egzosn.pay.demo.service.ApyAccountService; +import com.egzosn.pay.demo.service.PayResponse; +import com.egzosn.pay.payoneer.api.PayoneerPayService; +import com.egzosn.pay.wx.bean.WxTransactionType; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.ModelAndView; + +import javax.annotation.PostConstruct; +import javax.annotation.Resource; +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.LinkedHashMap; +import java.util.Map; +import java.util.UUID; + +import static com.egzosn.pay.demo.dao.ApyAccountRepository.apyAccounts; + +/** + * 发起支付入口 + * + * @author: egan + * @email egzosn@gmail.com + * @date 2016/11/18 0:25 + */ +@RestController +@RequestMapping("ali") +public class AliPayController { + + private PayService service = null; + + @PostConstruct + public void init() { + AliPayConfigStorage aliPayConfigStorage = new AliPayConfigStorage(); + aliPayConfigStorage.setPid("2088102169916436"); + aliPayConfigStorage.setAppId("2016080400165436"); + aliPayConfigStorage.setKeyPublic("MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDIgHnOn7LLILlKETd6BFRJ0GqgS2Y3mn1wMQmyh9zEyWlz5p1zrahRahbXAfCfSqshSNfqOmAQzSHRVjCqjsAw1jyqrXaPdKBmr90DIpIxmIyKXv4GGAkPyJ/6FTFY99uhpiq0qadD/uSzQsefWo0aTvP/65zi3eof7TcZ32oWpwIDAQAB"); + aliPayConfigStorage.setKeyPrivate("MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKroe/8h5vC4L6T+B2WdXiVwGsMvUKgb2XsKix6VY3m2wcf6tyzpNRDCNykbIwGtaeo7FshN+qZxdXHLiIam9goYncBit/8ojfLGy2gLxO/PXfzGxYGs0KsDZ+ryVPPmE34ZZ8jiJpR0ygzCFl8pN3QJPJRGTJn5+FTT9EF/9zyZAgMBAAECgYAktngcYC35u7cQXDk+jMVyiVhWYU2ULxdSpPspgLGzrZyG1saOcTIi/XVX8Spd6+B6nmLQeF/FbU3rOeuD8U2clzul2Z2YMbJ0FYay9oVZFfp5gTEFpFRTVfzqUaZQBIjJe/xHL9kQVqc5xHlE/LVA27/Kx3dbC35Y7B4EVBDYAQJBAOhsX8ZreWLKPhXiXHTyLmNKhOHJc+0tFH7Ktise/0rNspojU7o9prOatKpNylp9v6kux7migcMRdVUWWiVe+4ECQQC8PqsuEz7B0yqirQchRg1DbHjh64bw9Kj82EN1/NzOUd53tP9tg+SO97EzsibK1F7tOcuwqsa7n2aY48mQ+y0ZAkBndA2xcRcnvOOjtAz5VO8G7R12rse181HjGfG6AeMadbKg30aeaGCyIxN1loiSfNR5xsPJwibGIBg81mUrqzqBAkB+K6rkaPXJR9XtzvdWb/N3235yPkDlw7Z4MiOVM3RzvR/VMDV7m8lXoeDde2zQyeMOMYy6ztwA6WgE1bhGOnQRAkEAouUBv1sVdSBlsexX15qphOmAevzYrpufKgJIRLFWQxroXMS7FTesj+f+FmGrpPCxIde1dqJ8lqYLTyJmbzMPYw=="); + aliPayConfigStorage.setNotifyUrl("http://pay.egzosn.com/payBack.json"); + aliPayConfigStorage.setReturnUrl("http://pay.egzosn.com/payBack.html"); + aliPayConfigStorage.setSignType(SignUtils.RSA.name()); + aliPayConfigStorage.setSeller("2088102169916436"); + aliPayConfigStorage.setInputCharset("utf-8"); + //是否为测试账号,沙箱环境 + aliPayConfigStorage.setTest(true); + + service = new AliPayService(aliPayConfigStorage); + + + } + + + + /** + * 跳到支付页面 + * 针对实时支付,即时付款 + * + * @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("-", ""), AliTransactionType.DIRECT); + //WAP +// PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.WAP); + + Map orderInfo = service.orderInfo(order); + return service.buildRequest(orderInfo, MethodType.POST); + } + + + + + /** + * 获取支付预订单信息 + * + * @return 支付预订单信息 + */ + @RequestMapping("app") + public Map app() { + Map data = new HashMap<>(); + data.put("code", 0); + PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), UUID.randomUUID().toString().replace("-", "")); + //App支付 + order.setTransactionType(AliTransactionType.APP); + data.put("orderInfo", UriVariables.getMapToParameters(service.orderInfo(order))); + return data; + } + + /** + * 获取二维码图像 + * 二维码支付 + * @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()+"", AliTransactionType.SWEEPPAY)), "JPEG", baos); + return baos.toByteArray(); + } + + + /** + * 刷卡付,pos主动扫码付款(条码付) + * @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, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.BAR_CODE); + //声波付 +// PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), AliTransactionType.WAVE_CODE); + //设置授权码,条码等 + 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("close") + public Map close(QueryOrder order) { + return service.close(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()); + } + + + /** + * 通用查询接口,根据 AliTransactionType 类型进行实现,此接口不包括退款 + * + * @param order 订单的请求体 + * @return 返回支付方对应接口的结果 + */ + @RequestMapping("secondaryInterface") + public Map secondaryInterface(QueryOrder order) { + TransactionType type = AliTransactionType.valueOf(order.getTransactionType()); + return service.secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback>() { + @Override + public Map perform(Map map) { + return map; + } + }); + } +} diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java index 7b58a6b..4d228b9 100644 --- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayController.java @@ -56,32 +56,18 @@ public class PayController { * 获取授权页面 * @param payId * @param payeeId - * @param authPageType * @return */ @RequestMapping("getAuthorizationPage.json") - public Map getAuthorizationPage(Integer payId,String payeeId,AuthPageType authPageType ){ + public Map getAuthorizationPage(Integer payId,String payeeId ){ PayResponse payResponse = service.getPayResponse(payId); PayoneerPayService payoneerPayService = (PayoneerPayService) payResponse.getService(); Map data = new LinkedHashMap<>(); data.put("code", 0); - data.put("url", payoneerPayService.getAuthorizationPage(payeeId,authPageType)); + data.put("url", payoneerPayService.getAuthorizationPage(payeeId)); return data; } - /** - * 发起收款申请 - * @param payId 账户id - * @param payeeId 授权id(收款id) - * @param payOrder 订单信息 - * @return 收款请求结果 - */ - @RequestMapping("charges") - public Map charges(Integer payId,String payeeId,PayOrder payOrder){ - PayResponse payResponse = service.getPayResponse(payId); - PayoneerPayService service = (PayoneerPayService) payResponse.getService(); - return service.charges(payeeId,payOrder); - } /** @@ -194,7 +180,7 @@ public class PayController { //获取对应的支付账户操作工具(可根据账户id) PayResponse payResponse = service.getPayResponse(payId); - PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType)); + PayOrder order = new PayOrder("huodull order", "huodull order", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), PayType.valueOf(payResponse.getStorage().getPayType()).getTransactionType(transactionType)); //设置授权码,条码等 order.setAuthCode(authCode); //支付结果 diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java new file mode 100644 index 0000000..709a30d --- /dev/null +++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/WxPayController.java @@ -0,0 +1,265 @@ + +package com.egzosn.pay.demo.controller; + + +import com.egzosn.pay.common.api.Callback; +import com.egzosn.pay.common.api.PayService; +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.common.bean.TransactionType; +import com.egzosn.pay.common.http.UriVariables; +import com.egzosn.pay.demo.entity.PayType; +import com.egzosn.pay.demo.request.QueryOrder; +import com.egzosn.pay.demo.service.PayResponse; +import com.egzosn.pay.wx.api.WxPayConfigStorage; +import com.egzosn.pay.wx.api.WxPayService; +import com.egzosn.pay.wx.bean.WxTransactionType; +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; + +/** + * 发起支付入口 + * + * @author: egan + * @email egzosn@gmail.com + * @date 2016/11/18 0:25 + */ +@RestController +@RequestMapping("wx") +public class WxPayController { + + private PayService service = null; + + @PostConstruct + public void init() { + WxPayConfigStorage wxPayConfigStorage = new WxPayConfigStorage(); + wxPayConfigStorage.setMchId("合作者id(商户号)"); + wxPayConfigStorage.setAppid("应用id"); + wxPayConfigStorage.setKeyPublic("密钥"); + wxPayConfigStorage.setKeyPrivate("密钥"); + wxPayConfigStorage.setNotifyUrl("异步回调地址"); + wxPayConfigStorage.setReturnUrl("同步回调地址"); + wxPayConfigStorage.setSignType("签名方式"); + wxPayConfigStorage.setInputCharset("utf-8"); + + + service = new WxPayService(wxPayConfigStorage); + + + } + + + + /** + * 跳到支付页面 + * 针对实时支付 + * + * @param price 金额 + * @return 跳到支付页面 + */ + @RequestMapping(value = "toPay.html", produces = "text/html;charset=UTF-8") + public String toPay( HttpServletRequest request, BigDecimal price) { + PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price , UUID.randomUUID().toString().replace("-", ""), WxTransactionType.MWEB); + order.setSpbillCreateIp(request.getHeader("X-Real-IP")); + StringBuffer requestURL = request.getRequestURL(); + //设置网页地址 + order.setWapUrl(requestURL.substring(0, requestURL.indexOf("/") > 0 ? requestURL.indexOf("/") : requestURL.length() )); + //设置网页名称 + order.setWapName("在线充值"); + + Map orderInfo = service.orderInfo(order); + return service.buildRequest(orderInfo, MethodType.POST); + } + + /** + * 公众号支付 + * + * + * @param openid openid + * @param price 金额 + * @return 返回jsapi所需参数 + */ + @RequestMapping(value = "jsapi" ) + public Map toPay(String openid, BigDecimal price) { + + PayOrder order = new PayOrder("订单title", "摘要", null == price ? new BigDecimal(0.01) : price, UUID.randomUUID().toString().replace("-", ""), WxTransactionType.JSAPI); + order.setOpenid(openid); + + Map orderInfo = service.orderInfo(order); + orderInfo.put("code", 0); + + return orderInfo; + } + + + + /** + * 获取支付预订单信息 + * + * @return 支付预订单信息 + */ + @RequestMapping("app") + public Map app() { + Map data = new HashMap<>(); + data.put("code", 0); + PayOrder order = new PayOrder("订单title", "摘要", new BigDecimal(0.01), UUID.randomUUID().toString().replace("-", "")); + //App支付 + order.setTransactionType(WxTransactionType.APP); + data.put("orderInfo", service.orderInfo(order)); + return data; + } + + /** + * 获取二维码图像 + * 二维码支付 + * @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()+"", WxTransactionType.NATIVE)), "JPEG", baos); + return baos.toByteArray(); + } + + + /** + * 刷卡付,pos主动扫码付款(条码付) + * @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, UUID.randomUUID().toString().replace("-", ""), WxTransactionType.MICROPAY); + //设置授权码,条码等 + 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("close") + public Map close(QueryOrder order) { + return service.close(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()); + } + + + /** + * 通用查询接口,根据 WxTransactionType 类型进行实现,此接口不包括退款 + * + * @param order 订单的请求体 + * @return 返回支付方对应接口的结果 + */ + @RequestMapping("secondaryInterface") + public Map secondaryInterface(QueryOrder order) { + TransactionType type = WxTransactionType.valueOf(order.getTransactionType()); + return service.secondaryInterface(order.getTradeNoOrBillDate(), order.getOutTradeNoBillType(), type, new Callback>() { + @Override + public Map perform(Map map) { + return map; + } + }); + } +} diff --git a/pay-java-demo/src/main/webapp/index.html b/pay-java-demo/src/main/webapp/index.html index 4d092c4..edad9e2 100644 --- a/pay-java-demo/src/main/webapp/index.html +++ b/pay-java-demo/src/main/webapp/index.html @@ -116,6 +116,21 @@ getOrderInfo" target="_blank"> +
+主动收款(pos条码声波付等) +
+ 账户id +
+ 金额 +
+ 交易类型 +
+ 条码授权信息 +
+ +
+
+
二维码