智能对接支付

package com.chongxuan.web.pay.processor;

import com.chongxuan.web.config.cache.PayCacheUtil;
import com.chongxuan.web.config.cache.SysConfigCacheUtil;
import com.chongxuan.web.entity.MemberPayJour;
import com.chongxuan.web.entity.PayChannelNew;
import com.chongxuan.web.entity.PayPlatformConfig;
import com.chongxuan.web.entity.PayPlatformNew;
import com.chongxuan.web.mapper.MemberPayJourMapper;
import com.chongxuan.web.mapper.PayPlatformNewMapper;
import com.chongxuan.web.service.IPayService;
import com.chongxuan.web.util.DateFormatUtils;
import com.chongxuan.web.util.JsonUtil;
import com.chongxuan.web.vo.ReqPayRechargeNew;
import com.google.common.collect.Sets;
import com.google.common.io.CharStreams;
import lombok.extern.log4j.Log4j2;
import org.apache.commons.codec.digest.DigestUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.logging.log4j.util.Strings;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.MediaType;
import org.springframework.util.CollectionUtils;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;

import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;
import java.math.BigDecimal;
import java.util.*;

@Log4j2
public class TogetherPayProcessor {
    @Autowired
    protected MemberPayJourMapper payJourMapper;
    @Autowired
    protected PayPlatformNewMapper payPlatformNewMapper;
    @Autowired
    protected RestTemplate restTemplate;
    @Autowired
    protected IPayService payService;
    @Autowired
    protected static SysConfigCacheUtil sysConfigCacheUtil;
    @Autowired
    protected PayCacheUtil payCacheUtil;
    
