springboot 이 위 챗 앱 에 접속 하여 지불 하 는 방법

1.연극
1.1 위 챗 앱 결 제 를 완료 하고 업 체 서비스 센터 에 접속 하 십시오
1.2 자세 한 내용 은 위 챗 공식 문서 참조:https://open.weixin.qq.com/
2.application.yml 파일 의 설정 은 다음 과 같 습 니 다.

#      
tenpayconfig:
  #  APPID
  appId: asdfg12345
  #   
  mchId: 12345678
  #   key(API  )
  key: qwertyuiop
  #API      
  payUrl: https://api.mch.weixin.qq.com/pay/unifiedorder
  #API      
  queryUrl: https://api.mch.weixin.qq.com/pay/orderquery
  #package
  packageValue: Sign=WXPay
3.파일 에 대응 하 는 TenpayConfig 를 설정 합 니 다.lombok 이 통합 되 지 않 으 면 get/set 방법 을 자체 적 으로 생 성 하 십시오.

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import lombok.Data;

/** 
 * @Description:        
 * @Param: 
 * @return: 
 * @Author: zengXianKang
 * @Date: 2019/7/28 
 */
@Data
@Component
@ConfigurationProperties(prefix = "tenpayconfig")
public class TenpayConfig {
    //appId
    private String appId;
    //   
    private String mchId;
    //   key(API  )
    private String key;
    //API      
    private String payUrl;
    //API      
    private String queryUrl;
    //Sign=WXPay
    private String packageValue;
}    
3.1 TenPayVO 새로 만 들 기

import java.math.BigDecimal;
import lombok.Data;

/**
 * @description: TenPayVO
 * @author: zengXianKang
 * @create: 2019-07-28
 **/
@Data
public class TenPayVO {
    //     
    private String outTradeNo;
    //    
    private String resultCode;
    //    
    private String signType;
    //  
    private String sign;
    //    
    private String tradeType;
    //    
    private String tradeState;
    //   
    private String mchId;
    //    
    private String bankType;
    //    
    private BigDecimal totalFee;
    //  
    private String feeType;
    //       
    private String transactionId;
    //      
    private String timeEnd;
}
3.2 위 챗 결제 와 리 셋 메시지 가 xml 이기 때문에 먼저 maven 에 xstream 의 jar 의존 을 추가 합 니 다.

<!--xstream-->
<dependency>
    <groupId>com.thoughtworks.xstream</groupId>
    <artifactId>xstream</artifactId>
    <version>1.4.7</version>
</dependency>
3.3 TenPayUtils 도구 류,직접 가 져 가서 사용 하 세 요.사용 할 것 은 제 가 거의 다 썼 습 니 다.가 져 가도 괜 찮 습 니 다.

import com.github.pagehelper.util.StringUtil;
import com.huaku.ecom.common.config.TenpayConfig;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.converters.Converter;
import com.thoughtworks.xstream.converters.MarshallingContext;
import com.thoughtworks.xstream.converters.UnmarshallingContext;
import com.thoughtworks.xstream.io.HierarchicalStreamReader;
import com.thoughtworks.xstream.io.HierarchicalStreamWriter;
import com.thoughtworks.xstream.io.xml.DomDriver;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import javax.net.ssl.HttpsURLConnection;
import java.io.*;
import java.net.URL;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.Map.Entry;

/**
 * TenPayUtils
 * @author :zengXianKang
 */
@Component
public class TenPayUtils {
    private static TenPayUtils tenPayUtils;
    @Autowired
    private TenpayConfig tenpayConfig;

    @PostConstruct
    public void init(){
        tenPayUtils = this;
        tenPayUtils.tenpayConfig = this.tenpayConfig;
    }

