shikeyin
2024-01-11 65da8373531677b1c37a98f53eaa30c892f35e5a
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package com.ishop.merchant.util;
 
import com.iplatform.core.BeanContextAware;
import com.ishop.merchant.Constants;
import com.ishop.merchant.ProductCache;
import com.ishop.merchant.service.OrderServiceImpl;
import com.walker.infrastructure.utils.DateUtils;
import com.walker.infrastructure.utils.MD5;
import com.walker.infrastructure.utils.NumberFormatUtils;
import com.walker.infrastructure.utils.StringUtils;
import com.walker.pay.Order;
import com.walker.pay.PayType;
import com.walker.pay.ServiceProvider;
import com.walker.pay.support.DefaultOrder;
 
import java.util.List;
 
public class PayUtils {
 
    /**
     * 过滤微信openId中双引号。
     * <pre>
     *     不知道为啥openId字符串会带双引号,目前没找到原因,先直接剔除,后面要找到(初步估计是redis取出来带的)
     * </pre>
     * @param userOpenId
     * @return
     * @date 2023-08-28
     */
    public static final String filterUserOpenId(String userOpenId){
        if(StringUtils.isNotEmpty(userOpenId) && userOpenId.indexOf("\"") >= 0){
            return userOpenId.replaceAll("\"", StringUtils.EMPTY_STRING);
        } else {
            return userOpenId;
        }
    }
 
    /**
     * 余额签名字段,金额保留2位小数
     * @param userId
     * @param payPrice
     * @param balance
     * @param md5Key
     * @return
     * @date 2023-08-30
     */
    public static final String acquireUserBalanceSign(long userId, double payPrice, double balance, String md5Key){
        StringBuilder sb = new StringBuilder(String.valueOf(userId));
        sb.append(NumberFormatUtils.scaleAccuracy2(payPrice)).append(NumberFormatUtils.scaleAccuracy2(balance));
        return MD5.sign(sb.toString(), md5Key, StringUtils.DEFAULT_CHARSET_UTF8);
    }
 
    /**
     * 生成第三方支付订单编号。
     * @param payType
     * @return
     * @date 2023-09-12
     */
    public static final String acquirePayOutTradeNo(String payType){
        return new StringBuilder(payType)
                .append(System.currentTimeMillis()).append(StringUtils.generateRandomNumber(6)).toString();
    }
 
    /**
     * 检测订单中商品是否(全部)为虚拟商品,如果是则无需发货,订单直接完成。
     * @param orderNo
     * @return
     * @date 2023-09-09
     */
    public static final boolean isAutoShippingDone(String orderNo){
        List<Long> productIds = BeanContextAware.getBeanByType(OrderServiceImpl.class).queryOrderProductIds(orderNo);
        if(StringUtils.isEmptyList(productIds)){
            throw new IllegalStateException("未查询到订单明细商品,orderNo=" + orderNo);
        }
        int templateId = 0;
        for(long productId : productIds){
            templateId = BeanContextAware.getBeanByType(ProductCache.class).get(productId).getTempId();
            if(templateId != Constants.SHIPPING_TEMPLATE_ID_NO_SEND){
                return false;
            }
        }
        return true;
    }
 
    /**
     * 返回微信支付v2版本需要的平台订单记录
     * @param moneyFen
     * @param orderId
     * @param title
     * @param attach
     * @param ip
     * @param notifyUrl
     * @param userOpenId 用户对应商户appid下的微信openId,2023-08-28
     * @return
     * @date 2023-08-10
     */
    public static final Order acquirePlatformOrderH5WechatV2(long moneyFen, long orderId
            , String title, String attach, String ip, String notifyUrl, String userOpenId){
        DefaultOrder order = new DefaultOrder();
        order.setServiceProvider(ServiceProvider.Wechat);
        order.setVersion("v2");
        order.setId(orderId);
        order.setCreateTime(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
        order.setPayType(PayType.H5);
        order.setPayDefinitionId("Wechat_v2");
        order.setTotalMoney(moneyFen);
//        order.setNotifyUrl("http://47.99.216.98:7003/pay/wx/notify.do");
        order.setNotifyUrl(notifyUrl);
        order.setIp(ip);
        order.setNonce(StringUtils.generateRandomNumber(6));
        order.setTitle(title);
        order.setAttach(attach);
        order.setBuyerId(userOpenId);
        return order;
    }
 
    /**
     * 获取微信小程序支付类型订单。
     * @param moneyFen
     * @param orderId
     * @param title
     * @param attach
     * @param ip
     * @param notifyUrl
     * @param userMiniOpenId
     * @return
     * @date 2023-09-15
     */
    public static final Order acquirePlatformOrderRoutineWechatV2(long moneyFen, long orderId
            , String title, String attach, String ip, String notifyUrl, String userMiniOpenId){
        DefaultOrder order = new DefaultOrder();
        order.setServiceProvider(ServiceProvider.Wechat);
        order.setVersion("v2");
        order.setId(orderId);
        order.setCreateTime(DateUtils.getDateTimeNumber(System.currentTimeMillis()));
        order.setPayType(PayType.Applet);   // 小程序支付类型订单
        order.setPayDefinitionId("Wechat_v2");
        order.setTotalMoney(moneyFen);
        order.setNotifyUrl(notifyUrl);
        order.setIp(ip);
        order.setNonce(StringUtils.generateRandomNumber(6));
        order.setTitle(title);
        order.setAttach(attach);
        order.setBuyerId(userMiniOpenId);
        return order;
    }
}