微信支付:小程序支付/扫码支付

如果你不相信努力和时光,那么成果就会是第一个选择辜负你的。不要去否定你自己的过去,也不要用你的过去牵扯你现在的努力和对未来的展望。不是因为拥有希望你才去努力,而是去努力了,你才有可能看到希望的光芒。微信支付:小程序支付/扫码支付,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

0.yml文件配置

微信支付:小程序支付/扫码支付

1.微信支付controller

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

/**
 * @description: 支付相关接口
 */
@RestController
@RequestMapping("/b2b")
public class B2bWXPayController {
    /**
     * 支付类
     */
    @Autowired
    private B2bPayUtil b2bPayUtil;


    /**
     * @Description: 立即付款
     **/
    @ApiOperation(value = "支付-开单立即付款", notes = "支付-立即付款")
    @PostMapping("/weChatPayOpenOrder")
    public Result<?> weChatPayOpenOrder(@Validated({ValidatedGroup.QueryGroup.class}) @RequestBody B2bPayRequest request) throws Exception {
        //.......业务代码

        //返回给结果信息给前端,去调用支付
        Map<String, String> result = b2bPayUtil.getPrePayInfo(request);
        if (result == null) {
            return Result.Error(ReturnCode.ERROR);
        } else {
            return Result.OK(result);
        }
    }

    /**
     * @Description: 扫码付款
     **/
    @ApiOperation(value = "支付-开单扫码付款", notes = "支付-开单扫码付款")
    @PostMapping("/weChatPayQRCodeOpenOrder")
    public Result<?> weChatPayQRCodeOpenOrder(@Validated({ValidatedGroup.QueryGroup.class}) @RequestBody B2bPayQRCodeRequest b2bPayQRCodeRequest) throws Exception {
        //.......业务代码
        
        //调用扫码支付工具,获取付款二维码连接
        Map<String, String> result = b2bPayUtil.getQRCodePrePayInfo(b2bPayQRCodeRequest);

        //将付款链接返回前端生成二维码
        if (result == null) {
            return Result.Error(ReturnCode.ERROR);
        } else {
            return Result.OK(result);
        }
    }
}

 2.支付类



import com.github.wxpay.sdk.WXPayUtil;
import com.google.common.collect.Maps;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.net.InetAddress;
import java.util.HashMap;
import java.util.Map;

import static com.github.wxpay.sdk.WXPayUtil.*;


/**
 * @description: 支付相关
 */
@Slf4j
@Component
public class B2bPayUtil {
    /**
     * 微信appId
     */
    @Value("${wechat.b2BAppid}")
    private String WECHAT_APPID;
    /**
     * 微信商户号
     */
    @Value("${wechat.machId}")
    private String WECHAT_MACH_ID;
    /**
     * key
     */
    @Value("${wechat.key}")
    private String WECHAT_key;
    /**
     * 支付类型,小程序用:JSAPI
     */
    @Value("${wechat.tradeType}")
    private String tradeType;

    /**
     * 支付类型,小程序用:NATIVE
     */
    @Value("${wechat.tradeTypeNative}")
    private String tradeTypeNative;
    /**
     * 统一下单地址
     */
    @Value("${wechat.unifiedOrderURrl}")
    private String UNIFIED_ORDER_URL;
    /**
     * 回调地址
     */
    @Value("${wechat.notifyUrlB2bOpenOrder}")
    private String notifyUrlB2bOpenOrder;


