diff --git a/pay-java-demo/pom.xml b/pay-java-demo/pom.xml
index d065c0a..ddfcf01 100644
--- a/pay-java-demo/pom.xml
+++ b/pay-java-demo/pom.xml
@@ -47,6 +47,11 @@
pay-java-fuiou
${pay.version}
+
+ com.egzosn
+ pay-java-paypal
+ ${pay.version}
+
@@ -89,6 +94,11 @@
pay-java-union
${pay.version}
+
+ com.egzosn
+ pay-java-paypal
+ 2.0.8-SNAPSHOT
+
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java
new file mode 100644
index 0000000..70174f9
--- /dev/null
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/controller/PayPalPayController.java
@@ -0,0 +1,105 @@
+package com.egzosn.pay.demo.controller;
+
+
+import com.egzosn.pay.ali.bean.AliTransactionType;
+import com.egzosn.pay.common.api.PayService;
+import com.egzosn.pay.common.bean.CurType;
+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.paypal.api.PayPalConfigStorage;
+import com.egzosn.pay.paypal.api.PayPalPayService;
+import com.egzosn.pay.paypal.bean.PayPalTransactionType;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import javax.annotation.PostConstruct;
+import javax.servlet.http.HttpServletRequest;
+import java.io.IOException;
+import java.io.InputStream;
+import java.math.BigDecimal;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * 发起支付入口
+ *
+ * @author: egan
+ * @email egzosn@gmail.com
+ * @date 2018/05/06 10:30
+ */
+@RestController
+@RequestMapping("payPal")
+public class PayPalPayController {
+
+
+ private PayService service = null;
+
+ @PostConstruct
+ public void init() {
+ PayPalConfigStorage storage = new PayPalConfigStorage();
+ storage.setClientID("AUWunqrIzeSLQTQqRp_gQwkt1vLRcVa5kJIO4mp0ZvQnTreLmxaji9bqOFpqz-0h8mdeQpYxix6g_PRD");
+ storage.setClientSecret("EJFAZoD_ZG7PoRutRhX93TmeWs-DQ-PjdBkgr0j4GZA6lqAgmS2Z7yKQWqnTP5O74KqBaYOZnUEcq3Ug");
+ storage.setTest(true);
+ //发起付款后的页面转跳地址
+ storage.setReturnUrl("http://127.0.0.1:8088/pay/success");
+ //取消按钮转跳地址,这里用异步通知地址的兼容的做法
+ storage.setNotifyUrl("http://127.0.0.1:8088/pay/cancel");
+ service = new PayPalPayService(storage);
+ }
+
+
+ /**
+ * 跳到支付页面
+ * 针对实时支付,即时付款
+ *
+ * @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("-", ""), PayPalTransactionType.sale);
+
+ Map orderInfo = service.orderInfo(order);
+ return service.buildRequest(orderInfo, MethodType.POST);
+ }
+ /**
+ * 申请退款接口
+ *
+ * @return 返回支付方申请退款后的结果
+ */
+ @RequestMapping("refund")
+ public Map refund() {
+ // TODO 这里需要 refundAmount, curType, description, tradeNo
+ RefundOrder order = new RefundOrder();
+ order.setCurType(CurType.USD);
+ order.setDescription(" description ");
+ order.setTradeNo("paypal 平台的单号");
+ order.setRefundAmount(new BigDecimal(0.01));
+ return service.refund(order);
+ }
+
+
+ /**
+ * return url
+ * PayPal确认付款调用的接口
+ * 用户确认付款后,paypal调用的这个方法执行付款
+ *
+ * @return 付款成功信息
+ */
+ @GetMapping(value = "payBack.json")
+ public String executePayment(HttpServletRequest request) throws IOException {
+ try (InputStream is = request.getInputStream()) {
+ if (service.verify(service.getParameter2Map(request.getParameterMap(), is))) {
+ // TODO 这里进行成功后的订单业务处理
+ // TODO 返回成功付款页面,这个到时候再做一个漂亮的页面显示,并使用前后端分离的模式
+ return "success";
+ }
+ }
+ return "failure";
+ }
+
+
+}
diff --git a/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java b/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java
index be196cf..51b8bd0 100644
--- a/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java
+++ b/pay-java-demo/src/main/java/com/egzosn/pay/demo/entity/PayType.java
@@ -14,6 +14,9 @@ import com.egzosn.pay.fuiou.bean.FuiouTransactionType;
import com.egzosn.pay.payoneer.api.PayoneerConfigStorage;
import com.egzosn.pay.payoneer.api.PayoneerPayService;
import com.egzosn.pay.payoneer.bean.PayoneerTransactionType;
+import com.egzosn.pay.paypal.api.PayPalConfigStorage;
+import com.egzosn.pay.paypal.api.PayPalPayService;
+import com.egzosn.pay.paypal.bean.PayPalTransactionType;
import com.egzosn.pay.union.api.UnionPayConfigStorage;
import com.egzosn.pay.union.api.UnionPayService;
import com.egzosn.pay.union.bean.UnionTransactionType;
@@ -188,16 +191,24 @@ public enum PayType implements BasePayType {
@Override
public PayService getPayService(ApyAccount apyAccount) {
PayoneerConfigStorage configStorage = new PayoneerConfigStorage();
- configStorage.setProgramId("商户id");
+ //设置商户Id
+ configStorage.setProgramId(apyAccount.getPartner());
configStorage.setMsgType(MsgType.json);
configStorage.setInputCharset("utf-8");
+ //"PayoneerPay 用户名"
+ configStorage.setUserName(apyAccount.getSeller());
+ //PayoneerPay API password
+ configStorage.setApiPassword(apyAccount.getPrivateKey());
+ //是否为沙箱
configStorage.setTest(true);
+ return new PayoneerPayService(configStorage);
+ //以下不建议进行使用,会引起两次请求的问题
//Basic Auth
- HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
+ /* HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
httpConfigStorage.setAuthUsername("PayoneerPay 用户名");
httpConfigStorage.setAuthPassword("PayoneerPay API password");
- return new PayoneerPayService(configStorage, httpConfigStorage);
+ return new PayoneerPayService(configStorage, httpConfigStorage);*/
}
@Override
@@ -206,6 +217,26 @@ public enum PayType implements BasePayType {
}
+ },payPal{
+ @Override
+ public PayService getPayService(ApyAccount apyAccount) {
+ PayPalConfigStorage storage = new PayPalConfigStorage();
+ storage.setClientID(apyAccount.getAppid());
+ storage.setClientSecret(apyAccount.getPrivateKey());
+ storage.setTest(true);
+ //发起付款后的页面转跳地址
+ storage.setReturnUrl(apyAccount.getReturnUrl());
+ //取消按钮转跳地址,这里兼容的做法
+ storage.setNotifyUrl(apyAccount.getNotifyUrl());
+ return new PayPalPayService(storage);
+ }
+
+ @Override
+ public TransactionType getTransactionType(String transactionType) {
+ return PayPalTransactionType.valueOf(transactionType);
+ }
+
+
};
public abstract PayService getPayService(ApyAccount apyAccount);