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;
}
}