    /**
     * @Description: 微信支付工具类-小程序微信支付
     * @Param [request]
     * @Return: java.util.Map<java.lang.String, java.lang.String>
     **/
    public Map<String, String> getPrePayInfo(B2bPayRequest request) throws Exception {
        Map<String, String> map = Maps.newHashMap();
        //公众账号ID  (微信支付分配的公众账号ID)
        map.put("appid", WECHAT_APPID);
        //微信支付分配的商户号
        map.put("mch_id", WECHAT_MACH_ID);
        //随机字符串,长度要求在32位以内。
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        //商品描述
        map.put("body", request.getCommodityName());
        //订单码,唯一的:商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一
        map.put("out_trade_no", request.getOrderCode());
        //商品ID trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。
        map.put("product_id", request.getCommodityId());
        //订单实付金额,支付金额的单位为分
        //map.put("total_fee", request.getTotalFee().movePointRight(2).toString());
        map.put("total_fee", "1");
        //调用微信支付API的机器IP,也就是商户的机器地址
        map.put("spbill_create_ip", getLocalIp());
        //此处指定支付类型  JSAPI小程序支付  NATIVE扫码支付
        map.put("trade_type", tradeType);
        //异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
        map.put("notify_url", notifyUrlB2bOpenOrder);
        //用户openid
        map.put("openid", request.getOpenId());
        //微信统一下单URL
        String unifiedOrderURrl = UNIFIED_ORDER_URL;
        //生成签名 PAY_API_SECRET=微信支付相关API调用时使用的秘钥
        String sign = generateSignature(map, WECHAT_key);
        //参数配置 直接写成"sign"
        map.put("sign", sign);
        String xml = mapToXml(map);
        //请求微信统一下单接口
        String xmlStr = HttpUtils.httpRequest(unifiedOrderURrl, "POST", xml);
        //xml转map
        Map map1 = HttpUtils.doXMLParse(xmlStr);
        //返回状态码
        String return_code = (String) map1.get("return_code");
        //返回状态码
        String result_code = (String) map1.get("result_code");
        if ("SUCCESS".equalsIgnoreCase(return_code)) {
            if ("SUCCESS".equalsIgnoreCase(result_code)) {
                // 业务结果
                String prepay_id = (String) map1.get("prepay_id");//返回的预付单信息
                Map<String, String> payMap = new HashMap<>();
                payMap.put("appId", WECHAT_APPID);  // 参数配置
                payMap.put("timeStamp", getCurrentTimestamp() + "");  //时间
                payMap.put("nonceStr", generateNonceStr());  // 获取随机字符串
                payMap.put("signType", "MD5");
                payMap.put("package", "prepay_id=" + prepay_id);
                String paySign = generateSignature(payMap, WECHAT_key); //第二次生成签名
                payMap.put("paySign", paySign);
                payMap.put("prepayId", prepay_id);
                log.info("支付准备: " + map1);
                return payMap;   //返回给前端,让前端去调支付 ,完成后你去调支付查询接口,看支付结果,处理业务。
            } else {
                //打印失败日志
                log.error("支付失败: " + map1);
                return null;
            }
        } else {
            //打印失败日志
            log.error("支付失败: " + map1);
            return null;
        }
    }


    /**
     * @Description: 微信支付工具类-扫码支付
     * @Param [request]
     * @Return: java.util.Map<java.lang.String, java.lang.String>
     **/
    public Map<String, String> getQRCodePrePayInfo(B2bPayQRCodeRequest b2bPayQRCodeRequest) throws Exception {
        Map<String, String> map = Maps.newHashMap();
        //公众账号ID  (微信支付分配的公众账号ID)
        map.put("appid", WECHAT_APPID);
        //微信支付分配的商户号
        map.put("mch_id", WECHAT_MACH_ID);
        //随机字符串,长度要求在32位以内。
        map.put("nonce_str", WXPayUtil.generateNonceStr());
        //商品描述
        map.put("body", b2bPayQRCodeRequest.getCommodityName());
        //订单码,唯一的:商户系统内部订单号,要求32个字符内,只能是数字、大小写字母_-|* 且在同一个商户号下唯一
        map.put("out_trade_no", b2bPayQRCodeRequest.getOrderCode());
        //商品ID trade_type=NATIVE时,此参数必传。此参数为二维码中包含的商品ID,商户自行定义。
        map.put("product_id", b2bPayQRCodeRequest.getCommodityId());
        //订单实付金额,支付金额的单位为分
        //map.put("total_fee", request.getTotalFee().movePointRight(2).toString());
        map.put("total_fee", "1");
        //调用微信支付API的机器IP,也就是商户的机器地址
        map.put("spbill_create_ip", getLocalIp());
        //此处指定支付类型  JSAPI小程序支付  NATIVE扫码支付
        map.put("trade_type", tradeTypeNative);
        //异步接收微信支付结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。
        map.put("notify_url", notifyUrlB2bOpenOrder);
        //用户openid NATIVE不需要openId
        //map.put("openid", b2bPayQRCodeRequest.getOpenId());
        //微信统一下单URL
        String unifiedOrderURrl = UNIFIED_ORDER_URL;
        //生成签名 PAY_API_SECRET=微信支付相关API调用时使用的秘钥
        String sign = generateSignature(map, WECHAT_key);
        //参数配置 直接写成"sign"
        map.put("sign", sign);
        String xml = mapToXml(map);
        //请求微信统一下单接口
        String xmlStr = HttpUtils.httpRequest(unifiedOrderURrl, "POST", xml);
        //xml转map
        Map map1 = HttpUtils.doXMLParse(xmlStr);
        //返回状态码
        String return_code = (String) map1.get("return_code");
        //返回状态码
        String result_code = (String) map1.get("result_code");
        if ("SUCCESS".equalsIgnoreCase(return_code)) {
            if ("SUCCESS".equalsIgnoreCase(result_code)) {
                //业务结果
                String trade_type = (String) map1.get("trade_type");//交易类型
                String prepay_id = (String) map1.get("prepay_id");//预支付交易会话标识
                String code_url = (String) map1.get("code_url");//二维码链接

                Map<String, String> payMap = new HashMap<>();
                payMap.put("trade_type", trade_type);
                payMap.put("prepayId", prepay_id);
                payMap.put("code_url", code_url);
                log.info("支付准备: " + map1);
                return payMap;   //返回给前端,让前端去调支付 ,完成后你去调支付查询接口,看支付结果,处理业务。
            } else {
                //打印失败日志
                log.error("支付失败: " + map1);
                return null;
            }
        } else {
            //打印失败日志
            log.error("支付失败: " + map1);
            return null;
        }
    }