    public static String orderPay(PayChannelNew payChannelNew, PayPlatformNew payPlatformNew, PayPlatformConfig payPlatformConfig, ReqPayRechargeNew reqPayRecharge) {
        SortedMap<String, String> params = new TreeMap<>();
        //下单商户id参数
        params.put(payPlatformConfig.getPayMerid(), payPlatformNew.getMerId());
        //支付通道参数
        params.put(payPlatformConfig.getPayCode(), payChannelNew.getPayMethod());
        //下单订单号参数
        params.put(payPlatformConfig.getPayOrderno(), reqPayRecharge.getOrderNo());
        //下单金额参数
        String[] paymoney = payPlatformConfig.getPayMoney().split(",");
        if ("0".equals(paymoney[1])) {
            params.put(paymoney[0], reqPayRecharge.getMoney().setScale(2,
                    BigDecimal.ROUND_HALF_UP).toString());
        } else if ("1".equals(paymoney[1])) {
            params.put(paymoney[0], reqPayRecharge.getMoney().multiply(BigDecimal.valueOf(100)).setScale(0,
                    BigDecimal.ROUND_HALF_UP).toString());
        }
        //回调地址参数
        if (payPlatformConfig.getPayCallbackurl() != null) {
            params.put(payPlatformConfig.getPayCallbackurl(), sysConfigCacheUtil.getConf("payCallbackUrl") + payPlatformConfig.getPayCode());
        }
        //下单成功跳转地址参数
        if (payPlatformConfig.getPayReturnurl() != null) {
            params.put(payPlatformConfig.getPayReturnurl(), sysConfigCacheUtil.getConf("payReturnUrl"));
        }
        //下单IP参数
        if (payPlatformConfig.getPayIp() != null) {
            params.put(payPlatformConfig.getPayIp(), reqPayRecharge.getRealIp());
        }
        //下单应用id参数
        if (payPlatformConfig.getPayAppid() != null) {
            params.put(payPlatformConfig.getPayAppid(), payPlatformNew.getOrgId());
        }
        //下单时间戳参数,以逗号分隔,后面0为秒,1为毫秒
        if (payPlatformConfig.getPayTimesecond() != null) {
            String[] paytimescond = payPlatformConfig.getPayTimesecond().split(",");
            if ("0".equals(paytimescond[1])) {
                params.put(paytimescond[0], System.currentTimeMillis() + "");
            } else if ("1".equals(paytimescond[1])) {
                params.put(paytimescond[0], System.currentTimeMillis() / 1000 + "");
            }
        }

        //下单时间格式参数,以逗号分隔,后面 0为yyyy-mm-dd HH:mm:ss, 1为yyyyMMddHHmmss
        if (payPlatformConfig.getPayTime() != null) {
            String[] paytime = payPlatformConfig.getPayTime().split(",");
            if ("0".equals(paytime[1])) {
                params.put(paytime[0], DateFormatUtils.formate(new Date(), "yyyy-MM-dd HH:mm:ss"));
            } else if ("1".equals(paytime[1])) {
                params.put(paytime[0], DateFormatUtils.formate(new Date(), "yyyyMMddHHmmss"));
            }
        }
        //下单UUID任意值参数
        if (payPlatformConfig.getPayUuidname() != null) {
            params.put(payPlatformConfig.getPayUuidname(), UUID.randomUUID() + "");
        }

        //额外参数模块
        if (payPlatformConfig.getPayParam1() != null) {
            params.put(payPlatformConfig.getPayParam1(), payPlatformConfig.getPayParam1());
        }
        if (payPlatformConfig.getPayParam2() != null) {
            params.put(payPlatformConfig.getPayParam2(), payPlatformConfig.getPayParam2());
        }
        if (payPlatformConfig.getPayParam3() != null) {
            params.put(payPlatformConfig.getPayParam3(), payPlatformConfig.getPayParam3());
        }
        if (payPlatformConfig.getPayParam4() != null) {
            String[] param4 = payPlatformConfig.getPayParam4().split(",");
            params.put(param4[0], param4[1]);
        }
        if (payPlatformConfig.getPayParam5() != null) {
            String[] param5 = payPlatformConfig.getPayParam5().split(",");
            params.put(param5[0], param5[1]);
        }

        //下单加密排序方式 0为ASCII码排序
        String tmpStr = null;
        if (payPlatformConfig.getPaySort() == 0) {
            tmpStr = assemblyUrl(params);
        }
        //下单拼接密钥方式   0为&key= 1为key= 2为直接拼接
        switch (payPlatformConfig.getPaySplice()) {
            case 0:
                tmpStr = tmpStr + "&key=" + payPlatformNew.getSignMd5();
                break;
            case 1:
                tmpStr = tmpStr + "key=" + payPlatformNew.getSignMd5();
                break;
            case 2:
                tmpStr = tmpStr + payPlatformNew.getSignMd5();
                break;
        }

        //下单MD5加密转大小写,0转大写,1转小写
        String sign = null;
        if (payPlatformConfig.getPayCase() == 0) {
            sign = DigestUtils.md5Hex(tmpStr).toUpperCase();
        } else if (payPlatformConfig.getPayCase() == 1) {
            sign = DigestUtils.md5Hex(tmpStr).toLowerCase();
        }

        // 下单签名参数
        params.put(payPlatformConfig.getPaySign(), sign);

        //下单请求方式  0为FORM_URLENCODED   1为FROM_DATA  2为JSON  3为get
        Map<String, Object> resultMap = null;
        if (payPlatformConfig.getPayHttpmethod() == 0 || payPlatformConfig.getPayHttpmethod() == 1) {
            HttpEntity<MultiValueMap<String, String>> httpEntity = null;
            switch (payPlatformConfig.getPayHttpmethod()) {
                case 0:
                    httpEntity = MFORM_URLENCODE(params);
                    break;
                case 1:
                    httpEntity = MFORM_DATA(params);
                    break;
            }
            //下单返回值类型 0为String 1为Map, 2为html页面
            if (payPlatformConfig.getPayReturntype() == 2) {
                return FromHTML(httpEntity, payPlatformNew.getPlatPayUrl(), reqPayRecharge);
            }
            switch (payPlatformConfig.getPayReturntype()) {
                case 0:
                    resultMap = FromString(payPlatformNew.getName(), httpEntity, payPlatformNew.getPlatPayUrl(), reqPayRecharge);
                    break;
                case 1:
                    resultMap = FromMap(payPlatformNew.getName(), httpEntity, payPlatformNew.getPlatPayUrl(), reqPayRecharge);
                    break;
            }
        } else if (payPlatformConfig.getPayHttpmethod() == 2) {
            HttpEntity<Map<String, String>> httpEntityMap = null;
            httpEntityMap = MJSON(params);
            //下单返回值类型 0为String 1为Map, 2为html页面
            if (payPlatformConfig.getPayReturntype() == 2) {
                return JsonHTML(httpEntityMap, payPlatformNew.getPlatPayUrl(), reqPayRecharge);
            }
            switch (payPlatformConfig.getPayReturntype()) {
                case 0:
                    resultMap = JsonString(payPlatformNew.getName(), httpEntityMap, payPlatformNew.getPlatPayUrl(), reqPayRecharge);
                    break;
                case 1:
                    resultMap = JsonMap(payPlatformNew.getName(), httpEntityMap, payPlatformNew.getPlatPayUrl(), reqPayRecharge);
                    break;
            }
        } else if (payPlatformConfig.getPayHttpmethod() == 3) {
            if (payPlatformConfig.getPayReturntype() == 2) {
                return getForObjectHTML(params, payPlatformNew.getPlatPayUrl(), payPlatformNew.getName());
            }
            switch (payPlatformConfig.getPayReturntype()) {
                case 0:
                    resultMap = getForObjectString(params, payPlatformNew.getPlatPayUrl(), payPlatformNew.getName());
                    break;
                case 1:
                    resultMap = getForObjectMap(params, payPlatformNew.getPlatPayUrl(), payPlatformNew.getName());
                    break;
            }
        }

        if (!CollectionUtils.isEmpty(resultMap)) {
            //下单返回状态判断参数
            if (payPlatformConfig.getPayStatus() != null) {
                String[] paystatus = payPlatformConfig.getPayStatus().split(",");
                String status = resultMap.getOrDefault(paystatus[0], "").toString();
                if (status.equals(paystatus[1])) {
                    log.warn(payPlatformNew.getName() + "支付下单成功,订单号:{}", reqPayRecharge.getOrderNo());
                } else {
                    reqPayRecharge.setFailReason(resultMap.getOrDefault(payPlatformConfig.getPayFailreason(), "").toString());
                    log.warn(payPlatformNew.getName() + "支付下单失败,订单号:{}", reqPayRecharge.getOrderNo());
                    return null;
                }
            }

            /** 下单返回嵌套map的参数名称,如没有为空 */
            if (payPlatformConfig.getPayMapname() != null) {
                String paymapname = payPlatformConfig.getPayMapname();
                Map<String, String> dataMap = (Map<String, String>) resultMap.getOrDefault(paymapname, "");
                //返回链接参数
                return dataMap.getOrDefault(payPlatformConfig.getPayUrl(), "");
            }
            return resultMap.getOrDefault(payPlatformConfig.getPayUrl(), "").toString();
        }
        log.warn(payPlatformNew.getName() + "支付下单失败,订单号:{}", reqPayRecharge.getOrderNo());
        return null;
    }
    