    /**
     * @Description:       
     *
     * @Param: [paramsMap, charSetName]
     * @return: java.lang.String
     * @Author: zengXianKang
     * @Date: 2019/7/28 
     */
    public String createSign(SortedMap<String, Object> paramsMap, String charSetName) throws UnsupportedEncodingException,
            NoSuchAlgorithmException {
        StringBuffer buffer = new StringBuffer();
        //    ACCSII  (  )
        Set set = paramsMap.entrySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            Map.Entry entry = (Map.Entry) iterator.next();
            String key = (String) entry.getKey();
            String value = (String) entry.getValue();
            if(!key.equals("sign") && StringUtil.isNotEmpty(value)){
                buffer.append(key + "=" + value + "&");
            }
        }
        buffer.append("key=" + tenPayUtils.tenpayConfig.getKey());
        String sign = MDUtils.MD5EncodeForHex(buffer.toString(), charSetName).toUpperCase();
        return sign;
    }
    /**
     * @Description:           
     *
     * @Param: [paramsMap]
     * @return: java.lang.String
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    public static String tenPayXmlInfo(SortedMap<String, Object> paramsMap){
        StringBuffer buffer = new StringBuffer();
        if(paramsMap != null){
            buffer.append("<xml>");
            for(Map.Entry<String, Object> entry : paramsMap.entrySet()){
                buffer.append("<").append(entry.getKey()).append("><![CDATA[").append(entry.getValue()).append("]]></").append(entry.getKey()).append(">");
            }
            buffer.append("</xml>");
        }
        return buffer.toString();
    }

    /**
     * @Description:     URL
     *
     * @Param: [requestUrl, requestMethod, output]
     * @return: java.lang.String
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    public static String httpsRequest(String requestUrl, String requestMethod, String output) throws Exception {
        URL url = new URL(requestUrl);
        HttpsURLConnection connection = (HttpsURLConnection) url.openConnection();
        connection.setDoOutput(true);
        connection.setDoInput(true);
        connection.setUseCaches(false);
        connection.setRequestMethod(requestMethod);
        if(StringUtil.isNotEmpty(output)){
            OutputStream outputStream = connection.getOutputStream();
            outputStream.write(output.getBytes("UTF-8"));
            outputStream.close();
        }
        InputStream inputStream = connection.getInputStream();
        InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
        BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
        String str = null;
        StringBuffer buffer = new StringBuffer();
        while ((str = bufferedReader.readLine()) != null) {
            buffer.append(str);
        }
        bufferedReader.close();
        inputStreamReader.close();
        inputStream.close();
        connection.disconnect();
        return buffer.toString();
    }
    /**
     * @Description:   xml
     *
     * @Param: [xml, rootName, rowName]
     * @return: java.lang.Object
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    public static Object readXml(String xml, String rootName, String rowName){
        XStream xStream = new XStream(new DomDriver());
        xStream.alias(rootName, Map.class);
        xStream.registerConverter(new TenPayUtils.MapEntryConverter(rowName));
        Object object = xStream.fromXML(xml);
        return object;
    }
    /** 
     * @Description:    ,readXml  
     *
     * @Param: 
     * @return: 
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    public static class MapEntryConverter implements Converter {
        private String rowName;

        public MapEntryConverter(String rowName) {
            this.rowName = rowName;
        }

        public boolean canConvert(Class clazz) {
            return Map.class.isAssignableFrom(clazz) || LinkedHashMap.class.isAssignableFrom(clazz);
        }

        public void marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
            this._marshal(value, writer, context);
        }

        private void _marshal(Object value, HierarchicalStreamWriter writer, MarshallingContext context) {
            Iterator i$;
            Object object;
            if (value instanceof Map) {
                Map map = (Map) value;

                for (i$ = map.entrySet().iterator(); i$.hasNext(); writer.endNode()) {
                    object = i$.next();
                    Entry entry = (Entry) object;
                    Object _key = entry.getKey();
                    Object _value = entry.getValue();
                    writer.startNode(entry.getKey().toString());
                    if (_value instanceof Map) {
                        this._marshal(_value, writer, context);
                    } else if (_value instanceof List) {
                        this._marshal(_value, writer, context);
                    } else {
                        writer.setValue(entry.getValue().toString());
                    }
                }
            } else if (value instanceof List) {
                List list = (List) value;

                for (i$ = list.iterator(); i$.hasNext(); writer.endNode()) {
                    object = i$.next();
                    writer.startNode(this.rowName);
                    if (!(object instanceof Map) && !(object instanceof List)) {
                        writer.setValue(object.toString());
                    } else {
                        this._marshal(object, writer, context);
                    }
                }
            }

        }

        public Object unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
            return this._unmarshal(reader, context);
        }

        public Object _unmarshal(HierarchicalStreamReader reader, UnmarshallingContext context) {
            Map map = new HashMap();
            List list = new ArrayList();

            boolean isList;
            for (isList = false; reader.hasMoreChildren(); reader.moveUp()) {
                reader.moveDown();
                String nodeName = reader.getNodeName();
                if (reader.hasMoreChildren()) {
                    if (isList) {
                        list.add(this._unmarshal(reader, context));
                    } else if (map.containsKey(nodeName)) {
                        isList = true;
                        list.add(map.remove(nodeName));
                        list.add(this._unmarshal(reader, context));
                    } else if (this.rowName.equals(nodeName)) {
                        isList = true;
                        list.add(this._unmarshal(reader, context));
                    } else {
                        map.put(nodeName, this._unmarshal(reader, context));
                    }
                } else {
                    String value = reader.getValue();
                    if (isList) {
                        list.add(value);
                    } else if (map.containsKey(nodeName)) {
                        isList = true;
                        list.add(map.remove(nodeName));
                        list.add(value);
                    } else if (this.rowName.equals(nodeName)) {
                        isList = true;
                        list.add(value);
                    } else {
                        map.put(nodeName, value);
                    }
                }
            }
            return isList ? list : map;
        }
    }
}
4.위 챗 결제 요청
많은 전자상거래 프로젝트 에서 주문 서 를 저장 하고 충전 하 는 등 일련의 위 챗 결제 장면 이 있다.우 리 는 지불 을 시작 하여 전단 에 sdk 를 지불 해 야 합 니 다.이 박문 은 위 챗 에 지불 하 는 박문 입 니 다.알 리 페 이 가 지불 하 는 박문 도 저 는 이미 작 성 했 습 니 다.관심 이 있 으 면 제 박문 에 가서 보 세 요.도움 이 되 기 를 바 랍 니 다.
4.1 지급 청구

    /** 
     * @Description:     
     * @Param: [payType, outTradeNo, totalAmount]
     * @return: java.util.Map<java.lang.String,java.lang.String>
     * @Author: zengXianKang
     * @Date: 2019/7/28 
     */
    @Override
    public Map<String, String> payRequest(String payType, String outTradeNo, BigDecimal totalAmount) throws Exception {
        Map<String, String> map = new HashMap<String, String>();
        switch (PayTypeEnum.valueOf(payType)) {
            case TENPAY://   
                SortedMap<String, Object> paramsMap = new TreeMap<String, Object>();
                //    ID
                paramsMap.put("appid", tenpayConfig.getAppId());
                //   
                paramsMap.put("mch_id", tenpayConfig.getMchId());
                //     
                paramsMap.put("nonce_str", Convert.getUUID());
                //  
                paramsMap.put("body", "        ");
                //     (    )
                paramsMap.put("out_trade_no", outTradeNo);
                //    ,       
                double price = totalAmount.doubleValue();
                int totalFee = (int) (price * 100);
                paramsMap.put("total_fee", String.valueOf(totalFee));
                //    
                paramsMap.put("notify_url", ConstantInfo.TENPAY_ORDER_CALLBACK);
                //    
                paramsMap.put("trade_type", "APP");
                //   ip
                String spbillCreateIp = "";
                InetAddress inetAddress = InetAddress.getLocalHost();
                if (inetAddress != null) {
                    spbillCreateIp = inetAddress.getHostAddress();
                }
                paramsMap.put("spbill_create_ip", spbillCreateIp);
                TenPayUtils tenPayUtils = new TenPayUtils();
                //sign  
                String sign = tenPayUtils.createSign(paramsMap, "UTF-8");
                paramsMap.put("sign", sign);
                //    
                String requestXml = TenPayUtils.tenPayXmlInfo(paramsMap);
                //logger.info("        : " + requestXml);

                //      post  
                String tenPayPost = TenPayUtils.httpsRequest(tenpayConfig.getPayUrl(), "POST", requestXml);
                //    
                Map<String, String> tenPayMap = (Map<String, String>) TenPayUtils.readXml(tenPayPost, "xml", "");
                //       
                if (!tenPayMap.get("return_code").equals("SUCCESS")) {
                    logger.error("          : " + tenPayMap.get("return_msg"));
                    throw new RRException(AppWSConstant.RS_MSG_TENPAY_FALL);
                }
                //    
                if (!tenPayMap.get("result_code").equals("SUCCESS")) {
                    logger.error("err_code: " + tenPayMap.get("err_code"), "err_code_des: " + tenPayMap.get("err_code_des"));
                    throw new RRException(AppWSConstant.RS_MSG_TENPAY_FALL);
                }
                //APPID
                map.put("appid", tenPayMap.get("appid"));
                //   
                map.put("partnerid", tenPayMap.get("mch_id"));
                //       ID
                map.put("prepayid", tenPayMap.get("prepay_id"));
                //    
                map.put("package", tenpayConfig.getPackageValue());
                //     
                map.put("noncestr", tenPayMap.get("nonce_str"));
                //   
                map.put("timestamp", String.valueOf(new Date().getTime()).substring(0, 10));
                SortedMap<String, Object> signMap = new TreeMap<>(map);
                String newSign = tenPayUtils.createSign(signMap, "UTF-8");
                //  
                map.put("sign", newSign);
                break;
            default:
                break;
        }
        return map;
    }
