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中双引号。 *
     *     不知道为啥openId字符串会带双引号,目前没找到原因,先直接剔除,后面要找到(初步估计是redis取出来带的)
     * 
* @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 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; } }