    public boolean queryPay(MemberPayJour payJour, PayPlatformNew payPlatformNew, PayPlatformConfig payPlatformConfig, PayChannelNew payChannelNew) {
        SortedMap<String, String> params = new TreeMap<>();
        //查询商户id参数
        params.put(payPlatformConfig.getQueryMerid(), payPlatformNew.getMerId());
        //查询订单号参数I
        params.put(payPlatformConfig.getQueryOrderno(), payJour.getOrderNo());
        //查询时间戳参数,以逗号分隔,后面0为秒,1为毫秒
        if (payPlatformConfig.getQueryTimesecond() != null) {
            String[] querytimesecond = payPlatformConfig.getQueryTimesecond().split(",");
            if ("0".equals(querytimesecond[1])) {
                params.put(querytimesecond[0], System.currentTimeMillis() + "");
            } else if ("1".equals(querytimesecond[1])) {
                params.put(querytimesecond[0], System.currentTimeMillis() / 1000 + "");
            }
        }
        //查询时间格式参数,以逗号分隔,后面 0为yyyy-mm-dd HH:mm:ss, 1为yyyyMMddHHmmss
        if (payPlatformConfig.getQueryTime() != null) {
            String[] querytime = payPlatformConfig.getQueryTime().split(",");
            if ("0".equals(querytime[1])) {
                params.put(querytime[0], DateFormatUtils.formate(new Date(), "yyyy-MM-dd HH:mm:ss"));
            } else if ("1".equals(querytime[1])) {
                params.put(querytime[0], DateFormatUtils.formate(new Date(), "yyyyMMddHHmmss"));
            }
        }
        //查询UUID任意值参数
        if (payPlatformConfig.getQueryUuidname() != null) {
            params.put(payPlatformConfig.getQueryUuidname(), UUID.randomUUID() + "");
        }
        //查询应用ID参数
        if (payPlatformConfig.getQueryAppid() != null) {
            params.put(payPlatformConfig.getQueryAppid(), payPlatformNew.getOrgId());
        }
        //额外参数模块,以逗号分隔
        if (payPlatformConfig.getQueryParam1() != null) {
            String[] queryparam1 = payPlatformConfig.getQueryParam1().split(",");
            params.put(queryparam1[0], queryparam1[1]);
        }

        //查询加密排序方式 0为ASCII码排序
        String tmpStr = null;
        if (payPlatformConfig.getQuerySort() == 0) {
            tmpStr = this.assemblyUrl(params);
        }
        //查询拼接密钥方式   0为&key= 1为key= 2为直接拼接
        switch (payPlatformConfig.getQuerySplice()) {
            case 0:
                tmpStr = tmpStr + "&key=" + payPlatformNew.getSignMd5();
                break;
            case 1:
                tmpStr = tmpStr + "key=" + payPlatformNew.getSignMd5();
                break;
            case 2:
                tmpStr = tmpStr + payPlatformNew.getSignMd5();
                break;
        }

        //查询MD5加密转大小写,0转大写,1转小写
        String sign = null;
        if (payPlatformConfig.getQueryCase() == 0) {
            sign = DigestUtils.md5Hex(tmpStr).toUpperCase();
        } else if (payPlatformConfig.getQueryCase() == 1) {
            sign = DigestUtils.md5Hex(tmpStr).toLowerCase();
        }

        //查询签名参数
        params.put(payPlatformConfig.getQuerySign(), sign);

        //查询请求方式  0为FORM_URLENCODED   1为FROM_DATA  2为JSON  3为get
        Map<String, Object> resultMap = null;
        if (payPlatformConfig.getQueryHttpmethod() == 0 || payPlatformConfig.getQueryHttpmethod() == 1) {
            HttpEntity<MultiValueMap<String, String>> httpEntity = null;
            switch (payPlatformConfig.getQueryHttpmethod()) {
                case 0:
                    httpEntity = this.MFORM_URLENCODE(params);
                    break;
                case 1:
                    httpEntity = this.MFORM_DATA(params);
                    break;
            }
            //查询返回值类型 0为String 1为Map
            switch (payPlatformConfig.getQueryReturntype()) {
                case 0:
                    resultMap = QueryFromString(payPlatformNew.getName(), httpEntity, payPlatformNew.getPlatQueryUrl());
                    break;
                case 1:
                    resultMap = QueryFromMap(payPlatformNew.getName(), httpEntity, payPlatformNew.getPlatQueryUrl());
                    break;
            }
        } else if (payPlatformConfig.getQueryHttpmethod() == 2) {
            HttpEntity<Map<String, String>> httpEntityMap = null;
            httpEntityMap = this.MJSON(params);
            //查询返回值类型 0为String 1为Map
            switch (payPlatformConfig.getQueryReturntype()) {
                case 0:
                    resultMap = QueryJsonString(payPlatformNew.getName(), httpEntityMap, payPlatformNew.getPlatQueryUrl());
                    break;
                case 1:
                    resultMap = QueryJsonMap(payPlatformNew.getName(), httpEntityMap, payPlatformNew.getPlatQueryUrl());
                    break;
            }
        } else if (payPlatformConfig.getQueryHttpmethod() == 3) {
            switch (payPlatformConfig.getQueryReturntype()) {
                case 0:
                    resultMap = QuerygetForObjectString(params, payPlatformNew.getPlatQueryUrl(), payPlatformNew.getName());
                    break;
                case 1:
                    resultMap = QuerygetForObjectMap(params, payPlatformNew.getPlatQueryUrl(), payPlatformNew.getName());
                    break;
            }
        }

        if (!CollectionUtils.isEmpty(resultMap)) {
            //查询返回状态判断参数
            if (payPlatformConfig.getQueryStatus() != null) {
                String[] paystatus = payPlatformConfig.getQueryStatus().split(",");
                String status = resultMap.getOrDefault(paystatus[0], "").toString();
                if (status.equals(paystatus[1])) {
                    log.warn(payPlatformNew.getName() + "支付查询成功,订单号:{}", payJour.getOrderNo());
                } else {
                    log.warn(payPlatformNew.getName() + "支付查询失败,订单号:{}", payJour.getOrderNo());
                    return false;
                }
            }

            // 查询返回金额参数名称,以逗号分隔,后面0为元,1为分
            String[] querymoney = payPlatformConfig.getQueryMoney().split(",");
            //查询返回平台订单号参数名称
            String querysanorderno = payPlatformConfig.getQuerySanorderno();
            // 查询返回嵌套map的参数名称,如没有为空
            if (payPlatformConfig.getQueryMapname() != null) {
                String paymapname = payPlatformConfig.getQueryMapname();
                Map<String, String> dataMap = (Map<String, String>) resultMap.getOrDefault(paymapname, "");
                //返回金额,平台订单号参数
                if ("0".equals(querymoney[1])) {
                    payJour.setMoney(new BigDecimal(dataMap.getOrDefault(querymoney[0], "")).multiply(BigDecimal.valueOf(100)).setScale(0,
                            BigDecimal.ROUND_HALF_UP));
                } else {
                    payJour.setMoney(new BigDecimal(dataMap.getOrDefault(querymoney[0], "")));
                }
                payJour.setTradeSn(dataMap.getOrDefault(querysanorderno, ""));
                return true;
            }
            if ("0".equals(querymoney[1])) {
                payJour.setMoney(new BigDecimal(resultMap.getOrDefault(querymoney[0], "").toString()).multiply(BigDecimal.valueOf(100)).setScale(0,
                        BigDecimal.ROUND_HALF_UP));
            } else {
                payJour.setMoney(new BigDecimal(resultMap.getOrDefault(querymoney[0], "").toString()));
            }
            payJour.setTradeSn(resultMap.getOrDefault(querysanorderno, "").toString());
            return true;
        }
        log.warn(payPlatformNew.getName() + "支付查询失败,订单号:{}", payJour.getOrderNo());
        return false;
    }
    