4.1.1 ConstantInfo 의 내용 은

/**
 *   
 */
public class ConstantInfo {

    //           
    public static String TENPAY_ORDER_CALLBACK = "http://mall.gzmhyj.com:8085/huakuEComBuyer/pay/tenPayOrderCallBack";
}

4.2 주문서 위 챗 결제 리 턴
이 인 터 페 이 스 는 위 챗 비동기 리 셋 을 위 한 인터페이스 입 니 다.

    /** 
     * @Description:         
     *
     * @Param: [request]
     * @return: java.util.Map<java.lang.String,java.lang.String>
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    @RequestMapping(value = "/tenPayOrderCallBack", method = RequestMethod.POST)
    @ResponseBody
    public Map<String, String> tenPayOrderCallBack(HttpServletRequest request){
        Map<String, String> map = new HashMap<String, String>();
        try {
            TenPayVO tenPayVO = payService.tenPayCallBack(request);
            payService.tenPayOrderCallBack(tenPayVO);
            map.put("return_code", "SUCCESS");
            map.put("return_msg", "OK");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return map;
    }
4.2.1 pay Service 의 tenPayCallBack 은 리 셋 정 보 를 분석 하고 TenPayVO 를 연결 하 는 데 사용 된다.

    /**
     * @Description:      
     * @Param: [request]
     * @return: TenPayVO
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    @Override
    public TenPayVO tenPayCallBack(HttpServletRequest request) throws Exception {
        InputStream inputStream = request.getInputStream();
        StringBuffer resXml = new StringBuffer();
        BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
        String str;
        while ((str = bufferedReader.readLine()) != null) {
            resXml.append(str);
        }
        bufferedReader.close();
        inputStream.close();
        //logger.info("      : " + resXml);
        TenPayVO tenPayVO = this.tenPayCallBackInfo(resXml.toString(), "xml", "");
        return tenPayVO;
    }
4.2.2tenPayCallBackInfo,위 챗 결제 반환 결 과 를 분석 하고 TenPayVO 를 연결 하 는 데 사용

    /**
     * @Description:           
     * @Param: [xml, rootName, rowName]
     * @return: com.huaku.ecom.system.model.vo.TenPayVO
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    private TenPayVO tenPayCallBackInfo(String xml, String rootName, String rowName) throws Exception {
        Map<String, Object> resHashMap = (Map<String, Object>) TenPayUtils.readXml(xml, "xml", "");
        SortedMap<String, Object> resMap = new TreeMap<String, Object>(resHashMap);
        //       
        if (!resMap.get("return_code").equals("SUCCESS")) {
            logger.error("          : " + resMap.get("return_msg"));
            throw new RRException(AppWSConstant.RS_MSG_TENPAY_FALL);
        }
        //    
        if (!resMap.get("result_code").equals("SUCCESS")) {
            logger.error("err_code: " + resMap.get("err_code"), "err_code_des: " + resMap.get("err_code_des"));
            throw new RRException(AppWSConstant.RS_MSG_TENPAY_FALL);
        }
        TenPayUtils tenPayUtils = new TenPayUtils();
        //    
        String sign = tenPayUtils.createSign(resMap, "UTF-8");
        if (!sign.equals(resMap.get("sign"))) {
            logger.error("           ");
            throw new RRException(AppWSConstant.RS_MSG_TENPAY_FALL);
        }
        TenPayVO tenPayVO = new TenPayVO();
        //     
        tenPayVO.setOutTradeNo((String) resMap.get("out_trade_no"));
        //    
        tenPayVO.setResultCode((String) resMap.get("result_code"));
        //    
        tenPayVO.setSignType("ASCII");
        //  
        tenPayVO.setSign((String) resMap.get("sign"));
        //    
        tenPayVO.setTradeType("APP");
        //    
        tenPayVO.setTradeState((String) resMap.get("trade_state"));
        //   
        tenPayVO.setMchId((String) resMap.get("mch_id"));
        //    
        tenPayVO.setBankType((String) resMap.get("bank_type"));
        //    
        BigDecimal totalFee = new BigDecimal((String) resMap.get("total_fee"));
        totalFee = totalFee.divide(new BigDecimal(100));
        tenPayVO.setTotalFee(totalFee);
        //  
        if (resMap.containsKey("fee_type")) {
            tenPayVO.setFeeType((String) resMap.get("fee_type"));
        }
        //       
        tenPayVO.setTransactionId((String) resMap.get("transaction_id"));
        //      
        tenPayVO.setTimeEnd((String) resMap.get("time_end"));
        return tenPayVO;
    }
4.2.3 pay Service 의 tenPayOrderCallBack 은 주문 상 태 를 수정 하고 위 챗 결제 거래 표를 저장 하 는 등 자신의 업무 논리 에 사용 된다.

    /**
     * @Description:         
     * @Param: [tenPayVO]
     * @return: void
     * @Author: zengXianKang
     * @Date: 2019/7/28
     */
    @Override
    public void tenPayOrderCallBack(TenPayVO tenPayVO) throws Exception {
        if (tenPayVO != null && tenPayVO.getResultCode().equals("SUCCESS") && tenPayVO.getTradeState().equals("SUCCESS")) {
            //        ,     
            synchronized (tenPayVO.getOutTradeNo()) {
                TOrder order = orderMapper.getOneOrderByPayNo(tenPayVO.getOutTradeNo());
                if (order.getOrderStatus().equals(OrderStatusEnum.PENDING_PAYMENT.toString())) {
                    //         
                    BigDecimal payNumSum = this.getPayNumSumByPayNo(tenPayVO.getOutTradeNo());
                    String orderStatus = "";
                    //    ,      
                    if (payNumSum.compareTo(tenPayVO.getTotalFee()) != 0) {
                        logger.error("***   : " + tenPayVO.getOutTradeNo() + "***                     ***       :" + tenPayVO.getTotalFee() + " ***         :" + payNumSum + "***  :" + new Date());
                        //    ,           
                        orderStatus = OrderStatusEnum.ABNORMAL_PAYMENT_AMOUNT.toString();
                    } else {
                        //    ,        (   )
                        orderStatus = OrderStatusEnum.WAIT_FOR_DELIVERY.toString();
                    }
                    //      
                    int orderFlag = orderMapper.updatePayOrderStatusByPayNo(orderStatus, tenPayVO.getOutTradeNo());
                    //         
                    TTenpayTradeLog tenpayTradeLog = new TTenpayTradeLog();
                    tenpayTradeLog.setTradeLogId(Convert.createUniqueId(idWorker));
                    //    
                    tenpayTradeLog.setSignType(tenPayVO.getSignType());
                    //    
                    tenpayTradeLog.setTradeMode(tenPayVO.getTradeType());
                    //    
                    tenpayTradeLog.setTradeStatus(tenPayVO.getResultCode());
                    //   
                    tenpayTradeLog.setPartner(tenPayVO.getMchId());
                    //    
                    tenpayTradeLog.setBankType(tenPayVO.getBankType());
                    //    
                    tenpayTradeLog.setTotalFee(tenPayVO.getTotalFee());
                    //  
                    tenpayTradeLog.setFeeType(tenPayVO.getFeeType());
                    //       
                    tenpayTradeLog.setTransactionId(tenPayVO.getTransactionId());
                    //     
                    tenpayTradeLog.setOutTradeNo(tenPayVO.getOutTradeNo());
                    //      
                    tenpayTradeLog.setTimeEnd(tenPayVO.getTimeEnd());

                    int payFlag = tenpayTradeLogMapper.insertSelective(tenpayTradeLog);

                    //        ,    
                    if (!(orderFlag > 0 && payFlag == 1)) {
                        logger.error("          ");
                        throw new RRException(AppWSConstant.RS_MSG_TENPAY_FALL);
                    }
                } else {
                    logger.info("        ,     : " + tenPayVO.getOutTradeNo());
                    throw new RRException(AppWSConstant.RS_MSG_ORDER_PAY_ERROR);
                }
            }
        }
    }
