package com.hai.config; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.hai.common.pay.util.sdk.WXPayConstants; import com.hai.common.utils.HttpsUtils; import com.hai.common.utils.MD5Util; import org.apache.commons.lang3.StringUtils; import java.math.BigDecimal; import java.util.*; /** * 银联支付 * @author hurui */ public class UnionPayConfig { /** * APP控件支付 * 文档地址: https://doc.eycard.cn/web/#/42?page_id=1516 * @param orderNo 订单号 * @param payPrice 支付金额 【单位:分】 * @param orderDesc 订单描述 或 商品描述;例如:购买中石化加油券300元。 * @return 响应信息 * @throws Exception */ public static JSONObject upPreOrder(String orderNo, BigDecimal payPrice, String orderDesc) throws Exception { Map paramMap = new HashMap<>(); paramMap.put("channelid", CommonSysConst.getSysConfig().getUnionPayChannelid()); paramMap.put("merid", CommonSysConst.getSysConfig().getUnionPayMerid()); paramMap.put("termid", CommonSysConst.getSysConfig().getUnionPayTermid()); paramMap.put("tradetrace", orderNo); paramMap.put("opt", "upPreOrder"); paramMap.put("tradetype", "APP"); paramMap.put("tradeamt", payPrice.multiply(new BigDecimal("100")).intValue()); paramMap.put("body", orderDesc); paramMap.put("notifyurl", CommonSysConst.getSysConfig().getUnionPayNotifyUrl()); return HttpsUtils.doPostForm(CommonSysConst.getSysConfig().getUnionPayUrl(), generateRequestParam(paramMap), new HashMap<>()); } /** * 交易查询 * @param paySerialNo 第三方支付流水 * @return * @throws Exception */ public static JSONObject tradeQuery(String paySerialNo) throws Exception { Map paramMap = new HashMap<>(); paramMap.put("channelid", CommonSysConst.getSysConfig().getUnionPayChannelid()); paramMap.put("merid", CommonSysConst.getSysConfig().getUnionPayMerid()); paramMap.put("termid", CommonSysConst.getSysConfig().getUnionPayTermid()); paramMap.put("tradetrace", paySerialNo); paramMap.put("opt", "tradeQuery"); paramMap.put("tradetype", "samecardQuery"); return HttpsUtils.doPostForm(CommonSysConst.getSysConfig().getUnionPayUrl(), generateRequestParam(paramMap), new HashMap<>()); } /** * 交易退货 * @param orderNo 订单号 * @param paySerialNo 第三方订单号 * @param refundPrice 退款金额 * @return * @throws Exception */ public static JSONObject zwrefund(String orderNo,String paySerialNo,Long refundPrice) throws Exception { Map paramMap = new HashMap<>(); paramMap.put("channelid", CommonSysConst.getSysConfig().getUnionPayChannelid()); paramMap.put("merid", CommonSysConst.getSysConfig().getUnionPayMerid()); paramMap.put("termid", CommonSysConst.getSysConfig().getUnionPayTermid()); paramMap.put("tradetrace", orderNo); paramMap.put("oritradetrace", paySerialNo); paramMap.put("tradeamt", refundPrice); paramMap.put("opt", "zwrefund"); return HttpsUtils.doPostForm(CommonSysConst.getSysConfig().getUnionPayUrl(), generateRequestParam(paramMap), new HashMap<>()); } /** * 参数排序 * @param param * @return */ private static String paramSort(final Map param) { Set keySet = param.keySet(); String[] keyArray = keySet.toArray(new String[keySet.size()]); Arrays.sort(keyArray); StringBuilder sb = new StringBuilder(); for (String k : keyArray) { if (k.equals(WXPayConstants.FIELD_SIGN)) { continue; } if (StringUtils.isBlank(sb.toString())) { sb.append(k).append("=").append(param.get(k)); } else { sb.append("&").append(k).append("=").append(param.get(k)); } } return sb.toString(); } /** * 生成请求参数 * @param data * @return * @throws Exception */ private static String generateRequestParam(final Map data) throws Exception{ String paramSort = paramSort(data); // 生产签名参数 String signParam = paramSort; // 签名参数拼接签名秘钥 signParam += "&key=" + CommonSysConst.getSysConfig().getUnionPaySignKey(); // 请求参数拼接签名 paramSort += "&sign=" + MD5Util.encode(signParam.getBytes()); return paramSort; } }