    public String callbackPay(Map<String, Object> requestMap, PayPlatformConfig payPlatformConfig, String realIp) {
        //商户订单ID参数
        String callbackorderno = requestMap.getOrDefault(payPlatformConfig.getCallbackOrderno(), "").toString();

        if(payPlatformConfig.getCallbackParam1() != null){
            requestMap.remove(payPlatformConfig.getCallbackParam1());
        }
        if(payPlatformConfig.getCallbackParam2() != null){
            requestMap.remove(payPlatformConfig.getCallbackParam2());
        }

        MemberPayJour payJour = payJourMapper.findByOrderNo(callbackorderno);
        if (Objects.nonNull(payJour) && Strings.isNotBlank(payJour.getStatus())) {
            if ("1".equals(payJour.getStatus())) {
                log.warn("订单已成功,无需继续回调 - orderNo:{}", callbackorderno);
                return payPlatformConfig.getCallbackSuccess();
            }
        }
        PayPlatformNew payPlatformNew = payCacheUtil.getPayPlatform(payJour.getPlatformId());
        if (this.verifyIP(requestMap, realIp, payPlatformNew)) {
            return "fail";
        }
        PayChannelNew payChannelNew = payCacheUtil.getPayChannel(payJour.getChannelId());

        if (this.diffPayTime12Hour(payJour.getPayTime(), callbackorderno)) {
            return "fail";
        }
        if (!payChannelNew.getIsCanCallback()) {
            log.warn("平台已拒绝三方支付通道回调 - 三方支付平台:{};三方支付编码:{};orderNo:{}", payPlatformNew.getName(),
                    payChannelNew.getName(), callbackorderno);
            return "fail";
        }



        //查询加密排序方式 0为ASCII码排序
        String tmpStr = null;
        if (payPlatformConfig.getCallbackSort() == 0) {
            SortedMap<String, String> params = new TreeMap(requestMap);
            tmpStr = this.assemblyUrl(params);
        }
        //查询拼接密钥方式   0为&key= 1为key= 2为直接拼接
        switch (payPlatformConfig.getCallbackSplice()) {
            case 0:
                tmpStr = tmpStr + "&key=" + payPlatformNew.getSignMd5();
                break;
            case 1:
                tmpStr = tmpStr + "key=" + payPlatformNew.getSignMd5();
                break;
            case 2:
                tmpStr = tmpStr + payPlatformNew.getSignMd5();
                break;
        }

        String signMd5 = DigestUtils.md5Hex(tmpStr);

        //三方平台订单ID参数
        String callbacksanorderno = requestMap.getOrDefault(payPlatformConfig.getCallbackSanorderno(), "").toString();
        //回调状态参数名称
        String[] callbackstatus = payPlatformConfig.getCallbackStatus().split(",");
        String status = requestMap.getOrDefault(callbackstatus[0], "").toString();
        //回调金额参数名称
        String[] callbackmoney = payPlatformConfig.getCallbackMoney().split(",");
        String money = requestMap.getOrDefault(callbackmoney[0], "").toString();
        //回调签名参数名称
        String callbacksign = requestMap.getOrDefault(payPlatformConfig.getCallbackSign(), "").toString();

        log.warn("支付回调:{}" , callbacksign + "_" + signMd5);
        if (callbacksign.equalsIgnoreCase(signMd5)) {
            if (status.equals(callbackstatus[1])) {
                if (this.queryPay(payJour, payPlatformNew, payPlatformConfig, payChannelNew)) {
                    if("0".equals(callbackmoney[1])) {
                        payJour.setSubMoney(new BigDecimal(money));
                    } else {
                        payJour.setSubMoney(new BigDecimal(money).multiply(BigDecimal.valueOf(100)).setScale(0,
                                BigDecimal.ROUND_HALF_UP));
                    }
                    payJour.setTradeSn(callbacksanorderno);
                    return payService.updatePayJourStatus(payJour, new String[]{payPlatformConfig.getCallbackSuccess(), "fail"}, payChannelNew.getName());
                }
            }
        }
        return "fail";
    }