4.3 정시 임 무 는 자발적으로 위 챗 결제 리 턴 을 조회 하고 보통 위 챗 에서 발생 하 는 비동기 리 턴 은 모두 무질서 하고 비정 기적 이기 때문에 일반 보험 은 자신의 정시 임 무 를 써 서 위 챗 결제 리 턴 을 주동 적 으로 조회 한다.

    /**
     *     :                   
     */
    @Scheduled(cron = "0 */15 * * * ?")
    public void initiativeOrderPayCallBack(){
        //          
        try {
            payService.initiativeOrderPayCallBack();
        } catch (Exception e) {
            logger.error("timer initiativeOrderPayCallBack Error.", e);
            e.printStackTrace();
        }
    }
4.3.1pay Service 의 initiative OrderPayCallBack 은 위 챗 결제 리 셋 과 리 셋 업무 논리 처 리 를 주동 적 으로 조회 하 는 데 사용 된다.

    /**
     *           
     *
     * @throws Exception
     */
    @Override
    public void initiativeOrderPayCallBack() throws Exception {
        //       orderStatus     
        List<Map<String, String>> payNoList = orderMapper.getPayNoByStatus(OrderStatusEnum.PENDING_PAYMENT.toString());
        for (Map<String, String> map : payNoList) {
            try {
                switch (PayTypeEnum.valueOf(map.get("payType"))) {
                    case TENPAY://   
                        TenPayVO tenPayVO = this.tenPayQueryCallBack(map.get("payNo"));
                        //      
                        this.tenPayOrderCallBack(tenPayVO);
                        break;
                    default:
                        break;
                }
            } catch (Exception e) {
                logger.error(e.getMessage());
                e.printStackTrace();
            }
        }
    }