    /**
     * @Description: 获取当前机器的ip
     * @Param []
     * @Return: java.lang.String
     **/
    public static String getLocalIp() {
        InetAddress ia = null;
        String localIp = null;
        try {
            ia = InetAddress.getLocalHost();
            localIp = ia.getHostAddress();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return localIp;
    }
}

3. 微信通知回调接口

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.github.wxpay.sdk.WXPayUtil;
import com.github.xiaoymin.knife4j.annotations.ApiSupport;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.ServletInputStream;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@RestController
@RequestMapping("/b2b")
public class B2bWXPayBackController {
    /**
     * 微信appId
     */
    @Value("${wechat.b2BAppid}")
    private String WECHAT_APPID;
    /**
     * 微信商户号
     */
    @Value("${wechat.machId}")
    private String WECHAT_MACH_ID;
    /**
     * key
     */
    @Value("${wechat.key}")
    private String WECHAT_key;
    /**
     * 支付类型,小程序用:JSAPI
     */
    @Value("${wechat.tradeType}")
    private String tradeType;

    /**
     * 支付类型,小程序用:NATIVE
     */
    @Value("${wechat.tradeTypeNative}")
    private String tradeTypeNative;
    /**
     * 统一下单地址
     */
    @Value("${wechat.unifiedOrderURrl}")
    private String UNIFIED_ORDER_URL;
    /**
     * 回调地址
     */
    @Value("${wechat.notifyUrlB2bOpenOrder}")
    private String notifyUrlB2bOpenOrder;