    protected boolean diffPayTime12Hour( String payTime, String merOrderNo ) {
        Date payTimeDate = DateFormatUtils.parse( payTime );
        // 计算当前时间与下单时间相差的小时数
        int hourDiff = ( int ) ( ( System.currentTimeMillis() - payTimeDate.getTime() ) / ( 1000 * 60 * 60 ) );
        // 超过48小时拒绝回调,可人工补单
        if ( hourDiff >= 48 ) {
            log.warn( "超过48小时拒绝回调 - orderNo:{};payTime:{}", merOrderNo, payTime );
            return true;
        }
        return false;
    }

    protected boolean verifyIP(Map<String, ?> requestMap, String realIp, PayPlatformNew payPlatformNew ) {
        if ( org.springframework.util.StringUtils.hasText( payPlatformNew.getPlatWhiteIpList() ) ) {
            Set<String> whiteIpSet = Sets.newHashSet( payPlatformNew.getPlatWhiteIpList().split( "," ) );
            if ( !whiteIpSet.contains( realIp ) && !"0:0:0:0:0:0:0:1".equals( realIp ) ) {
                log.warn( "请求ip非白名单:{};支付平台:{};request:{}", realIp, payPlatformNew.getName(),
                        JsonUtil.object2Json( requestMap ) );
                return true;
            }
        }
        return false;
    }
    
    
    //ASCII码排序
    protected static String assemblyUrl(Map<String, ?> bodyMap) {
        //字典顺序a----z
        StringBuilder sb = new StringBuilder();
        bodyMap.forEach((k, v) -> sb.append(k).append("=").append(v).append("&"));
        return sb.substring(0, sb.length() - 1);
    }

