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 splitAccountList){ final JSONArray splitRule = new JSONArray(); if(!StringUtils.isEmptyList(splitAccountList)){ for(SplitAccount splitAccount : splitAccountList){ final HashMap 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 getScanWechatPayMethod(ScanWechatOrder order){ HashMap 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 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 getBankCardPayMethod(String bankCardNo, long amount){ HashMap quickPay = new HashMap<>(); quickPay.put("bankCardNo", bankCardNo); quickPay.put("amount", amount); HashMap payMethod = new HashMap<>(); payMethod.put(Constants.PAY_TYPE_QUICKPAY_VSP, quickPay); return payMethod; } /** * 生成优惠券订单 * @param accountSetNo * @param amount * @return */ public static final HashMap getCouponPayMethod(String accountSetNo, long amount){ HashMap quickPay = new HashMap<>(); quickPay.put("accountSetNo", accountSetNo); quickPay.put("amount", amount); HashMap payMethod = new HashMap<>(); payMethod.put(Constants.PAY_TYPE_COUPON, quickPay); return payMethod; } public static final HashMap getAlipayJsPayMethod(String acct , long amount, String limitPay, String idNo, String name){ HashMap 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 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 getWechatJsPayMethod(String acct , long amount, String limitPay, String idNo, String name, String subAppid, boolean wechatMiniProgram){ HashMap 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 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); } }