    /**
     * @Description: 支付-开单支付回调接口
     * @Author: Yph
     * @Date: 2022/4/8
     * @Param [request, response]
     * @Return: com.xkr.lsos.common.Result<?>
     * 1......
     **/
    @ApiOperation(value = "支付-开单支付回调接口", notes = "支付-开单支付回调接口")
    @PostMapping("callBackUrlOpenOrder")
    public Result<?> callBackUrlOpenOrder(HttpServletRequest request, HttpServletResponse response) throws
            Exception {
        log.info("进入回调");
        Map orderMap = new HashMap();
        //1.获取微信支付接口的返回xml格式结果
        BufferedReader br = new BufferedReader(new InputStreamReader((ServletInputStream) request.getInputStream()));
        String line = null;
        StringBuilder sb = new StringBuilder();
        while ((line = br.readLine()) != null) {
            sb.append(line);
        }
        //1.1.响应结果的xml格式
        String notityXml = sb.toString();
        String resXml = "";
        Map resPrint = new HashMap();
        //2.将xml格式的返回结果,转换成map类型
        Map<String, String> resultMap = WXPayUtil.xmlToMap(notityXml);
        //3.获取业务结果
        String returnCode = (String) resultMap.get("return_code");
        //4.获取订单编号
        String orderCode = resultMap.get("out_trade_no");
        //5.获取微信签名
        String sign = resultMap.get("sign");
        //6.获取附加信息
        String info = resultMap.get("attach");
        resultMap.remove("sign");
        //7.重新签名
        String signNew = WXPayUtil.generateSignature(resultMap, WECHAT_key);
        //订单流水号
        String paymentSerialNumber = resultMap.get("transaction_id");

        //判断签名是否一致
        if (signNew.equals(sign)) {
            //根据订单码,获取到订单的用户,和订单id
            String orderId = b2bPurchaseOrderService.getOrderIdByOrderCode(orderCode);
            String userId = b2bPurchaseOrderService.getUserIdOrderId(orderCode);

            //判断付款业务是否成功
            if ("SUCCESS".equalsIgnoreCase(returnCode)) {
                resPrint.put("return_code", "SUCCESS");
                resPrint.put("return_msg", "ok");
                resXml = WXPayUtil.mapToXml(resPrint);
                orderMap.put("orderStatus", 1);
                orderMap.put("orderCode", orderCode);
                orderMap.put("transaction_id", paymentSerialNumber);
                orderMap.put("total_fee", resultMap.get("total_fee"));
                orderMap.put("cash_fee", resultMap.get("cash_fee"));
                orderMap.put("trade_type", resultMap.get("trade_type"));

                //自己的业务逻辑,支付结束后,根据支付成功或失败进行修改订单状态操作
                /**
				..................................
				**/
                //返回数据给微信
                String xml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
                log.info("===微信回调业务处理完成,告诉微信" + xml);
                response.reset();//(清空缓冲区)
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/xml; charset=utf-8");
                ServletOutputStream out = response.getOutputStream();
                out.print(xml);
                out.close();

                log.info("付款业务结果成功");
                return Result.OK(orderMap);
            } else {
                    //返回数据给微信
                    String xml = "<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>";
                    log.info("===微信回调业务处理完成,告诉微信" + xml);
                    response.reset();//(清空缓冲区)
                    response.setCharacterEncoding("UTF-8");
                    response.setContentType("application/xml; charset=utf-8");
                    ServletOutputStream out = response.getOutputStream();
                    out.print(xml);
                    out.close();
                return Result.Error(ReturnCode.WECHAT_CALLBACK_ERROR);//WxPayNotifyResponse.success("code:" + 9999 + "微信回调结果异常,异常原因:");
            }
        } else {
            //返回数据给微信
            String xml = "<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[签名失败]]></return_msg></xml>";
            log.info("===微信回调业务处理完成,告诉微信" + xml);
            response.reset();//(清空缓冲区)
            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/xml; charset=utf-8");
            ServletOutputStream out = response.getOutputStream();
            out.print(xml);
            out.close();
        }
        log.info("回调结束");
        return Result.OK();
    }

    /**
     * @Description: 获取当前机器的ip
     * @Return: java.lang.String
     **/
    public static String getLocalIp() {
        InetAddress ia = null;
        String localIp = null;
        try {
            ia = InetAddress.getLocalHost();
            localIp = ia.getHostAddress();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return localIp;
    }
}

4.Http请求工具类



import com.github.wxpay.sdk.WXPayConstants;
import lombok.extern.slf4j.Slf4j;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.util.EntityUtils;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.stream.StreamResult;
import java.io.*;
import java.net.ConnectException;
import java.net.HttpURLConnection;
import java.net.URL;
import java.security.SecureRandom;
import java.util.*;

import static com.github.wxpay.sdk.WXPayUtil.MD5;

/**
 * @description: http请求工具类
 */
@Slf4j
public class HttpUtils {

    private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";

    private static final Random RANDOM = new SecureRandom();

    /**
     * 获取随机字符串 Nonce Str
     *
     * @return String 随机字符串
     */
    public static String generateNonceStr() {
        char[] nonceChars = new char[32];
        for (int index = 0; index < nonceChars.length; ++index) {
            nonceChars[index] = SYMBOLS.charAt(RANDOM.nextInt(SYMBOLS.length()));
        }
        return new String(nonceChars);
    }