    //请求方式get,返回值类型Map.class
    public static Map<String, Object> getForObjectMap(SortedMap<String, String> params, String platPayUrl, String name) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(platPayUrl).queryParams(requestMap).build();
        Map<String, Object> resultMap = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            resultMap = restTemplate.getForObject(uriComponents.toUriString(), Map.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付下单结果:{}", JsonUtil.object2Json(resultMap));
        if (!CollectionUtils.isEmpty(resultMap)) {
            return resultMap;
        }
        log.warn(name + "支付下单失败");
        return null;
    }

    //请求方式get,返回值类型String.class
    public static Map<String, Object> getForObjectString(SortedMap<String, String> params, String platPayUrl, String name) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(platPayUrl).queryParams(requestMap).build();
        String res = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            res = restTemplate.getForObject(uriComponents.toUriString(), String.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付下单结果:{}", res);
        if (StringUtils.isNotBlank(res)) {
            Map<String, Object> resultMap = JsonUtil.json2Map(res);
            return resultMap;
        }
        log.warn(name + "支付下单失败");
        return null;
    }

    //请求方式get,返回值类型HTML
    public static String getForObjectHTML(SortedMap<String, String> params, String platPayUrl, String name) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(platPayUrl).queryParams(requestMap).build();
        String res = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            res = restTemplate.getForObject(uriComponents.toUriString(), String.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        return res;
    }