4.3.2 pay Service 의 tenPayQuery CallBack 은 위 챗 결제 리 턴 을 주동 적 으로 조회 하고 TenPayVO 를 연결 하 는 데 사용 된다.

    /**
     * @Description:           
     * @Param: [payNo]
     * @return: com.huaku.ecom.system.model.vo.TenPayVO
     * @Author: zengXianKang
     * @Date: 2019/5/30
     */
    @Override
    public TenPayVO tenPayQueryCallBack(String payNo) throws Exception {
        SortedMap<String, Object> paramsMap = new TreeMap<String, Object>();
        //  APPID
        paramsMap.put("appid", tenpayConfig.getAppId());
        //   
        paramsMap.put("mch_id", tenpayConfig.getMchId());
        //     
        paramsMap.put("out_trade_no", payNo);
        //     
        paramsMap.put("nonce_str", Convert.getUUID());
        TenPayUtils tenPayUtils = new TenPayUtils();
        //  
        String sign = tenPayUtils.createSign(paramsMap, "UTF-8");
        paramsMap.put("sign", sign);
        //    
        String requestXml = TenPayUtils.tenPayXmlInfo(paramsMap);
        //      post  
        String tenQueryPost = TenPayUtils.httpsRequest(tenpayConfig.getQueryUrl(), "POST", requestXml);

        TenPayVO tenPayVO = this.tenPayCallBackInfo(tenQueryPost, "xml", "");
        return tenPayVO;
    }

springboot 이 위 챗 앱 에 접속 하여 결제 하 는 방법 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 springboot App 위 챗 결제 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기