    /**
     * 生成签名
     *
     * @param data 待签名数据
     * @param key  API密钥
     * @return 签名
     */
    public static String generateSignature(final Map<String, String> data, String key) throws Exception {
        return generateSignature(data, key, WXPayConstants.SignType.MD5);  //MD5是常量 不想写常量可以直接写成"MD5"
    }

    /**
     * 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。
     *
     * @param data     待签名数据
     * @param key      API密钥
     * @param signType 签名方式
     * @return 签名
     */
    public static String generateSignature(final Map<String, String> data, String key, WXPayConstants.SignType signType) throws Exception {
        Set<String> keySet = data.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)) {   // FIELD_SIGN = sign
                continue;
            }
            if (data.get(k).trim().length() > 0){ // 参数值为空,则不参与签名{
                sb.append(k).append("=").append(data.get(k).trim()).append("&");
            }
        }
        sb.append("key=").append(key);
        if (WXPayConstants.SignType.MD5.equals(signType)) {
            return MD5(sb.toString()).toUpperCase();
        } else if (WXPayConstants.SignType.HMACSHA256.equals(signType)) {  //HMACSHA256常量 可以直接写成 "HMACSHA256"
            return HMACSHA256(sb.toString(), key);
        } else {
            throw new Exception(String.format("Invalid sign_type: %s", signType));
        }
    }

    /**
     * 生成 HMACSHA256
     *
     * @param data 待处理数据
     * @param key  密钥
     * @return 加密结果
     * @throws Exception
     */
    public static String HMACSHA256(String data, String key) throws Exception {
        Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
        SecretKeySpec secret_key = new SecretKeySpec(key.getBytes("UTF-8"), "HmacSHA256");
        sha256_HMAC.init(secret_key);
        byte[] array = sha256_HMAC.doFinal(data.getBytes("UTF-8"));
        StringBuilder sb = new StringBuilder();
        for (byte item : array) {
            sb.append(Integer.toHexString((item & 0xFF) | 0x100).substring(1, 3));
        }
        return sb.toString().toUpperCase();
    }


    /**
     * 将Map转换为XML格式的字符串
     *
     * @param data Map类型数据
     * @return XML格式的字符串
     * @throws Exception
     */
    public static String mapToXml(Map<String, String> data) throws Exception {
     /*   org.w3c.dom.Document document = WXPayXmlUtil.newDocument();
        org.w3c.dom.Element root = document.createElement("xml");
        document.appendChild(root);
        for (String key: data.keySet()) {
            String value = data.get(key);
            if (value == null) {
                value = "";
            }
            value = value.trim();
            org.w3c.dom.Element filed = document.createElement(key);
            filed.appendChild(document.createTextNode(value));
            root.appendChild(filed);
        }*/
        TransformerFactory tf = TransformerFactory.newInstance();
        Transformer transformer = tf.newTransformer();
        // DOMSource source = new DOMSource(document);
        transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        transformer.setOutputProperty(OutputKeys.INDENT, "yes");
        StringWriter writer = new StringWriter();
        StreamResult result = new StreamResult(writer);
        //  transformer.transform(source, result);
        String output = writer.getBuffer().toString(); //.replaceAll("\n|\r", "");
        try {
            writer.close();
        } catch (Exception ex) {
        }
        return output;
    }

    /**
     * 发送https post请求。
     *
     * @param requestUrl 请求的url(https://xxx.com)
     * @param postData   post传输的数据。
     * @return 请求成功返回请求内容,请求失败直接返回null。
     */
    public static String httpsPost(String requestUrl, String postData) {
        return httpsRequest2(requestUrl, "POST", postData);
    }


    /**
     * 解析xml,返回第一级元素键值对。如果第一级元素有子节点,则此节点的值是子节点的xml数据。
     *
     * @param strxml
     * @return
     * @throws
     * @throws IOException
     */
    public static Map doXMLParse(String strxml) throws Exception {
        if (null == strxml || "".equals(strxml)) {
            return null;
        }

        Map m = new HashMap();
        InputStream in = String2Inputstream(strxml);
        SAXBuilder builder = new SAXBuilder();
        Document doc = builder.build(in);
        Element root = doc.getRootElement();
        List list = root.getChildren();
        Iterator it = list.iterator();
        while (it.hasNext()) {
            Element e = (Element) it.next();
            String k = e.getName();
            String v = "";
            List children = e.getChildren();
            if (children.isEmpty()) {
                v = e.getTextNormalize();
            } else {
                v = getChildrenText(children);
            }

            m.put(k, v);
        }

        //关闭流
        in.close();

        return m;
    }

    public static InputStream String2Inputstream(String str) {
        return new ByteArrayInputStream(str.getBytes());
    }

    /**
     * 获取子结点的xml
     *
     * @param children
     * @return String
     */
    public static String getChildrenText(List children) {
        StringBuffer sb = new StringBuffer();
        if (!children.isEmpty()) {
            Iterator it = children.iterator();
            while (it.hasNext()) {
                Element e = (Element) it.next();
                String name = e.getName();
                String value = e.getTextNormalize();
                List list = e.getChildren();
                sb.append("<" + name + ">");
                if (!list.isEmpty()) {
                    sb.append(getChildrenText(list));
                }
                sb.append(value);
                sb.append("</" + name + ">");
            }
        }

        return sb.toString();
    }


    public static String httpRequest(String requestUrl, String requestMethod, String outputStr) {
        // 创建SSLContext
        StringBuffer buffer = null;
        try {
            URL url = new URL(requestUrl);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setRequestMethod(requestMethod);
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.connect();
            //往服务器端写内容
            if (null != outputStr) {
                OutputStream os = conn.getOutputStream();
                os.write(outputStr.getBytes("utf-8"));
                os.close();
            }
            // 读取服务器端返回的内容
            InputStream is = conn.getInputStream();
            InputStreamReader isr = new InputStreamReader(is, "utf-8");
            BufferedReader br = new BufferedReader(isr);
            buffer = new StringBuffer();
            String line = null;
            while ((line = br.readLine()) != null) {
                buffer.append(line);
            }
            br.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        return buffer.toString();
    }


    /**
     * 发送https请求,请求成功返回请求内容,请求失败直接返回空串。
     *
     * @param requestUrl 请求的url(https://xxx.com)
     * @param method     请求方法,一般有GET和POST方法。
     * @param outputStr  请求时附带的数据。
     * @return 请求成功返回请求内容,请求失败直接返回null。
     */
    public static String httpsRequest2(String requestUrl, String method, String outputStr) {
        HttpsURLConnection conn = null;
        OutputStream outputStream = null;
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        try {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = null;
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            URL url = new URL(requestUrl);
            conn = (HttpsURLConnection) url.openConnection();
            conn.setSSLSocketFactory(ssf);

            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(method);

            // 当outputStr不为null时向输出流写数据
            if (null != outputStr) {
                conn.setDoOutput(true);
                outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 从输入流读取返回内容
            inputStream = conn.getInputStream();
            inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
            bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null) {
                buffer.append(str);
            }

            return buffer.toString();
        } catch (ConnectException ce) {
            log.error("连接超时:{}", ce);
        } catch (Exception e) {
            log.error("https请求异常:{}", e);
        } finally {
            try {
                if (bufferedReader != null) {
                    bufferedReader.close();
                }
                if (inputStreamReader != null) {
                    inputStreamReader.close();
                }
                if (inputStream != null) {
                    inputStream.close();
                }
                if (conn != null) {
                    conn.disconnect();
                }
            } catch (IOException e) {
                log.warn(e.getLocalizedMessage(), e);
            }
        }

        return null;
    }
    private static final CloseableHttpClient httpclient = HttpClients.createDefault();
    public static String sendGet(String url) {

        HttpGet httpget = new HttpGet(url);
        CloseableHttpResponse response = null;
        try {
            response = httpclient.execute(httpget);
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        String result = null;
        try {
            HttpEntity entity = response.getEntity();
            if (entity != null) {
                result = EntityUtils.toString(entity);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                response.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return result;
    }

    /**
     * 获取当前时间戳,单位秒
     *
     * @return
     */
    public static long getCurrentTimestamp() {
        return System.currentTimeMillis() / 1000;
    }

}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/192805.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!