提交 a562e2f2 authored 作者: zgy's avatar zgy

完成paypal支付

上级 dd27e692
......@@ -46,7 +46,8 @@ public class TokenVerification {
"&&!execution(* com.diaoyun.zion.chinafrica.controller.GoodsTypeController.*(..))"+
"&&!execution(* com.diaoyun.zion.chinafrica.controller.VersionController.*(..))"+
"&&!execution(* com.diaoyun.zion.chinafrica.controller.TbCfFeeController.*(..))"+
"&&!execution(* com.diaoyun.zion.chinafrica.controller.TbCfOrderController.*(..))"
"&&!execution(* com.diaoyun.zion.chinafrica.controller.TbCfOrderController.*(..))"+
"&&!execution(* com.diaoyun.zion.chinafrica.controller.PayPalController.*(..))"
)
public void controllerAspect() {
......
package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.service.PayPalService;
import com.diaoyun.zion.chinafrica.vo.PayPalResult;
import com.diaoyun.zion.master.base.Result;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.MethodType;
......@@ -28,23 +29,51 @@ public class PayPalController {
@Autowired
private PayPalService payPalService;
@PostMapping ("/pay")
public Result payForOrder(@RequestParam("orderId") String orderId){
/**
* 发起支付
*
* @param orderId
* @return
*/
@PostMapping("/pay")
public Result payForOrder(@RequestParam("orderId") String orderId) {
return payPalService.payForOrder(orderId);
}
/**
* 支付成功的回调
*
* @param request
* @return
*/
@GetMapping("/success")
public Result payForSuccess(HttpServletRequest request,@RequestParam("orderId") String orderId){
public Result payForSuccess(HttpServletRequest request) {
return payPalService.payForSuccess(request,orderId);
return payPalService.payForSuccess(request);
}
/**
* 取消支付
*
* @return
*/
@GetMapping("/cancel")
public Result cancelPay(){
public Result cancelPay() {
return new Result().setMessage("订单支付已取消");
}
/**
* 退款
* @param orderId
* @param payId
* @return
*/
@GetMapping("/refund")
public Result refund(@RequestParam("orderId") String orderId, @RequestParam("payId") String payId) {
return payPalService.refund(orderId, payId);
}
}
......@@ -31,7 +31,6 @@ public class TbCfExpCatRelController {
@ApiOperation("关联运费模板和商品种类")
@PostMapping("/buildRelate")
public Result buildRelate(@ApiParam("包含分类id数组和模板id") @RequestBody Map<String,Object> param) {
List<String> categoryIdArray= (List<String>) param.get("categoryIds");
String tempalteId= (String) param.get("tempalteId");
......
package com.diaoyun.zion.chinafrica.service;
import com.diaoyun.zion.chinafrica.vo.PayPalResult;
import com.diaoyun.zion.master.base.Result;
import org.springframework.web.bind.annotation.RequestParam;
......@@ -7,5 +8,6 @@ import javax.servlet.http.HttpServletRequest;
public interface PayPalService {
public Result payForOrder( String orderId);
public Result payForSuccess(HttpServletRequest request,String orderId);
public Result payForSuccess(HttpServletRequest request);
Result refund(String orderId,String payId);
}
package com.diaoyun.zion.chinafrica.service.impl;
import com.diaoyun.zion.chinafrica.constant.KeyConstant;
import com.diaoyun.zion.chinafrica.dao.TbCfFinanceDao;
import com.diaoyun.zion.chinafrica.dao.TbCfIssueCouponDao;
import com.diaoyun.zion.chinafrica.dao.TbCfOrderDao;
import com.diaoyun.zion.chinafrica.entity.TbCfFinanceEntity;
import com.diaoyun.zion.chinafrica.entity.TbCfOrderEntity;
import com.diaoyun.zion.chinafrica.enums.DeliveryStatusEnum;
import com.diaoyun.zion.chinafrica.enums.OrderStatusEnum;
import com.diaoyun.zion.chinafrica.service.PayPalService;
import com.diaoyun.zion.chinafrica.vo.PayPalResult;
import com.diaoyun.zion.chinafrica.vo.TbCfFinanceVo;
import com.diaoyun.zion.chinafrica.vo.TbCfOrderVo;
import com.diaoyun.zion.master.base.Result;
import com.diaoyun.zion.master.common.RedisCache;
import com.diaoyun.zion.master.config.DomainProperties;
import com.diaoyun.zion.master.enums.ResultCodeEnum;
import com.diaoyun.zion.master.util.IdUtil;
import com.diaoyun.zion.master.util.JsoupUtil;
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.http.HttpConfigStorage;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.paypal.api.PayPalPayService;
import com.egzosn.pay.paypal.bean.PayPalTransactionType;
import com.stripe.model.Charge;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
......@@ -34,7 +44,10 @@ import java.util.Map;
import java.util.UUID;
@Service("payPalService")
@Transactional
public class PayPalServiceImpl implements PayPalService {
@Autowired
private TbCfFinanceDao tbCfFinanceDao;
@Autowired
private DomainProperties domainProperties;
@Resource
......@@ -42,16 +55,20 @@ public class PayPalServiceImpl implements PayPalService {
private static Logger logger = LoggerFactory.getLogger(TbCfOrderServiceImpl.class);
@Autowired
private TbCfOrderDao tbCfOrderDao;
@Autowired
private TbCfIssueCouponDao tbCfIssueCouponDao;
private String ORDER_ID = "";
@Override
@Transactional
public Result payForOrder(String orderId) {
Result result = new Result();
ORDER_ID = orderId;
PayPalConfigStorage storage = new PayPalConfigStorage();
Result result = new Result();
storage.setClientID(domainProperties.getProperty("paypal.client.app"));
storage.setClientSecret(domainProperties.getProperty("paypal.client.secret"));
//storage.setTest(true);
//发起付款后的页面转跳地址
storage.setTest(true);
storage.setReturnUrl(domainProperties.getProperty("paypal.success.url"));
//取消按钮转跳地址,这里用异步通知地址的兼容的做法
storage.setNotifyUrl(domainProperties.getProperty("paypal.cancel.url"));
......@@ -62,10 +79,17 @@ public class PayPalServiceImpl implements PayPalService {
try {
if (tbCfOrderVo != null) {
BigDecimal realityPay = tbCfOrderVo.getRealityPay();
PayOrder order = new PayOrder("Order_payment:", "Order payment", realityPay, UUID.randomUUID().toString().replace("-", ""), PayPalTransactionType.sale);
PayOrder order = new PayOrder("Order_payment:", "tbCfOrderVo.getUserName()+\"'s order,the total price is $\"+tbCfOrderVo.getRealityPay()", realityPay, UUID.randomUUID().toString().replace("-", ""), PayPalTransactionType.sale);
Map orderInfo = service.orderInfo(order);
String request = service.buildRequest(orderInfo, MethodType.POST);
result.setData(request);
Map<String, String> orderHref = JsoupUtil.getOrderHref(orderInfo.toString());
System.out.println(orderHref.get("approval_url"));
String url = orderHref.get("approval_url");
PayPalResult palResult = new PayPalResult();
palResult.setOrderId(orderId);
palResult.setPayId((String) orderInfo.get("id"));
palResult.setPaypalUrl(url);
palResult.setOrderDesc(tbCfOrderVo.getUserName() + "'s order,the total price is $" + tbCfOrderVo.getRealityPay());
result.setData(palResult);
} else {
result.setCode(ResultCodeEnum.SERVICE_ERROR.getCode()).setMessage("订单不存在!");
}
......@@ -78,37 +102,90 @@ public class PayPalServiceImpl implements PayPalService {
}
@Override
public Result payForSuccess(HttpServletRequest request, String orderId) {
public Result payForSuccess(HttpServletRequest request) {
Result result = new Result();
PayPalConfigStorage storage = new PayPalConfigStorage();
storage.setClientID(domainProperties.getProperty("paypal.client.app"));
storage.setClientSecret(domainProperties.getProperty("paypal.client.secret"));
//storage.setTest(true);
//发起付款后的页面转跳地址
storage.setReturnUrl(domainProperties.getProperty("paypal.success.url"));
//取消按钮转跳地址,这里用异步通知地址的兼容的做法
storage.setNotifyUrl(domainProperties.getProperty("paypal.cancel.url"));
HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
storage.setTest(true);
PayService service = new PayPalPayService(storage);
Map<String, Object> params = null;
TbCfOrderVo tbCfOrderVo = (TbCfOrderVo) orderRedisCache.get(KeyConstant.ORDER_DET + orderId);
try {
params = service.getParameter2Map(request.getParameterMap(), request.getInputStream());
String payerID = (String) params.get("PayerID");
String paymentId = (String) params.get("paymentId");
String token = (String) params.get("token");
if (service.verify(params)) {
System.out.println("支付成功");
result.setData("支付成功");
result.setMessage("支付成功");
} else {
result.setMessage("支付失败");
}
if (ORDER_ID != null) {
TbCfOrderVo tbCfOrderVo = (TbCfOrderVo) orderRedisCache.get(KeyConstant.ORDER_DET + ORDER_ID);
//修改订单状态
changeOrderState(paymentId, tbCfOrderVo);
//修改优惠券状态
if (tbCfOrderVo.getCouponId() != null && tbCfOrderVo.getOrderStatus() == 20) {
tbCfIssueCouponDao.changeCoupnStatus(tbCfOrderVo.getUserId(), tbCfOrderVo.getCouponId());
}
//生成支付流水
TbCfFinanceEntity finance = createFinance(paymentId, token, payerID, tbCfOrderVo);
TbCfFinanceVo tbCfFinanceVo = new TbCfFinanceVo();
BeanUtils.copyProperties(finance, tbCfFinanceVo);
//清除订单
removeRedisCache(tbCfOrderVo);
}
} catch (IOException e) {
result.setCode(ResultCodeEnum.SERVICE_ERROR.getCode()).setMessage(e.getMessage());
logger.error(e.getMessage(), e);
return result;
}
return result;
}
/**
* 退款
*
* @param orderId
* @param payId
* @return
*/
@Override
public Result refund(String orderId, String payId) {
Result result = new Result();
PayPalConfigStorage storage = new PayPalConfigStorage();
storage.setClientID(domainProperties.getProperty("paypal.client.app"));
storage.setClientSecret(domainProperties.getProperty("paypal.client.secret"));
HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
try {
PayService service = new PayPalPayService(storage);
RefundOrder order = new RefundOrder();
order.setTradeNo(orderId);
order.setOutTradeNo(payId);
//根据orderId查询订单信息
TbCfOrderEntity tbCfOrderEntity = tbCfOrderDao.queryObject(orderId);
order.setRefundAmount(tbCfOrderEntity.getRealityPay());
order.setTotalAmount(tbCfOrderEntity.getTotalPrice());
Map refund = service.refund(order);
result.setData(refund).setCode(1).setMessage("退款成功");
} catch (Exception e) {
result.setCode(ResultCodeEnum.SERVICE_ERROR.getCode()).setMessage(e.getMessage());
logger.error(e.getMessage(), e);
return result;
}
return result;
}
/**
* 清空订单缓存
*
* @param tbCfOrderVo
*/
private void removeRedisCache(TbCfOrderVo tbCfOrderVo) {
orderRedisCache.delete(KeyConstant.ORDER_DET + tbCfOrderVo.getOrderId());
String couponId = "";
......@@ -119,6 +196,12 @@ public class PayPalServiceImpl implements PayPalService {
orderRedisCache.delete(KeyConstant.ORDER_EXP + orderIdAndCouponId);
}
/**
* 修改订单状态
*
* @param payId
* @param oldOrder
*/
private void changeOrderState(String payId, TbCfOrderVo oldOrder) {
//更改订单状态
TbCfOrderEntity tbCfOrder = new TbCfOrderEntity();
......@@ -131,4 +214,26 @@ public class PayPalServiceImpl implements PayPalService {
tbCfOrder.setPayStatus(OrderStatusEnum.PAID.getValue());
tbCfOrderDao.update(tbCfOrder);
}
/**
* 记录财务流水
*
* @param
* @param tbCfOrderVo
*/
private TbCfFinanceEntity createFinance(String paymentId, String token, String payerId, TbCfOrderVo tbCfOrderVo) {
TbCfFinanceEntity tbCfFinance = new TbCfFinanceEntity();
String successUrl = domainProperties.getProperty("paypal.success.url");
String receiptUrl = successUrl + "?paymentId=" + paymentId + "&token=" + token + "&PayerID=" + payerId;
tbCfFinance.setOrderId(tbCfOrderVo.getOrderId());
tbCfFinance.setFinaceId(IdUtil.createIdbyUUID());
tbCfFinance.setPayAccount(tbCfOrderVo.getRealityPay());
tbCfFinance.setPayId(paymentId);
tbCfFinance.setPayTime(new Date());
tbCfFinance.setReceiptUrl(receiptUrl);
tbCfFinance.setPayWayCode("paypal");
tbCfFinance.setUserId(tbCfOrderVo.getUserId());
tbCfFinanceDao.save(tbCfFinance);
return tbCfFinance;
}
}
package com.diaoyun.zion.chinafrica.vo;
/**
* 支付返回类
*/
public class PayPalResult {
//订单id
private String orderId;
//支付id
private String payId;
//paypal回调url
private String paypalUrl;
//订单描述
private String orderDesc;
public String getOrderId() {
return orderId;
}
public void setOrderId(String orderId) {
this.orderId = orderId;
}
public String getPayId() {
return payId;
}
public void setPayId(String payId) {
this.payId = payId;
}
public String getPaypalUrl() {
return paypalUrl;
}
public void setPaypalUrl(String paypalUrl) {
this.paypalUrl = paypalUrl;
}
public String getOrderDesc() {
return orderDesc;
}
public void setOrderDesc(String orderDesc) {
this.orderDesc = orderDesc;
}
}
......@@ -36,10 +36,10 @@ tencent.wordpos.app_url=https://api.ai.qq.com/fcgi-bin/nlp/nlp_wordpos
################腾讯翻译配置 END###################
##################stripe公钥(不加密)和私钥(已用 AESUtils 加密)################################
stripe.pk=pk_live_5MdXU4N1cvmU1yatYp5v0E0n00C7tAXpGB
stripe.sk=d87UqTQ6QUjuNkXrjH51Gl/Zqnfy98HRl23xljism2hpaXjSNTwdl6pv6FM7D4tT
#stripe.pk=pk_test_rXUSgU8Kw7DLhDzMbHM0r55O00JAzVBBJR
#stripe.sk=3ff57yz9S5INBexBOnzi/ZaxClXkXlJ+FZ6XLc/f2vpESScG7YOaQaG2YNRic3HF
#stripe.pk=pk_live_5MdXU4N1cvmU1yatYp5v0E0n00C7tAXpGB
#stripe.sk=d87UqTQ6QUjuNkXrjH51Gl/Zqnfy98HRl23xljism2hpaXjSNTwdl6pv6FM7D4tT
stripe.pk=pk_test_rXUSgU8Kw7DLhDzMbHM0r55O00JAzVBBJR
stripe.sk=3ff57yz9S5INBexBOnzi/ZaxClXkXlJ+FZ6XLc/f2vpESScG7YOaQaG2YNRic3HF
######################outlook的账户公钥密钥#####################
#stripe.pk=pk_test_uljWJWUuD8fzZXPlGtDZ1fxx00o1ZKr7QL
#stripe.sk=BbLXgo+ohgrAP7p3tB52YTqNwhAiTYzYWAX0W+/1PES6kOupxwc/7xpAR8QsG6gP
......@@ -54,7 +54,11 @@ express.info.token=d44426bd5b64dd2
#paypal.client.app=AW7u5JVLhzA7_0EznoZ7uKHFzz1_nACOtt6k9oEpbisGUy3nqjjb3L-MmBFnD3YDuMSapcXpfSiYWtiB
#paypal.client.secret=EIyDryMDyM0BDWp2mtuGFdSU2WOkWtmSuGGaRnUiIom7kxuM7JhuSFfETbC8X4e9E_ZbMX4zg4jHA1lV
paypal.mode=live
paypal.client.app=AWbyqn1AKJeVvzNsYms_9fs_LVr5_w5Xyt8nX5q0Wmqoq0NYCZf2wyz9DDeA5ArsWx0LFBwl5Oz6amD2
paypal.client.secret=EFhRjCBzhtI1lf88Xiy3VF07gVpu1vWk0VheSP3n5J0fhQxA6Pu7j89dbyYTLj3FxqiJBOlxQRKG_58e
paypal.success.url=http://127.0.0.1:8083/paypal/success
paypal.cancel.url=http://127.0.0.1:8083/paypal/cancel
\ No newline at end of file
#################################真实######################################################
#paypal.client.app=AUUFVT30kPIP-a7dcQfPS8KYdl5cCZIwyYNIS79Cp7E_0GNZWfut3ZHQiRIoamqRstHigMoTTy1n8Glj
#paypal.client.secret=EJBVz86f9Mg482bL3lniPtLYe_ULyBkjTS0q-qhZBIVFC3dgae-J7-JJA5iWQAZsQqtAOV_ctVGWNLJS
#################################测试######################################################
paypal.client.app=AW7u5JVLhzA7_0EznoZ7uKHFzz1_nACOtt6k9oEpbisGUy3nqjjb3L-MmBFnD3YDuMSapcXpfSiYWtiB
paypal.client.secret=EIyDryMDyM0BDWp2mtuGFdSU2WOkWtmSuGGaRnUiIom7kxuM7JhuSFfETbC8X4e9E_ZbMX4zg4jHA1lV
paypal.success.url=http://localhost:8083/zion/paypal/success
paypal.cancel.url=http://localhost:8083/zion/paypal/cancel
\ No newline at end of file
package com.diaoyun.zion;
import com.diaoyun.zion.master.util.JsoupUtil;
import com.egzosn.pay.common.api.PayService;
import com.egzosn.pay.common.bean.CurType;
import com.egzosn.pay.common.bean.MethodType;
......@@ -8,13 +9,18 @@ import com.egzosn.pay.common.http.HttpConfigStorage;
import com.egzosn.pay.paypal.api.PayPalConfigStorage;
import com.egzosn.pay.paypal.api.PayPalPayService;
import com.egzosn.pay.paypal.bean.PayPalTransactionType;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.paypal.api.payments.Links;
import net.sf.json.JSONObject;
import javax.servlet.http.HttpServletRequest;
import java.awt.image.BufferedImage;
import java.math.BigDecimal;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
......@@ -30,24 +36,32 @@ public class PayTest {
public static void main(String[] args) {
PayPalConfigStorage storage = new PayPalConfigStorage();
storage.setClientID("AWbyqn1AKJeVvzNsYms_9fs_LVr5_w5Xyt8nX5q0Wmqoq0NYCZf2wyz9DDeA5ArsWx0LFBwl5Oz6amD2");
storage.setClientSecret("EFhRjCBzhtI1lf88Xiy3VF07gVpu1vWk0VheSP3n5J0fhQxA6Pu7j89dbyYTLj3FxqiJBOlxQRKG_58e");
//storage.setTest(true);
storage.setClientID("AW7u5JVLhzA7_0EznoZ7uKHFzz1_nACOtt6k9oEpbisGUy3nqjjb3L-MmBFnD3YDuMSapcXpfSiYWtiB");
storage.setClientSecret("EIyDryMDyM0BDWp2mtuGFdSU2WOkWtmSuGGaRnUiIom7kxuM7JhuSFfETbC8X4e9E_ZbMX4zg4jHA1lV");
storage.setTest(true);
//发起付款后的页面转跳地址
storage.setReturnUrl("http://127.0.0.1:8083/pay/success");
storage.setReturnUrl("http://localhost:8083/zion/paypal/success?orderId=d56afd2ab3134dee87b6ba7dc88c4c8c");
//取消按钮转跳地址,这里用异步通知地址的兼容的做法
storage.setNotifyUrl("http://127.0.0.1:8083/pay/cancel");
storage.setNotifyUrl("http://localhost:8083/zion/paypal/cancel");
HttpConfigStorage httpConfigStorage = new HttpConfigStorage();
PayService service = new PayPalPayService(storage);
BigDecimal price = new BigDecimal("500");
PayOrder order = new PayOrder("Order_payment:", "Order payment", price, UUID.randomUUID().toString().replace("-", ""), PayPalTransactionType.sale);
Map orderInfo = service.orderInfo(order);
String request = service.buildRequest(orderInfo, MethodType.POST);
System.out.println(request);
// String payId =(String) orderInfo.get("id");
// System.out.println("orderInfo====>>>"+orderInfo);
// System.out.println("links====>>>"+orderInfo.get("links"));
// String request = service.buildRequest(orderInfo, MethodType.POST);
// System.out.println(request);
// Set set = orderInfo.entrySet();
// Iterator iterator = set.iterator();
// while (iterator.hasNext()){
// System.out.println(iterator.next());
// }
System.out.println(orderInfo.get("links"));
Map<String, String> orderHref = JsoupUtil.getOrderHref(orderInfo.toString());
System.out.println(orderHref.get("approval_url"));
}
}
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论