package com.walker.pay.allinpaycloud.util;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.walker.infrastructure.utils.JsonUtils;
|
import com.walker.infrastructure.utils.StringUtils;
|
import com.walker.pay.PayStatus;
|
import com.walker.pay.SplitAccount;
|
import com.walker.pay.allinpaycloud.Constants;
|
import com.walker.pay.allinpaycloud.generator.OrderResponsePay;
|
import com.walker.pay.response.OrderStatusResponsePay;
|
import com.walker.pay.support.allinpaycloud.ScanWechatOrder;
|
|
import java.text.SimpleDateFormat;
|
import java.util.Calendar;
|
import java.util.Date;
|
import java.util.HashMap;
|
import java.util.List;
|
|
public class OrderUtils {
|
|
/**
|
* 返回一个用于测试的分账对象。
|
* @param bizUserId
|
* @param amount
|
* @param remark
|
* @return
|
*/
|
public static final SplitAccount acquireSplitAccount(String bizUserId, long amount, String remark, long fee, String accountSetNo){
|
SplitAccount splitAccount = new SplitAccount();
|
splitAccount.setBizUserId(bizUserId);
|
splitAccount.setAmount(amount);
|
splitAccount.setRemark(remark);
|
splitAccount.setFee(fee);
|
splitAccount.setAccountSetNo(accountSetNo);
|
return splitAccount;
|
}
|
|
/**
|
* 返回分账组装对象,JSONArray格式,为了降低依赖,没有直接返回:FastJson特定格式。
|
* @param splitAccountList 分账集合
|
* @return
|
* @date 2023-04-03
|
*/
|
public static final Object acquireSplitAccountParam(List<SplitAccount> splitAccountList){
|
final JSONArray splitRule = new JSONArray();
|
if(!StringUtils.isEmptyList(splitAccountList)){
|
for(SplitAccount splitAccount : splitAccountList){
|
final HashMap<String, Object> splitRule1 = new HashMap<>();
|
splitRule1.put("bizUserId", splitAccount.getBizUserId());
|
if(StringUtils.isEmpty(splitAccount.getAccountSetNo())){
|
splitRule1.put("accountSetNo", StringUtils.EMPTY_STRING);
|
} else {
|
splitRule1.put("accountSetNo", splitAccount.getAccountSetNo());
|
}
|
splitRule1.put("amount", splitAccount.getAmount());
|
splitRule1.put("fee", splitAccount.getFee());
|
splitRule1.put("remark", splitAccount.getRemark());
|
splitRule.add(splitRule1);
|
}
|
}
|
return splitRule;
|
}
|
|
/**
|
* 把返回的订单状态数据转换成系统标准'状态查询对象'
|
* @param info
|
* @param orderStatusResponsePay
|
* @return
|
*/
|
public static final OrderStatusResponsePay obtainOrderStatusResponsePay(ObjectNode info
|
, OrderStatusResponsePay orderStatusResponsePay){
|
// 2023-05-22 修改orderId为字符串,系统间用字符串,支付引擎内部存储仍然是数字。
|
// orderStatusResponsePay.setOrderId(Long.parseLong(info.get("bizOrderNo").textValue()));
|
orderStatusResponsePay.setOrderId(info.get("bizOrderNo").textValue());
|
orderStatusResponsePay.setTradeNo(info.get("orderNo").textValue());
|
orderStatusResponsePay.setTotalMoney(info.get("amount").asLong());
|
orderStatusResponsePay.setUserPayMoney(orderStatusResponsePay.getTotalMoney());
|
if(info.has("payDatetime")){
|
orderStatusResponsePay.setPaySuccessTime(info.get("payDatetime").textValue());
|
}
|
long orderStatus = info.get("orderStatus").asLong();
|
if(orderStatus == 1){
|
orderStatusResponsePay.setPayStatus(PayStatus.NotPay);
|
} else if(orderStatus == 3){
|
orderStatusResponsePay.setPayStatus(PayStatus.Error);
|
orderStatusResponsePay.setMessage(info.get("errorMessage").textValue());
|
} else if(orderStatus == 4){
|
orderStatusResponsePay.setPayStatus(PayStatus.Success);
|
} else if(orderStatus == 5){
|
orderStatusResponsePay.setPayStatus(PayStatus.Refund);
|
} else if(orderStatus == 6){
|
orderStatusResponsePay.setPayStatus(PayStatus.Closed);
|
} else if(orderStatus == 99){
|
orderStatusResponsePay.setPayStatus(PayStatus.Paying);
|
} else {
|
throw new UnsupportedOperationException("未知订单状态,通商云返回:" + orderStatus);
|
}
|
return orderStatusResponsePay;
|
}
|
|
/**
|
* 预下单返回 JSON 数据转换为对象。
|
* @param json
|
* @return
|
* @throws Exception
|
* @date 2023-02-20
|
*/
|
public static final OrderResponsePay getOrderResponsePay(String json) throws Exception{
|
if(StringUtils.isEmpty(json)){
|
return null;
|
}
|
OrderResponsePay orderResponsePay = JsonUtils.jsonStringToObject(json, OrderResponsePay.class);
|
// String payStatus = orderResponsePay.getPayStatus();
|
// if(StringUtils.isNotEmpty(payStatus) && payStatus.equals(Constants.ORDER_STATUS_SUCCESS)){
|
// orderResponsePay.setStatus(true);
|
// } else {
|
// orderResponsePay.setStatus(false);
|
// orderResponsePay.setMessage(orderResponsePay.getPayFailMessage());
|
// }
|
// 2023-02-21 通商云官方文档已经没有'payStatus'状态了,能走到这里就是支付调用成功!
|
orderResponsePay.setStatus(true);
|
return orderResponsePay;
|
}
|
|
/**
|
* 生成支付方式:微信扫码生成支付二维码地址
|
* @param order
|
* @return
|
* @date 2023-03-01
|
*/
|
public static final HashMap<String, Object> getScanWechatPayMethod(ScanWechatOrder order){
|
HashMap<String, Object> quickPay = new HashMap<>();
|
quickPay.put("amount", order.getTotalMoney());
|
quickPay.put("extendParams", order.getExtendParams());
|
if(StringUtils.isNotEmpty(order.getLimitPay())){
|
quickPay.put("limitPay", order.getLimitPay());
|
} else {
|
quickPay.put("limitPay", StringUtils.EMPTY_STRING);
|
}
|
quickPay.put("idNo", order.getIdNo());
|
quickPay.put("name", order.getName());
|
quickPay.put("certType", order.getCertType());
|
HashMap<String, Object> payMethod = new HashMap<>();
|
payMethod.put(Constants.PAY_TYPE_SCAN_WEIXIN, quickPay);
|
return payMethod;
|
}
|
|
/**
|
* 生成支付方式: 银行卡快捷支持。
|
* @param bankCardNo 卡号(已加密数据)
|
* @param amount 金额(分)
|
* @return
|
* @date 2023-02-20
|
*/
|
public static final HashMap<String, Object> getBankCardPayMethod(String bankCardNo, long amount){
|
HashMap<String, Object> quickPay = new HashMap<>();
|
quickPay.put("bankCardNo", bankCardNo);
|
quickPay.put("amount", amount);
|
|
HashMap<String, Object> payMethod = new HashMap<>();
|
payMethod.put(Constants.PAY_TYPE_QUICKPAY_VSP, quickPay);
|
return payMethod;
|
}
|
|
/**
|
* 生成优惠券订单
|
* @param accountSetNo
|
* @param amount
|
* @return
|
*/
|
public static final HashMap<String, Object> getCouponPayMethod(String accountSetNo, long amount){
|
HashMap<String, Object> quickPay = new HashMap<>();
|
quickPay.put("accountSetNo", accountSetNo);
|
quickPay.put("amount", amount);
|
HashMap<String, Object> payMethod = new HashMap<>();
|
payMethod.put(Constants.PAY_TYPE_COUPON, quickPay);
|
return payMethod;
|
}
|
|
public static final HashMap<String, Object> getAlipayJsPayMethod(String acct
|
, long amount, String limitPay, String idNo, String name){
|
HashMap<String, Object> quickPay = new HashMap<>();
|
quickPay.put("acct", acct);
|
quickPay.put("amount", amount);
|
if(StringUtils.isNotEmpty(limitPay)){
|
quickPay.put("limitPay", limitPay);
|
} else {
|
quickPay.put("limitPay", StringUtils.EMPTY_STRING);
|
}
|
if(StringUtils.isNotEmpty(idNo)){
|
quickPay.put("idNo", idNo);
|
}
|
if(StringUtils.isNotEmpty(name)){
|
quickPay.put("name", name);
|
}
|
HashMap<String, Object> payMethod = new HashMap<>();
|
payMethod.put(Constants.PAY_TYPE_ALIPAY_SERVICE, quickPay);
|
return payMethod;
|
}
|
|
/**
|
* 微信'JS'和''小程序'订单一样。
|
* @param acct
|
* @param amount
|
* @param limitPay
|
* @param idNo
|
* @param name
|
* @param subAppid
|
* @return
|
*/
|
public static final HashMap<String, Object> getWechatJsPayMethod(String acct
|
, long amount, String limitPay, String idNo, String name, String subAppid, boolean wechatMiniProgram){
|
HashMap<String, Object> quickPay = new HashMap<>();
|
quickPay.put("acct", acct);
|
quickPay.put("amount", amount);
|
if(StringUtils.isNotEmpty(limitPay)){
|
quickPay.put("limitPay", limitPay);
|
} else {
|
quickPay.put("limitPay", StringUtils.EMPTY_STRING);
|
}
|
if(StringUtils.isNotEmpty(idNo)){
|
quickPay.put("idNo", idNo);
|
}
|
if(StringUtils.isNotEmpty(name)){
|
quickPay.put("name", name);
|
}
|
if(StringUtils.isNotEmpty(subAppid)){
|
quickPay.put("subAppid", subAppid);
|
}
|
HashMap<String, Object> payMethod = new HashMap<>();
|
if(wechatMiniProgram){
|
payMethod.put(Constants.PAY_TYPE_WECHATPAY_MINIPROGRAM, quickPay);
|
} else {
|
payMethod.put(Constants.PAY_TYPE_WECHAT_PUBLIC, quickPay);
|
}
|
return payMethod;
|
}
|
|
/**
|
* 返回订单过期时间,默认 15 小时。
|
* @return
|
* @date 2023-02-17
|
*/
|
public static final String getOrderExpireDateTime(){
|
final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
|
final Calendar calendar = Calendar.getInstance();
|
calendar.add(Calendar.HOUR, 15);
|
final Date date = calendar.getTime();
|
return sdf.format(date);
|
}
|
}
|