admin
2021-06-02 4cdf9b0fdce6d2d7b4ca79055816661b88ac4d5c
订单支付修改
8个文件已修改
1个文件已添加
207 ■■■■ 已修改文件
facade-vip/src/main/java/com/ks/vip/exception/OrderPayException.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-vip/src/main/java/com/ks/vip/exception/VipOrderException.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-vip/src/main/java/com/ks/vip/pojo/DTO/PayWayInfoDTO.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-vip/src/main/java/com/ks/vip/service/VipOrederPayService.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/test/java/com/ks/LuckyTest.java 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-lijin/src/test/java/com/ks/MyBatisTest.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-vip/src/main/java/com/ks/vip/service/remote/VipOrderPayServiceImpl.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-vip/src/main/java/com/ks/vip/util/PayUtil.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
service-vip/src/main/resources/mapper/VipCenterRecordMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
facade-vip/src/main/java/com/ks/vip/exception/OrderPayException.java
New file
@@ -0,0 +1,27 @@
package com.ks.vip.exception;
import com.ks.lib.common.exception.BaseException;
public class OrderPayException extends BaseException {
    //已经支付
    public final static int CODE_ALREADY_PAY = 10001;
    //创建支付订单失败
    public final static int CODE_CREATE_PAY_ORDER_FAIL = 20001;
    public OrderPayException(int code, String msg) {
        super(code, msg);
    }
    public OrderPayException() {
        super();
    }
    @Override
    public synchronized Throwable fillInStackTrace() {
        return this;
    }
}
facade-vip/src/main/java/com/ks/vip/exception/VipOrderException.java
@@ -4,6 +4,9 @@
public class VipOrderException extends BaseException {
    //创建支付订单失败
    public final static int CODE_CREATE_PAY_ORDER_FAIL = 10001;
    public VipOrderException(int code, String msg) {
        super(code, msg);
    }
facade-vip/src/main/java/com/ks/vip/pojo/DTO/PayWayInfoDTO.java
@@ -6,9 +6,21 @@
    private String payUrl;
    public PayWayInfoDTO(int payWay, String payUrl) {
    private String alipayFormId;
    public PayWayInfoDTO(int payWay, String payUrl,String alipayFormId) {
        this.payWay = payWay;
        this.payUrl = payUrl;
        this.alipayFormId=alipayFormId;
    }
    public String getAlipayFormId() {
        return alipayFormId;
    }
    public void setAlipayFormId(String alipayFormId) {
        this.alipayFormId = alipayFormId;
    }
    public int getPayWay() {
facade-vip/src/main/java/com/ks/vip/service/VipOrederPayService.java
@@ -1,6 +1,7 @@
package com.ks.vip.service;
import com.ks.vip.exception.OrderPayException;
import com.ks.vip.exception.VipOrderException;
import com.ks.vip.pojo.DO.VipOrder;
import com.ks.vip.pojo.DTO.PayWayInfoDTO;
@@ -11,22 +12,34 @@
    /**
     * 创建支付订单-并返回支付链接
     *
     * @param t
     * @throws VipOrderException
     */
    public PayWayInfoDTO addOrderByBuy(VipOrderDTO t) throws VipOrderException;
    public PayWayInfoDTO addOrderWithPay(VipOrderDTO t, String notifyUrl, String returnUrl) throws VipOrderException;
    /**
     * 订单支付
     *
     * @param order
     * @return
     */
    public PayWayInfoDTO payOrder(VipOrder order);
    public PayWayInfoDTO payOrder(VipOrder order, String notifyUrl, String returnUrl) throws OrderPayException;
    /**
     * 根据formId获取支付宝的支付表单
     *
     * @param formId
     * @return
     */
    public String getAlipayForm(String formId);
    /**
     * 检查订单支付状态
     *
     * @param id
     * @return
     */
service-lijin/src/test/java/com/ks/LuckyTest.java
@@ -1,79 +1,29 @@
package com.ks;
import com.ks.lijin.LiJinApplication;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.test.context.ContextConfiguration;
import javax.annotation.Resource;
import java.util.*;
@SpringBootTest(classes = LiJinApplication.class)
public class LuckyTest {
    @Resource
    private RedisTemplate redisTemplate;
    @Test
    public void test() {
        Map<Long, Integer> map = new HashMap<>();
        int total = 0;
        int personCount = 1000000;
        for (int i = 0; i < personCount; i++) {
            map.put(10000L + i, i == 0 ? 0 : (int) (1 + 10 * Math.random()));
            total += map.get(10000L + i);
        }
        Set<Long> sets = choujiang(map, 100);
        int percent = total / personCount;
        int upCount = 0;
        for (Long uid : sets) {
            if (map.get(uid) > percent)
                upCount += 1;
            System.out.println(uid + "-" + map.get(uid) + "是否大于均值:" + (map.get(uid) > percent));
        }
        System.out.println("大于均值数量:" + upCount);
        System.out.println("数量:" + sets.size());
    }
        String key="lijinaccountmoney-20210526-1";
        redisTemplate.opsForValue().increment(key,123);
    private Set<Long> choujiang(Map<Long, Integer> map, int number) {
        Object obj = redisTemplate.opsForValue().get("lijinaccountmoney-20210526-1");
        System.out.println(obj);
        List<Long> mList = new ArrayList<>();
        for (Iterator<Long> its = map.keySet().iterator(); its.hasNext(); ) {
            Long uid = its.next();
            int c = map.get(uid);
            for (int i = 0; i < c; i++) {
                mList.add(uid);
            }
        }
        Set<Long> luckyUids = new HashSet<>();
        for (int i = 0; i < number; i++) {
            if(mList.size()==0)
                break;
            long startTime = System.currentTimeMillis();
            int p = (int) (mList.size() * Math.random());
            long uid = mList.get(p);
            luckyUids.add(uid);
            //移除列表右面的相同uid
            while (mList.size() > p && mList.get(p) == uid) {
                mList.remove(p);
            }
            //查询相同uid的列表左侧起点
            for (int j = p - 1; j >= 0; j--) {
                if (mList.get(j).longValue() != uid) {
                    p = j + 1;
                    break;
                } else if (j == 0) {
                    p = 0;
                }
            }
            //删除左侧相同uid
            while (mList.size() > p && mList.get(p) == uid) {
                mList.remove(p);
            }
            System.out.println("运行时间:" + (System.currentTimeMillis() - startTime));
        }
        System.out.println(luckyUids);
        return luckyUids;
    }
service-lijin/src/test/java/com/ks/MyBatisTest.java
@@ -1,12 +1,15 @@
package com.ks;
import com.ks.lijin.pojo.DO.LiJinProviderTaoKeAccount;
import org.junit.jupiter.api.Test;
import org.yeshi.utils.generater.mybatis.ColumnParseUtil;
import org.yeshi.utils.generater.mybatis.MyBatisMapperUtil;
public class MyBatisTest {
    @Test
    public void test(){
        ColumnParseUtil.parseColumn(LiJinProviderTaoKeAccount.class,"D:\\项目\\返利券\\特价\\tejia\\service-lijin\\src\\main\\resources\\mapper\\LiJinProviderTaoKeAccountMapper.xml");
       // MyBatisMapperUtil.createMapper(LiJinGoofsDepotFirstOrder.class);
    }
}
service-vip/src/main/java/com/ks/vip/service/remote/VipOrderPayServiceImpl.java
@@ -2,6 +2,7 @@
import com.alipay.api.AlipayApiException;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.ks.vip.exception.OrderPayException;
import com.ks.vip.exception.VipOrderException;
import com.ks.vip.mapper.VipOrderMapper;
import com.ks.vip.pojo.DO.VipCombo;
@@ -45,7 +46,7 @@
    @Override
    @Transactional(rollbackFor = Exception.class)
    public PayWayInfoDTO addOrderByBuy(VipOrderDTO t) throws VipOrderException {
    public PayWayInfoDTO addOrderWithPay(VipOrderDTO t, String notifyUrl, String returnUrl) throws VipOrderException {
        if (t.getComboId() == null || t.getComboId() <= 0) {
            throw new VipOrderException(1, "套餐ID不能为空");
        }
@@ -83,43 +84,48 @@
        vipOrderMapper.insertSelective(newOrder);
        // 支付方式
        return payOrder(newOrder);
        try {
            return payOrder(newOrder, notifyUrl, returnUrl);
        } catch (OrderPayException e) {
            e.printStackTrace();
            throw new VipOrderException(VipOrderException.CODE_CREATE_PAY_ORDER_FAIL, e.getMsg());
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public PayWayInfoDTO payOrder(VipOrder order) {
    public PayWayInfoDTO payOrder(VipOrder order, String notifyUrl, String returnUrl) throws OrderPayException {
        if (order.getState() == VipOrder.STATE_PAY) {
            throw new OrderPayException(OrderPayException.CODE_ALREADY_PAY, "已经完成支付");
        }
        String goodsTitle = Constant.ORDER_PAY_TITLE;
        String orderId = order.getId() + "";
        switch (order.getPayWay()) {
            case "alipay":  //生成支付宝支付订单
                if (order.getState() == VipOrder.STATE_PAY) {
                    return new PayWayInfoDTO(PayWayEnum.alipay.getWay(), PayUtil.getPaySuccessUrl(orderId));
            //生成支付宝支付订单
            case "alipay":
                String form = PayUtil.getVipChargeAlipayForm(orderId, goodsTitle, orderId, order.getPayMoney(), notifyUrl, returnUrl);
                if (StringUtil.isNullOrEmpty(form)) {
                    throw new OrderPayException(OrderPayException.CODE_CREATE_PAY_ORDER_FAIL, "创建支付宝支付订单失败");
                }
                String form = PayUtil.getVipChargeAlipayForm(orderId, goodsTitle, orderId, order.getPayMoney());
                //暂存2分钟
                String id = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis());
                redisManager.cacheCommonString(id, form, 120);
                String payUrl = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + id;
                return new PayWayInfoDTO(PayWayEnum.alipay.getWay(), payUrl);
                return new PayWayInfoDTO(PayWayEnum.alipay.getWay(), null, id);
            case "weChat":
                try {
                    if (order.getState() == VipOrder.STATE_PAY) {
                        return new PayWayInfoDTO(PayWayEnum.weChat.getWay(), PayUtil.getPaySuccessUrl(orderId));
                    }
                    String formWX = PayUtil.createWXOrder(orderId, null, orderId, order.getPayMoney(), goodsTitle);
                    //暂存2分钟
                    String idWX = StringUtil.Md5(UUID.randomUUID().toString() + "#" + System.currentTimeMillis());
                    redisManager.cacheCommonString(formWX, formWX, 120);
                    String payUrlWX = Constant.HOST + "/BuWan/alipay/printPayForm?formId=" + idWX;
                    return new PayWayInfoDTO(PayWayEnum.weChat.getWay(), payUrlWX);
                    String payUrl = PayUtil.createWXOrder(null, orderId, order.getPayMoney(), goodsTitle, notifyUrl, returnUrl);
                    return new PayWayInfoDTO(PayWayEnum.weChat.getWay(), payUrl, null);
                } catch (Exception e) {
                    throw new OrderPayException(OrderPayException.CODE_CREATE_PAY_ORDER_FAIL, e.getMessage());
                }
        }
        return null;
    }
    @Override
    public String getAlipayForm(String formId) {
        return redisManager.getCommonString(formId);
    }
@@ -131,7 +137,8 @@
            return order;
        }
        switch (order.getPayWay()) {
            case "alipay":  //支付宝
            //支付宝
            case "alipay":
                AlipayTradeQueryResponse res = null;
                try {
                    res = AlipayH5PayUtil.queryOrder(PayUtil.getAlipayApp(), id + "", null);
@@ -146,7 +153,8 @@
                } catch (AlipayApiException e) {
                    e.printStackTrace();
                }
            case "weChat": //微信
                //微信
            case "weChat":
                try {
                    WXPayOrderInfoV3 info = WXPayV3Util.getPayOrderInfo(id + "", PayUtil.getWXAPP());
                    if (info != null && info.getTrade_state().equalsIgnoreCase("SUCCESS")) {
service-vip/src/main/java/com/ks/vip/util/PayUtil.java
@@ -71,10 +71,8 @@
     * @param money
     * @return
     */
    public static String getVipChargeAlipayForm(String id, String goodsTitle, String orderNo, BigDecimal money) {
    public static String getVipChargeAlipayForm(String id, String goodsTitle, String orderNo, BigDecimal money,String notifyUrl,String returnUrl) {
        try {
            String returnUrl = getPaySuccessUrl(id);
            String notifyUrl = Constant.HOST + "/BuWan/alipay/pay";
            AlipayAppInfo appInfo = getAlipayApp();
            String form = AlipayH5PayUtil.createOrderForm(appInfo, orderNo, money, goodsTitle, returnUrl, notifyUrl);
            return form;
@@ -84,10 +82,6 @@
        return null;
    }
    public static String getPaySuccessUrl(String id) {
        return "http://vip.ysdq.yeshitv.com/pay_success.html?id=" + id;
    }
    /**
@@ -100,15 +94,14 @@
     * @return
     * @throws Exception
     */
    public static String createWXOrder(String id, String ip, String orderNo, BigDecimal money, String title) throws Exception {
    public static String createWXOrder(String ip, String orderNo, BigDecimal money, String title,String notifyUrl,String returnUrl) throws Exception {
        WXPlaceOrderParams params = new WXPlaceOrderParams();
        params.setIp(ip);
        params.setOrderNo(orderNo);
        params.setNotifyUrl(Constant.HOST + "/BuWan/wx/pay/vip");
        params.setNotifyUrl(notifyUrl);
        params.setFee(money);
        params.setBody(title);
        params.setApp(getWXAPP());
        String returnUrl = "http://vip.ysdq.yeshitv.com/pay_finish.html?id=" + id;
        String payUrl = WXPayV3Util.createH5Order(params, returnUrl);
        return payUrl;
    }
service-vip/src/main/resources/mapper/VipCenterRecordMapper.xml
@@ -27,7 +27,7 @@
        </if>
        <if test="query.date!=null">
            AND #{query.date}>=r_start_time AND r_end_time>#{query.date};
            AND #{query.date}>=r_start_time AND r_end_time>#{query.date}
        </if>