    //请求方式FORM_URLENCODED
    public static HttpEntity<MultiValueMap<String, String>> MFORM_URLENCODE(SortedMap<String, String> params) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(requestMap, httpHeaders);
        return httpEntity;
    }

    //请求方式FORM_DATA
    public static HttpEntity<MultiValueMap<String, String>> MFORM_DATA(SortedMap<String, String> params) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.MULTIPART_FORM_DATA);
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(requestMap, httpHeaders);
        return httpEntity;
    }

    //请求方式Json
    public static HttpEntity<Map<String, String>> MJSON(SortedMap<String, String> params) {
        HttpHeaders httpHeaders = new HttpHeaders();
        httpHeaders.setContentType(MediaType.APPLICATION_JSON);
        HttpEntity<Map<String, String>> httpEntity = new HttpEntity(params, httpHeaders);
        return httpEntity;
    }

    //请求方式From,返回值类型Map.class
    public static Map<String, Object> FromMap(String name, HttpEntity<MultiValueMap<String, String>> httpEntity, String platPayUrl, ReqPayRechargeNew reqPayRecharge) {
        Map<String, Object> resultMap = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            resultMap = restTemplate.execute( platPayUrl, HttpMethod.POST,
                    restTemplate.httpEntityCallback( httpEntity ), response -> {
                        InputStream bodyStream = response.getBody();
                        String      text;
                        try ( Reader reader = new InputStreamReader( bodyStream ) ) {
                            text = CharStreams.toString( reader );
                        }
                        return JsonUtil.json2Map( text );
                    } );
        } catch (Exception e) {
            reqPayRecharge.setFailReason(e.getMessage());
        }
        log.warn(name + "支付下单结果:{}", JsonUtil.object2Map(resultMap));
        if (!CollectionUtils.isEmpty(resultMap)) {
            return resultMap;
        }
        log.warn(name + "支付下单失败");
        return null;
    }

    //请求方式From,返回值类型String.class
    public static Map<String, Object> FromString(String name, HttpEntity<MultiValueMap<String, String>> httpEntity, String platPayUrl, ReqPayRechargeNew reqPayRecharge) {
        String res = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            res = restTemplate.postForObject(platPayUrl, httpEntity, String.class);
        } catch (Exception e) {
            reqPayRecharge.setFailReason(e.getMessage());
        }
        log.warn(name + "支付下单结果:{}", res);
        if (StringUtils.isNotBlank(res)) {
            Map<String, Object> resultMap = JsonUtil.json2Map(res);
            return resultMap;
        }
        log.warn(name + "支付下单失败");
        return null;
    }

    //请求方式From,返回值类型HTML
    public static String FromHTML(HttpEntity<MultiValueMap<String, String>> httpEntity, String platPayUrl, ReqPayRechargeNew reqPayRecharge) {
        String res = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            res = restTemplate.postForObject(platPayUrl, httpEntity, String.class);
        } catch (Exception e) {
            reqPayRecharge.setFailReason(e.getMessage());
        }
        return res;
    }

    //请求方式Json,返回值类型Map.class
    public static Map<String, Object> JsonMap(String name, HttpEntity<Map<String, String>> httpEntity, String platPayUrl, ReqPayRechargeNew reqPayRecharge) {
        Map<String, Object> resultMap = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            resultMap = restTemplate.execute( platPayUrl, HttpMethod.POST,
                    restTemplate.httpEntityCallback( httpEntity ), response -> {
                        InputStream bodyStream = response.getBody();
                        String      text;
                        try ( Reader reader = new InputStreamReader( bodyStream ) ) {
                            text = CharStreams.toString( reader );
                        }
                        return JsonUtil.json2Map( text );
                    } );
        } catch (Exception e) {
            reqPayRecharge.setFailReason(e.getMessage());
        }
        log.warn(name + "支付下单结果:{}", JsonUtil.object2Map(resultMap));
        if (!CollectionUtils.isEmpty(resultMap)) {
            return resultMap;
        }
        log.warn(name + "支付下单失败");
        return null;
    }

    //请求方式Json,返回值类型String.class
    public static Map<String, Object> JsonString(String name, HttpEntity<Map<String, String>> httpEntity, String platPayUrl, ReqPayRechargeNew reqPayRecharge) {
        String res = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            res = restTemplate.postForObject(platPayUrl, httpEntity, String.class);
        } catch (Exception e) {
            reqPayRecharge.setFailReason(e.getMessage());
        }
        log.warn(name + "支付下单结果:{}", res);
        if (StringUtils.isNotBlank(res)) {
            Map<String, Object> resultMap = JsonUtil.json2Map(res);
            return resultMap;
        }
        log.warn(name + "支付下单失败");
        return null;
    }

    //请求方式Json,返回值类型HTML
    public static String JsonHTML(HttpEntity<Map<String, String>> httpEntity, String platPayUrl, ReqPayRechargeNew reqPayRecharge) {
        String res = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            res = restTemplate.postForObject(platPayUrl, httpEntity, String.class);
        } catch (Exception e) {
            reqPayRecharge.setFailReason(e.getMessage());
        }
        return res;
    }

    //----------------------查询分隔线------------------------

    //请求方式get,返回值类型Map.class
    public Map<String, Object> QuerygetForObjectMap(SortedMap<String, String> params, String platQueryUrl, String name) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(platQueryUrl).queryParams(requestMap).build();
        Map<String, Object> resultMap = null;
        try {
            RestTemplate restTemplate = new RestTemplate();
            resultMap = restTemplate.getForObject(uriComponents.toUriString(), Map.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付查询结果:{}", JsonUtil.object2Json(resultMap));
        if (!CollectionUtils.isEmpty(resultMap)) {
            return resultMap;
        }
        log.warn(name + "支付查询失败");
        return null;
    }

    //请求方式get,返回值类型String.class
    public Map<String, Object> QuerygetForObjectString(SortedMap<String, String> params, String platQueryUrl, String name) {
        MultiValueMap<String, String> requestMap = new LinkedMultiValueMap<>();
        requestMap.setAll(params);
        UriComponents uriComponents = UriComponentsBuilder.fromUriString(platQueryUrl).queryParams(requestMap).build();
        String res = null;
        try {
            res = restTemplate.getForObject(uriComponents.toUriString(), String.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付查询结果:{}", res);
        if (StringUtils.isNotBlank(res)) {
            Map<String, Object> resultMap = JsonUtil.json2Map(res);
            return resultMap;
        }
        log.warn(name + "支付查询失败");
        return null;
    }

    //请求方式From,返回值类型Map.class
    public Map<String, Object> QueryFromMap(String name, HttpEntity<MultiValueMap<String, String>> httpEntity, String platQueryUrl) {
        Map<String, Object> resultMap = null;
        try {
            resultMap = restTemplate.execute( platQueryUrl, HttpMethod.POST,
                    restTemplate.httpEntityCallback( httpEntity ), response -> {
                        InputStream bodyStream = response.getBody();
                        String      text;
                        try ( Reader reader = new InputStreamReader( bodyStream ) ) {
                            text = CharStreams.toString( reader );
                        }
                        return JsonUtil.json2Map( text );
                    } );
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付查询结果:{}", JsonUtil.object2Map(resultMap));
        if (!CollectionUtils.isEmpty(resultMap)) {
            return resultMap;
        }
        log.warn(name + "支付查询失败");
        return null;
    }

    //请求方式From,返回值类型String.class
    public Map<String, Object> QueryFromString(String name, HttpEntity<MultiValueMap<String, String>> httpEntity, String platQueryUrl) {
        String res = null;
        try {
            res = restTemplate.postForObject(platQueryUrl, httpEntity, String.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付查询结果:{}", res);
        if (StringUtils.isNotBlank(res)) {
            Map<String, Object> resultMap = JsonUtil.json2Map(res);
            return resultMap;
        }
        log.warn(name + "支付查询失败");
        return null;
    }

    //请求方式Json,返回值类型Map.class
    public Map<String, Object> QueryJsonMap(String name, HttpEntity<Map<String, String>> httpEntity, String platQueryUrl) {
        Map<String, Object> resultMap = null;
        try {
            resultMap = restTemplate.execute( platQueryUrl, HttpMethod.POST,
                    restTemplate.httpEntityCallback( httpEntity ), response -> {
                        InputStream bodyStream = response.getBody();
                        String      text;
                        try ( Reader reader = new InputStreamReader( bodyStream ) ) {
                            text = CharStreams.toString( reader );
                        }
                        return JsonUtil.json2Map( text );
                    } );
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付查询结果:{}", JsonUtil.object2Map(resultMap));
        if (!CollectionUtils.isEmpty(resultMap)) {
            return resultMap;
        }
        log.warn(name + "支付查询失败");
        return null;
    }

    //请求方式Json,返回值类型String.class
    public Map<String, Object> QueryJsonString(String name, HttpEntity<Map<String, String>> httpEntity, String platQueryUrl) {
        String res = null;
        try {
            res = restTemplate.postForObject(platQueryUrl, httpEntity, String.class);
        } catch (Exception e) {
            log.error(e.getMessage(), e);
        }
        log.warn(name + "支付查询结果:{}", res);
        if (StringUtils.isNotBlank(res)) {
            Map<String, Object> resultMap = JsonUtil.json2Map(res);
            return resultMap;
        }
        log.warn(name + "支付查询失败");
        return null;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值