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

flutter支付

上级 fe317f6a
...@@ -48,7 +48,8 @@ public class TokenVerification { ...@@ -48,7 +48,8 @@ public class TokenVerification {
"&&!execution(* com.diaoyun.zion.chinafrica.controller.VersionController.*(..))" + "&&!execution(* com.diaoyun.zion.chinafrica.controller.VersionController.*(..))" +
"&&!execution(* com.diaoyun.zion.chinafrica.controller.TbCfFeeController.*(..))" + "&&!execution(* com.diaoyun.zion.chinafrica.controller.TbCfFeeController.*(..))" +
"&&!execution(* com.diaoyun.zion.chinafrica.controller.PayPalController.*(..))" + "&&!execution(* com.diaoyun.zion.chinafrica.controller.PayPalController.*(..))" +
"&&!execution(* com.diaoyun.zion.chinafrica.controller.ShopifyController.*(..))" "&&!execution(* com.diaoyun.zion.chinafrica.controller.ShopifyController.*(..))"+
"&&!execution(* com.diaoyun.zion.chinafrica.controller.FlutterWaveController.*(..))"
) )
public void controllerAspect() { public void controllerAspect() {
......
...@@ -3,9 +3,13 @@ package com.diaoyun.zion.chinafrica.controller; ...@@ -3,9 +3,13 @@ package com.diaoyun.zion.chinafrica.controller;
import com.diaoyun.zion.chinafrica.service.FlutterWaveService; import com.diaoyun.zion.chinafrica.service.FlutterWaveService;
import com.diaoyun.zion.chinafrica.vo.FlutterWaveCard; import com.diaoyun.zion.chinafrica.vo.FlutterWaveCard;
import com.diaoyun.zion.master.base.Result; import com.diaoyun.zion.master.base.Result;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*; import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/** /**
* @Auther: wudepeng * @Auther: wudepeng
* @Date: 2019/11/08 * @Date: 2019/11/08
...@@ -25,12 +29,27 @@ public class FlutterWaveController { ...@@ -25,12 +29,27 @@ public class FlutterWaveController {
* @return * @return
*/ */
@PostMapping("/pay") @PostMapping("/pay")
public Result payForOrderByCard(@RequestParam("orderId") String orderId, @RequestBody FlutterWaveCard flutterWaveCard) { public Result payForOrderByCard(@ApiParam("订单ID") @RequestParam("orderId") String orderId, @RequestBody FlutterWaveCard flutterWaveCard) {
return flutterWaveService.payForOrder(orderId, flutterWaveCard); return flutterWaveService.payForOrder(orderId, flutterWaveCard);
} }
/**
* 验证付款
*
* @param txref
* @param orderId
* @return
*/
@PostMapping("/verifyPay")
public Result verifyPay(@ApiParam("交易唯一标识") @RequestParam("txref") String txref, @ApiParam("订单ID") @RequestParam("orderId") String orderId) {
return flutterWaveService.verifyPay(txref, orderId);
}
/** /**
* 退款 * 退款
*
* @param flutterWaveCard * @param flutterWaveCard
* @return * @return
*/ */
...@@ -38,5 +57,10 @@ public class FlutterWaveController { ...@@ -38,5 +57,10 @@ public class FlutterWaveController {
public Result refund(@RequestBody FlutterWaveCard flutterWaveCard) { public Result refund(@RequestBody FlutterWaveCard flutterWaveCard) {
return flutterWaveService.refund(flutterWaveCard); return flutterWaveService.refund(flutterWaveCard);
} }
//
// @GetMapping("/queryPayParams")
// public Result queryPayParams(@ApiParam("用户ID") @RequestParam("userId") String userId) {
//
//
// }
} }
...@@ -2,9 +2,13 @@ package com.diaoyun.zion.chinafrica.service; ...@@ -2,9 +2,13 @@ package com.diaoyun.zion.chinafrica.service;
import com.diaoyun.zion.chinafrica.vo.FlutterWaveCard; import com.diaoyun.zion.chinafrica.vo.FlutterWaveCard;
import com.diaoyun.zion.master.base.Result; import com.diaoyun.zion.master.base.Result;
import io.swagger.annotations.ApiParam;
import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RequestParam;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
/** /**
* @Auther: wudepeng * @Auther: wudepeng
* @Date: 2019/11/09 * @Date: 2019/11/09
...@@ -12,6 +16,6 @@ import org.springframework.web.bind.annotation.RequestParam; ...@@ -12,6 +16,6 @@ import org.springframework.web.bind.annotation.RequestParam;
*/ */
public interface FlutterWaveService { public interface FlutterWaveService {
public Result payForOrder(String orderId, FlutterWaveCard flutterWaveCard); public Result payForOrder(String orderId, FlutterWaveCard flutterWaveCard);
Result verifyPay(String txref,String orderId);
public Result refund(FlutterWaveCard flutterWaveCard); public Result refund(FlutterWaveCard flutterWaveCard);
} }
package com.diaoyun.zion.chinafrica.service.impl; package com.diaoyun.zion.chinafrica.service.impl;
import com.alibaba.fastjson.JSON;
import com.diaoyun.zion.chinafrica.constant.KeyConstant; import com.diaoyun.zion.chinafrica.constant.KeyConstant;
import com.diaoyun.zion.chinafrica.dao.TbCfFinanceDao; import com.diaoyun.zion.chinafrica.dao.TbCfFinanceDao;
import com.diaoyun.zion.chinafrica.dao.TbCfOrderDao; import com.diaoyun.zion.chinafrica.dao.TbCfOrderDao;
...@@ -59,8 +60,12 @@ public class FlutterWaveServiceImpl implements FlutterWaveService { ...@@ -59,8 +60,12 @@ public class FlutterWaveServiceImpl implements FlutterWaveService {
//退款API //退款API
private String FLUTTERWAVE_REFUND_URL = "https://api.ravepay.co/gpx/merchant/transactions/refund"; private String FLUTTERWAVE_REFUND_URL = "https://api.ravepay.co/gpx/merchant/transactions/refund";
private String VERIFY_PAY_URL = "https://api.ravepay.co/flwv3-pug/getpaidx/api/v2/verify";
//测试
//private String VERIFY_PAY_URL = "https://ravesandboxapi.flutterwave.com/flwv3-pug/getpaidx/api/v2/verify";
/** /**
* 使用卡号支付 * 使用卡号支付(预支付)
* *
* @param orderId * @param orderId
* @param flutterWaveCard * @param flutterWaveCard
...@@ -76,7 +81,7 @@ public class FlutterWaveServiceImpl implements FlutterWaveService { ...@@ -76,7 +81,7 @@ public class FlutterWaveServiceImpl implements FlutterWaveService {
TbCfOrderEntity orderEntity = tbCfOrderDao.queryObject(orderId); TbCfOrderEntity orderEntity = tbCfOrderDao.queryObject(orderId);
//判断这个订单是否已支付 //判断这个订单是否已支付
if (orderEntity != null && OrderStatusEnum.PAID.getValue().equals(orderEntity.getPayStatus())) { if (orderEntity != null && OrderStatusEnum.PAID.getValue().equals(orderEntity.getPayStatus())) {
result.setMessage("Order paid"); result.setMessage("Order paid!");
result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode()); result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode());
return result; return result;
} }
...@@ -96,42 +101,84 @@ public class FlutterWaveServiceImpl implements FlutterWaveService { ...@@ -96,42 +101,84 @@ public class FlutterWaveServiceImpl implements FlutterWaveService {
JSONObject chargevisa = ch.chargeVisaAndIntl(); JSONObject chargevisa = ch.chargeVisaAndIntl();
//if timeout, poll //if timeout, poll
//JSONObject pollvisa = ch.chargeVisaAndIntl(true); //JSONObject pollvisa = ch.chargeVisaAndIntl(true);
net.sf.json.JSONObject object = net.sf.json.JSONObject.fromObject(chargevisa.toString()); result.setData(chargevisa);
String status = object.getString("status"); } catch (Exception e) {
if ("success".equals(status)) { result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode()).setMessage(e.getMessage());
net.sf.json.JSONObject data = object.getJSONObject("data"); logger.error(e.getMessage(), e);
String paymentId = data.getString("paymentId"); return result;
String authurl = data.getString("authurl"); }
String url = authurl.split(". ")[0]; } else {
changeOrderState(paymentId, tbCfOrderVo); result.setMessage("Order does not exist!");
result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode());
}
return result;
}
/**
* 校验支付
*
* @param txref
* @param orderId
* @return
*/
@Override
public Result verifyPay(String txref, String orderId) {
Result result = new Result();
try {
TbCfOrderVo tbCfOrderVo = (TbCfOrderVo) orderRedisCache.get(KeyConstant.ORDER_DET + orderId);
Map<String, Object> map = new HashMap<>();
map.put("txref", txref);
map.put("SECKEY", domainProperties.getProperty("flutterwave.secret.key"));
String data = HttpClientUtil.sendPostWithBodyParameter(VERIFY_PAY_URL, map);
//System.out.println("===>>>" + data);
com.alibaba.fastjson.JSONObject object = JSON.parseObject(data);
String statusFlag = object.getString("status");
com.alibaba.fastjson.JSONObject results = object.getJSONObject("data");
String status = results.getString("status");
String paymentid = results.getString("paymentid");
String authurl = results.getString("authurl");
//String amount = results.getString("amount");
// System.out.println("price=" + tbCfOrderVo.getRealityPay());
if ("success".equalsIgnoreCase(statusFlag) && "successful".equalsIgnoreCase(status)) {
//支付成功
if (tbCfOrderVo != null) {
// if (!tbCfOrderVo.getRealityPay().equals(amount)) {
// System.out.println("amount=" + amount);
// System.out.println("price=" + tbCfOrderVo.getRealityPay());
// result.setData(JSON.parseObject(data)).setMessage("The payment amount is inconsistent with the order amount!");
// return result;
// }
changeOrderState(paymentid, tbCfOrderVo);
//修改优惠券状态 //修改优惠券状态
if (tbCfOrderVo.getCouponId() != null && "20".equals(tbCfOrderVo.getOrderStatus())) { if (tbCfOrderVo.getCouponId() != null && "20".equals(tbCfOrderVo.getOrderStatus())) {
TbCfToiCouponDao.changeCoupnStatus(tbCfOrderVo.getUserId(), tbCfOrderVo.getCouponId()); TbCfToiCouponDao.changeCoupnStatus(tbCfOrderVo.getUserId(), tbCfOrderVo.getCouponId());
} }
//生成支付流水 //生成支付流水
TbCfFinanceEntity finance = createFinance(paymentId, url, tbCfOrderVo); TbCfFinanceEntity finance = createFinance(paymentid, authurl, tbCfOrderVo);
TbCfFinanceVo tbCfFinanceVo = new TbCfFinanceVo(); TbCfFinanceVo tbCfFinanceVo = new TbCfFinanceVo();
BeanUtils.copyProperties(finance, tbCfFinanceVo); BeanUtils.copyProperties(finance, tbCfFinanceVo);
result.setData(chargevisa).setMessage("Pay for success!");
logger.info(tbCfOrderVo.getUserName() + ":Pay for success! The order number is:" + tbCfOrderVo.getOrderId()); logger.info(tbCfOrderVo.getUserName() + ":Pay for success! The order number is:" + tbCfOrderVo.getOrderId());
//清空订单 //清空订单
removeRedisCache(tbCfOrderVo); removeRedisCache(tbCfOrderVo);
}
result.setData(JSON.parseObject(data));
result.setCode(ResultCodeEnum.SUCCESS.getCode()).setMessage("payment success!");
logger.info("payment success! The flutterwave txref is:" + txref);
} else { } else {
result.setData(JSON.parseObject(data));
//支付失败
result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode()).setMessage("payment failure!"); result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode()).setMessage("payment failure!");
logger.error(tbCfOrderVo.getUserName() + ":payment failure! The order number is:" + tbCfOrderVo.getOrderId()); logger.error("payment failure! The flutterwave txref is:" + txref);
} }
} catch (Exception e) { } catch (Exception e) {
result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode()).setMessage(e.getMessage()); result.setCode(ResultCodeEnum.VALIDATE_ERROR.getCode()).setMessage(e.getMessage());
logger.error(e.getMessage(), e); logger.error(e.getMessage(), e);
return result; return result;
} }
} else {
result.setMessage("Order does not exist!");
result.setCode(ResultCodeEnum.ORDER_PAY_ERROR.getCode());
}
return result; return result;
} }
/** /**
* 退款 * 退款
* *
......
...@@ -228,7 +228,7 @@ public class TbCfOrderServiceImpl implements TbCfOrderService { ...@@ -228,7 +228,7 @@ public class TbCfOrderServiceImpl implements TbCfOrderService {
for (TbCfItemDetailEntity tbCfItemDetail : tbCfItemDetailList) { for (TbCfItemDetailEntity tbCfItemDetail : tbCfItemDetailList) {
TbCfCartItemDetailVo tbCfCartItemDetailVo = new TbCfCartItemDetailVo(); TbCfCartItemDetailVo tbCfCartItemDetailVo = new TbCfCartItemDetailVo();
BeanUtils.copyProperties(tbCfItemDetail, tbCfCartItemDetailVo); BeanUtils.copyProperties(tbCfItemDetail, tbCfCartItemDetailVo);
tbCfCartItemDetailVo.setOrdersId(tbCfOrderDao.getOrdersId(orderVo.getOrderId(),tbCfItemDetail.getItemId())); tbCfCartItemDetailVo.setOrdersId(tbCfOrderDao.getOrdersId(orderVo.getOrderId(), tbCfItemDetail.getItemId()));
itemDetailVoList.add(tbCfCartItemDetailVo); itemDetailVoList.add(tbCfCartItemDetailVo);
} }
orderVo.setItemDetailList(itemDetailVoList); orderVo.setItemDetailList(itemDetailVoList);
...@@ -434,7 +434,7 @@ public class TbCfOrderServiceImpl implements TbCfOrderService { ...@@ -434,7 +434,7 @@ public class TbCfOrderServiceImpl implements TbCfOrderService {
for (TbCfItemDetailEntity tbCfItemDetail : tbCfItemDetailList) { for (TbCfItemDetailEntity tbCfItemDetail : tbCfItemDetailList) {
TbCfCartItemDetailVo tbCfCartItemDetailVo = new TbCfCartItemDetailVo(); TbCfCartItemDetailVo tbCfCartItemDetailVo = new TbCfCartItemDetailVo();
BeanUtils.copyProperties(tbCfItemDetail, tbCfCartItemDetailVo); BeanUtils.copyProperties(tbCfItemDetail, tbCfCartItemDetailVo);
tbCfCartItemDetailVo.setOrdersId(tbCfOrderDao.getOrdersId(orderId,tbCfItemDetail.getItemId())); tbCfCartItemDetailVo.setOrdersId(tbCfOrderDao.getOrdersId(orderId, tbCfItemDetail.getItemId()));
itemDetailVoList.add(tbCfCartItemDetailVo); itemDetailVoList.add(tbCfCartItemDetailVo);
} }
tbCfOrderVo.setItemDetailList(itemDetailVoList); tbCfOrderVo.setItemDetailList(itemDetailVoList);
...@@ -664,7 +664,7 @@ public class TbCfOrderServiceImpl implements TbCfOrderService { ...@@ -664,7 +664,7 @@ public class TbCfOrderServiceImpl implements TbCfOrderService {
//初始商品总价 //初始商品总价
BigDecimal itemsPrice = BigDecimal.valueOf(0.00); BigDecimal itemsPrice = BigDecimal.valueOf(0.00);
BigDecimal totalExpressCost = BigDecimal.ZERO; BigDecimal totalExpressCost = BigDecimal.ZERO;
for(TbCfCartItemDetailVo tbCfCartItemDetailVo:itemDetailList) { for (TbCfCartItemDetailVo tbCfCartItemDetailVo : itemDetailList) {
BigDecimal itemNum = BigDecimal.valueOf(tbCfCartItemDetailVo.getItemNum()); BigDecimal itemNum = BigDecimal.valueOf(tbCfCartItemDetailVo.getItemNum());
BigDecimal itemSourcePrice = tbCfCartItemDetailVo.getItemPrice(); BigDecimal itemSourcePrice = tbCfCartItemDetailVo.getItemPrice();
itemsPrice = itemsPrice.add(itemSourcePrice.multiply(itemNum)); itemsPrice = itemsPrice.add(itemSourcePrice.multiply(itemNum));
......
...@@ -31,10 +31,12 @@ tencent.translate.app_url=https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate ...@@ -31,10 +31,12 @@ tencent.translate.app_url=https://api.ai.qq.com/fcgi-bin/nlp/nlp_texttranslate
tencent.wordpos.app_url=https://api.ai.qq.com/fcgi-bin/nlp/nlp_wordpos tencent.wordpos.app_url=https://api.ai.qq.com/fcgi-bin/nlp/nlp_wordpos
################\u817E\u8BAF\u7FFB\u8BD1\u914D\u7F6E END################### ################\u817E\u8BAF\u7FFB\u8BD1\u914D\u7F6E END###################
##################\u65B011.05(stripe\u516C\u94A5(\u4E0D\u52A0\u5BC6)\u548C\u79C1\u94A5(\u5DF2\u7528 AESUtils \u52A0\u5BC6))################################ ##################\u65B011.05(stripe\u516C\u94A5(\u4E0D\u52A0\u5BC6)\u548C\u79C1\u94A5(\u5DF2\u7528 AESUtils \u52A0\u5BC6))################################
stripe.pk=pk_live_FP6ipnw3lt0e1AmS5IVdpJWd00s5PLdbVa #stripe.pk=pk_live_FP6ipnw3lt0e1AmS5IVdpJWd00s5PLdbVa
stripe.sk=YWA9aMOPvCfq0KWda2Wsh567lLl600+QK/X8ZEFDPj6UDNd3icKr6fJ+X3ey8X+T #stripe.sk=YWA9aMOPvCfq0KWda2Wsh567lLl600+QK/X8ZEFDPj6UDNd3icKr6fJ+X3ey8X+T
#stripe.pk=pk_test_y5dXLjyUyBD11Ta9g2DGynxN0048vnmpGz #stripe.pk=pk_test_y5dXLjyUyBD11Ta9g2DGynxN0048vnmpGz
#stripe.sk=+RFm7p84hym4liN1/MSoshYMiy4rWgUFoZ3S5+ucxRTyzblQL2Pi0y1TDQoSE96z #stripe.sk=+RFm7p84hym4liN1/MSoshYMiy4rWgUFoZ3S5+ucxRTyzblQL2Pi0y1TDQoSE96z
stripe.pk=pk_live_puDlKTnBSW6CXQ6TG766jWZ000UuPSIUDU
stripe.sk=YVym3/CqlcF3PF6JZw6CEOhCoR4R7oqlK8HM8LHlZnqzZijZdjlxIb5wl7/S6e6y
##################stripe\u516C\u94A5(\u4E0D\u52A0\u5BC6)\u548C\u79C1\u94A5(\u5DF2\u7528 AESUtils \u52A0\u5BC6)################################ ##################stripe\u516C\u94A5(\u4E0D\u52A0\u5BC6)\u548C\u79C1\u94A5(\u5DF2\u7528 AESUtils \u52A0\u5BC6)################################
#stripe.pk=pk_live_5MdXU4N1cvmU1yatYp5v0E0n00C7tAXpGB #stripe.pk=pk_live_5MdXU4N1cvmU1yatYp5v0E0n00C7tAXpGB
#stripe.sk=d87UqTQ6QUjuNkXrjH51Gl/Zqnfy98HRl23xljism2hpaXjSNTwdl6pv6FM7D4tT #stripe.sk=d87UqTQ6QUjuNkXrjH51Gl/Zqnfy98HRl23xljism2hpaXjSNTwdl6pv6FM7D4tT
...@@ -74,8 +76,8 @@ flutterwave.public.key=FLWPUBK-ee0f5d653f5f33fc89e6caf9de6a4c34-X ...@@ -74,8 +76,8 @@ flutterwave.public.key=FLWPUBK-ee0f5d653f5f33fc89e6caf9de6a4c34-X
flutterwave.secret.key=FLWSECK-c06cdc19526077f3855b76045ca77de3-X flutterwave.secret.key=FLWSECK-c06cdc19526077f3855b76045ca77de3-X
flutterwave.encryption.key=c06cdc1952600626ec8779ed flutterwave.encryption.key=c06cdc1952600626ec8779ed
flutterwave.merchant.id=6577084 flutterwave.merchant.id=6577084
#################################flutterwave\u6D4B\u8BD5###################################################### #################################flutterwave\u6D4B\u8BD5(TEST)######################################################
#flutterwave.public.key=FLWPUBK_TEST-fe034e806c47ab16cd85c4a8df1e1a0e-X #flutterwave.public.key=FLWPUBK_TEST-e3cc948e7cb24b2128fca3b781f6fce0-X
#flutterwave.secret.key=FLWSECK_TEST-f7335806b11db9c42d2ef10847199f71-X #flutterwave.secret.key=FLWSECK_TEST-f88371ca63a989a4af95625475a0d22d-X
#flutterwave.encryption.key=FLWSECK_TEST97c23ad56b5f #flutterwave.encryption.key=FLWSECK_TEST001d4c34f798
#flutterwave.merchant.id=58765350 #flutterwave.merchant.id=1508207
...@@ -13,10 +13,15 @@ import com.google.gson.JsonArray; ...@@ -13,10 +13,15 @@ import com.google.gson.JsonArray;
import io.swagger.models.auth.In; import io.swagger.models.auth.In;
import net.sf.json.JSONArray; import net.sf.json.JSONArray;
import net.sf.json.JSONObject; import net.sf.json.JSONObject;
import org.apache.http.Consts;
import org.junit.Test; import org.junit.Test;
import springfox.documentation.spring.web.json.Json; import springfox.documentation.spring.web.json.Json;
import java.io.IOException; import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.MalformedURLException;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import java.util.*; import java.util.*;
import static com.github.pagehelper.page.PageMethod.startPage; import static com.github.pagehelper.page.PageMethod.startPage;
...@@ -111,4 +116,15 @@ public class PayTest { ...@@ -111,4 +116,15 @@ public class PayTest {
return subList; return subList;
} }
@Test
public void url() throws MalformedURLException, URISyntaxException, UnsupportedEncodingException {
String url="http://www.oschina.net/search?scope=bbs&q=C%E8%AF%AD%E8%A8%80";
String targetUrl= URLDecoder.decode(url, "utf-8");
Map<String, String> paramMap = HttpClientUtil.getParamMap(targetUrl);
System.out.println(paramMap);
String q = URLDecoder.decode(paramMap.get("q"), "utf-8");
System.out.println(q);
}
} }
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论