PC网站微信扫码支付,Native支付,“当前商户号暂不支持关联该类型的appid“,“签名错误,请检查后再试““springBoot 微信支付“

news/2024/5/9 23:58:53/文章来源:https://blog.csdn.net/xuhaogang3/article/details/120077811

springBoot 微信支付 PC网站微信扫码支付-Native支付

  • 一、采坑大合集
    • 1.当前商户号暂不支持关联该类型的appid
    • 2.签名错误,请检查后再试
  • 二、springboot集成微信支付Demo(老版本XML)
    • 1.官方SDK下载:[https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1](https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1)

最近项目需求集成支付功能,支付宝支付就不用多说了,官方文档Demo都很详细,仔细搞一下就可以。今天这篇文章主要讲集成PC网站集成Native支付,中间遇到了几个坑,这里给大家讲解下解决方法,相信一定会帮到你。
下面的支付Demo是老版本使用xml传输的格式,新版本使用的是json
api文档: https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_1

一、采坑大合集

1.当前商户号暂不支持关联该类型的appid

微信支付需要的三个重要参数 :1.mch_id 2.mch_api_key 3.app_id

  1. mch_id:商户id,这个去微信商户平台注册认证即可
  2. mch_api_key:注册成功后,进入商户平台->账户中心->API安全->设置API密钥
    在这里插入图片描述
  3. app_id:appId,才是接下来的重点,当你根据官方文档说明,去微信公众平台注册账号,并交完认证费300元后,获得了appId,然后再进行appId与mch_id绑定时,提示"当前商户号暂不支持关联该类型的appid"。去社区客服回答:“开放平台网站应用和第三方应用均不支持自助绑定,请悉知”
    解决办法: 在微信公众平台注册时,有四种选择:订阅号,服务号,小程序,企业微信。默认创建的应该是订阅号,但是Native支付只能绑定公众平台类型为服务号的appId,时间:2021/09/03,以后是否支持不一定。所以小伙伴们麻溜的去申请一个服务号类型的appId就可以了

2.签名错误,请检查后再试

  1. 签名错误问题,首先需要检查的是对照官方的api,看看哪些字段是必须的,是否有漏掉
  2. 字段无误后,发现还是错误,然后网上搜了一圈,说是什么必须按照某个顺序罗列字段才行,然后你就试了各种顺序还是错误。其实并不是你的字段错误,而真的是签名错误。
  3. 签名校验原理:将所有参数用api_key进行md5加密后生成sign,然后将sign随参数一起发送微信,微信端根据参数也用api_key进行md5加密后生成的sign与你参数的sign进行比较,相同的话就认证成功,不同就认证失败
    在这里插入图片描述
    在这里插入图片描述
    看上面两段代码有何不同,在生成sign的时候一定要将全部参数都加进去,不能在生成了sign后,还有别的参数添加,这样就会导致签名错误。所以只要保证sign在最后一个就好了

二、springboot集成微信支付Demo(老版本XML)

1.官方SDK下载:https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=11_1

在这里插入图片描述
好多工具类从sdk中copy即可,下面是我的集成demo,

统一下单以及回调接口
WXpay.java

private static String wxpayString="<form name=\"punchout_form\" method=\"post\" action=\"%s\">\n" +"<input type=\"hidden\" name=\"wxpayUrl\" value=\"%s\">\n" +"<input type=\"hidden\" name=\"id\" value=\"%s\">\n" +"<input type=\"submit\"  style=\"display:none\" >\n" +"</form>\n" +"<script>document.forms[0].submit();</script>\n";private static String  qrCodeString="/wxpay/qrCode";/*** 腾讯支付* @param product* @param order must 1.order_code 2.money 3.spbill_create_ip* @return* @throws Exception*/public static String goWXpay(BillingPackageVo product, BillingPackageOrderVo order) {String result="";try {//1.配置请求参数HashMap<String,String> reqData=new HashMap<>();reqData.put("appid", app_id);reqData.put("mch_id", mch_id);reqData.put("device_info", WEB);reqData.put("nonce_str", WXpayUtil.generateNonceStr());reqData.put("sign_type", SignType.MD5+"");//商品描述reqData.put("body", product.getBillingPackageName()+",服务期限"+product.getBillingPeriod()+"天,支持设备"+product.getMaxAccessClientNumber()+"个");//商品详情
//        reqData.put("detail", "微信支付测试");//订单号reqData.put("out_trade_no",order.getBillingPackageOrderCode());//订单总金额,单位为分reqData.put("total_fee",(long)(order.getOrderAmount()*100)+"");//终端IP,客户端IPreqData.put("spbill_create_ip",order.getSpbillCreateIp());//通知地址reqData.put("notify_url",notify_url);//交易类型reqData.put("trade_type", TradeType.NATIVE+"");//商品Id,trade_type=NATIVE时,此参数必传。reqData.put("product_id",order.getBillingPackageOrderCode());// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用reqData.put("attach",String.valueOf(null==order.getAccessClientId()?0:order.getAccessClientId()));reqData.put("sign", WXpayUtil.generateSignature(reqData, api_key, SignType.MD5));// 2.map转换成xmlString reqBody = WXpayUtil.mapToXml(reqData);log.info("订单号:"+order.getBillingPackageOrderCode()+",微信支付请求xml:"+reqBody);//3.发送支付请求String resXml= HttpClient.sendPostDataByXml(gatewayUrl, reqBody);log.info("订单号:"+order.getBillingPackageOrderCode()+",微信支付返回xml:"+resXml);//4.xml转换成mapMap<String, String> resMap = WXpayUtil.xmlToMap(resXml);String codeUrl=(SUCCESS.equals(resMap.get("return_code")) && SUCCESS.equals(resMap.get("result_code")))?resMap.get("code_url"):"";//5.组装返回值result=String.format(wxpayString,qrCodeString,codeUrl,order.getId());log.info("微信支付跳转信息:"+result);return result;}catch (Exception e){e.printStackTrace();log.info("微信支付请求失败,订单号:"+order.getBillingPackageOrderCode());return  result;}}/*** 微信支付回调* @param request* @return*/@ResponseBody@RequestMapping("/wechatNotify")public String weChatNotify(HttpServletRequest request) throws Exception {log.info("微信支付成功, 进入异步通知接口...");Map<String,String> returnMap=new HashMap<>();returnMap.put("return_code",SUCCESS);returnMap.put("return_msg","");Map<String, String> notifyMap = WXpayUtil.getNotifyParameter(request);  // 转换成mapif (!this.isPayResultNotifySignatureValid(notifyMap)) {// 签名错误,如果数据里没有sign字段,也认为是签名错误log.info("签名错误!!!!");returnMap.put("return_msg","sign not valid");return WXpayUtil.mapToXml(returnMap);}//订单号String orderCode = notifyMap.get("out_trade_no");String resultCode = notifyMap.get("result_code");//格式为yyyyMMddHHmmss,如2009年12月25日9点10分10秒表示为20091225091010。Long paymentTime =DataUtil.stringIntegerSpecialDate(notifyMap.get("time_end"));String paymentCode= notifyMap.get("transaction_id");// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用String attach= notifyMap.get("attach");//这里做其他业务操作returnMap.put("return_msg","");return WXpayUtil.mapToXml(returnMap);}/*** 判断支付结果通知中的sign是否有效** @param reqData 向wxpay post的请求数据* @return 签名是否有效* @throws Exception*/private boolean isPayResultNotifySignatureValid(Map<String, String> reqData) throws Exception {String signTypeInData = reqData.get(WXPayConstants.FIELD_SIGN_TYPE);SignType signType;if (signTypeInData == null) {signType = SignType.MD5;} else {signTypeInData = signTypeInData.trim();if (signTypeInData.length() == 0) {signType = SignType.MD5;}else if (WXPayConstants.MD5.equals(signTypeInData)) {signType = SignType.MD5;}else if (WXPayConstants.HMACSHA256.equals(signTypeInData)) {signType = SignType.HMACSHA256;}else {throw new Exception(String.format("Unsupported sign_type: %s", signTypeInData));}}return this.isSignatureValid(reqData,api_key, signType);}/*** 判断签名是否正确,必须包含sign字段,否则返回false。** @param data Map类型数据* @param key API密钥* @param signType 签名方式* @return 签名是否正确* @throws Exception*/public static boolean isSignatureValid(Map<String, String> data, String key, SignType signType) throws Exception {if (!data.containsKey(WXPayConstants.FIELD_SIGN) ) {return false;}String sign = data.get(WXPayConstants.FIELD_SIGN);return WXpayUtil.generateSignature(data, key, signType).equals(sign);}

WXpayUtil.java

private static final String SYMBOLS = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";private static final Random RANDOM = new SecureRandom();/*** XML格式字符串转换为Map** @param strXML XML字符串* @return XML数据转换后的Map* @throws Exception*/public static Map<String, String> xmlToMap(String strXML) throws Exception {try {Map<String, String> data = new HashMap<String, String>();DocumentBuilder documentBuilder = WXpayUtil.newDocumentBuilder();InputStream stream = new ByteArrayInputStream(strXML.getBytes("UTF-8"));org.w3c.dom.Document doc = documentBuilder.parse(stream);doc.getDocumentElement().normalize();NodeList nodeList = doc.getDocumentElement().getChildNodes();for (int idx = 0; idx < nodeList.getLength(); ++idx) {Node node = nodeList.item(idx);if (node.getNodeType() == Node.ELEMENT_NODE) {org.w3c.dom.Element element = (org.w3c.dom.Element) node;data.put(element.getNodeName(), element.getTextContent());}}try {stream.close();} catch (Exception ex) {ex.printStackTrace();}return data;} catch (Exception ex) {throw ex;}}/*** 将Map转换为XML格式的字符串** @param data Map类型数据* @return XML格式的字符串* @throws Exception*/public static String mapToXml(Map<String, String> data) throws Exception {org.w3c.dom.Document document = WXpayUtil.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) {ex.printStackTrace();}return output;}/*** 获取随机字符串 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);}/*** 生成签名. 注意,若含有sign_type字段,必须和signType参数保持一致。** @param data 待签名数据* @param key API密钥* @param signType 签名方式* @return 签名*/public static String generateSignature(final Map<String, String> data, String key, 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)) {continue;}if (data.get(k).trim().length() > 0) // 参数值为空,则不参与签名sb.append(k).append("=").append(data.get(k).trim()).append("&");}sb.append("key=").append(key);if (SignType.MD5.equals(signType)) {return MD5(sb.toString()).toUpperCase();}else if (SignType.HMACSHA256.equals(signType)) {return HMACSHA256(sb.toString(), key);}else {throw new Exception(String.format("Invalid sign_type: %s", signType));}}/*** 生成 MD5** @param data 待处理数据* @return MD5结果*/public static String MD5(String data) throws Exception {java.security.MessageDigest md = MessageDigest.getInstance("MD5");byte[] array = md.digest(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();}/*** 生成 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();}/*** 从request的inputStream中获取参数* @param request* @return* @throws Exception*/public  static Map<String, String> getNotifyParameter(HttpServletRequest request) throws Exception {InputStream inputStream = request.getInputStream();ByteArrayOutputStream outSteam = new ByteArrayOutputStream();byte[] buffer = new byte[1024];int length = 0;while ((length = inputStream.read(buffer)) != -1) {outSteam.write(buffer, 0, length);}outSteam.close();inputStream.close();// 获取微信调用我们notify_url的返回信息String resultXml = new String(outSteam.toByteArray(), "utf-8");log.info("微信异步通知返回xml:"+resultXml);Map<String, String> notifyMap = xmlToMap(resultXml);log.info("********************** 微信支付返回参数**********************");notifyMap.forEach((key, value) -> {log.info((key+":"+value));});log.info("********************************************");return notifyMap;}/*** 组装xml* @return* @throws ParserConfigurationException*/public static DocumentBuilder newDocumentBuilder() throws ParserConfigurationException {DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();documentBuilderFactory.setFeature("http://apache.org/xml/features/disallow-doctype-decl", true);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-general-entities", false);documentBuilderFactory.setFeature("http://xml.org/sax/features/external-parameter-entities", false);documentBuilderFactory.setFeature("http://apache.org/xml/features/nonvalidating/load-external-dtd", false);documentBuilderFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true);documentBuilderFactory.setXIncludeAware(false);documentBuilderFactory.setExpandEntityReferences(false);return documentBuilderFactory.newDocumentBuilder();}public static Document newDocument() throws ParserConfigurationException {return newDocumentBuilder().newDocument();}

WXPayConfig.java

@Configuration
public class WXPayConfig implements InitializingBean {// 公众账号IDpublic static String app_id;// 商户号public static String mch_id;// 商户的key【API密匙】public static String api_key;// 微信网关public static String gatewayUrl;// 服务器异步通知页面路径public static String notify_url;@Value("${wxpay.app_id}")private String getApp_id;@Value("${wxpay.mch_id}")private String getMch_id;@Value("${wxpay.api_key}")private String getApi_key;@Value("${wxpay.gatewayUrl}")private String getGatewayUrl;@Value("${project_address}")private String getProject_address;private String getNotify_url="/wxpay/wechatNotify";@Overridepublic void afterPropertiesSet() throws Exception {WXPayConfig.app_id=this.getApp_id;WXPayConfig.mch_id=this.getMch_id;WXPayConfig.api_key=this.getApi_key;WXPayConfig.gatewayUrl=this.getGatewayUrl;WXPayConfig.notify_url=this.getProject_address+this.getNotify_url;}
}

httpClient.java

 /*** post请求传输xml数据* @param url* @param xml* @return* @throws ClientProtocolException* @throws IOException*/public static String sendPostDataByXml(String url, String xml){log.info("url:"+url+",body:"+xml);String result = "";// 创建httpclient对象CloseableHttpClient httpClient = HttpClients.createDefault();// 创建post方式请求对象HttpPost httpPost = new HttpPost(url);// 设置参数到请求对象中StringEntity stringEntity = new StringEntity(xml, "UTF-8");httpPost.addHeader("Content-Type", "text/xml");httpPost.setEntity(stringEntity);// 执行请求操作,并拿到结果(同步阻塞)CloseableHttpResponse response = null;try {response = httpClient.execute(httpPost);// 获取结果实体// 判断网络连接状态码是否正常(0--200都数正常)if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {result = EntityUtils.toString(response.getEntity(), "UTF-8");log.info("xml请求返回结果:"+result);}} catch (Exception e) {e.printStackTrace();log.info("请求失败:"+url);}finally {// 释放链接try {response.close();httpClient.close();} catch (IOException e) {e.printStackTrace();}}return result;}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_725166.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端和算法实现:给网站上加上自己的水印(简单+复杂)

watermark插件的github地址&#xff1a;https://github.com/saucxs/watermark 有详细的使用步骤&#xff0c;可以参考&#xff0c;不会用请留言&#xff0c;感觉可以&#xff0c;请给个星星。 sau交流学习社区&#xff08;首发&#xff09;&#xff1a;https://www.mwcxs.top/p…

大型网站的架构设计与演进

大型网站之大&#xff0c;在于访问量和数据量同时都规模巨大&#xff0c;缺一不可。 1. 架构设计 大型网站中&#xff0c;最核心的功能是计算和存储。 存储&#xff1a;DataBase&#xff0c;计算&#xff1a;Application server&#xff0c;应用服务器完成业务功能和逻辑。如果…

网站莫名跳转,从百度谈什么是网站劫持?

今年2月份的时候&#xff0c;网上爆出了神马搜索劫持百度搜索流量事件&#xff0c;网友使用百度搜索进入的搜索结果页出来的却是神马搜索的结果页。 百度搜索流量事件是网站劫持的其中一种表现。网站劫持还会导致以下问题&#xff1a; 用户输入正常网址跳转到其它地址&#xff…

软工作业4:用户体验分析:以 “师路南通网站” 为例

一、目标&#xff1a;针对师路南通 &#xff0c;开展UX分析。 PS&#xff1a;对比另外2个学习网站&#xff1a;1. UMU学习平台 &#xff1b;2. 学生安全教育平台 基于实例分析&#xff0c;体会用户体验设计的 7 条准则。二、过程 &#xff08;一&#xff09;满意的地方 1.界面符…

使用阿里云域名 服务器 Tomcat7 阿里云免费证书 Http转Https以及Https表单提交问题 搭建网站全过程及其踩的坑

一天的时间才搭完累死了! 我在这里主要记录一下,每个修改的意义.如果只是修改而不知道修改的意义我觉得下次还是不会! 云服务器本地使用Http协议访问Tomcat不用输入端口号 这里我已经在阿里云上购买了服务器及域名,并且域名已经备案. 1.登录阿里云服务器. 2.在服务器中下载…

用Teleport Ultra下载网站全部页面 爬虫

测试case&#xff0c;就是把Commons-FileUpload 的API下载来 上网查的时候我才发现这是一个由很多页面组成的网站&#xff0c;下载起来很麻烦。怎么办呢&#xff1f;呵呵&#xff0c;一定是有办法的。Teleport Ultra这个工具就能帮我们搞定&#xff01;这是一个汉化绿版的迅雷下…

网站收集

1.http://msdn.itellyou.cn/ MSDN很多工具可以下载 将地址拷贝到迅雷下载即可 2.https://visualstudiogallery.msdn.microsoft.com/a1166718-a2d9-4a48-a5fd-504ff4ad1b65 isual Studio示例代码浏览器 免费Visual Studio示例代码浏览器为开发人员提供了一个在Visual Studio 20…

大型网站的标准

大型网站的标准 问题&#xff1a;什么样的网站才能算的上大型网站&#xff1f; 答&#xff1a; 用户访问量&#xff08;优酷&#xff0c;百度&#xff09;流量大&#xff08;优酷&#xff1a;流媒体服务器搭建&#xff0c;主要技术点在于带宽&#xff09;海量数据的检索问题&am…

python爬取内容乱码_Python爬取网站返回的内容为乱码解决方法

1、爬取某网站内容时&#xff0c;返回的结果为乱码&#xff0c;如图&#xff1a;2、写在前面的解释Requests会基于HTTP头部响应的编码做出有根据的推测&#xff0c;当访问r.text时&#xff0c;Requests会使用其推测的文本编码。查看网页返回的字符集类型&#xff1a;r.apparent…

关于php留言本网站的搭建

1.检查php&#xff0c;http服务是否安装 [rootlocalhost ~]# rpm -qa | grep http httpd-tools-2.4.6-40.el7.centos.x86_64 httpd-2.4.6-40.el7.centos.x86_64[rootlocalhost ~]# [rootlocalhost ~]# rpm -qa | grep http-bash: [rootlocalhost: 未找到命令 2.检查到没有安…

axure web组件下载_04网站设计关于axure原型预览文件访问慢的原因

01背景最近发现原来的原型预览访问速度超级慢&#xff0c;这一切貌似是最近调整了下Axure原型中的几个元件&#xff0c;上传之后&#xff0c;原本访问超级快的文件&#xff0c;变的超级超级慢。02原因分析过程1、首先直接从服务器角度找原因。自认为服务器可能是宽带不够&#…

css3网站代码 html5_HTML5和css3(一)

一、什么是 HTML5HTML5 的概念与定义是一个新版本的 HTML 语言&#xff0c;定义了新的标签、特性和属性拥有一个强大的技术集&#xff0c;这些技术集是指&#xff1a;HTML5 、CSS3 、javascript, 这也是广义上的 HTML5定义&#xff1a;HTML5 定义了 HTML 标准的最新版本&#x…

mysql投票网站_PHP+Mysql实现网站顶和踩投票功能实例

PHPMysql实现网站顶和踩投票功能实例&#xff0c;通过记录用户IP&#xff0c;判断用户的投票行为是否有效&#xff0c;该实例也可以扩展到投票系统中。首先我们在页面上放置“顶”和“踩”的按钮&#xff0c;即#dig_up和#dig_down&#xff0c;按钮上分别记录了投票的票数以及所…

openresty 交给php,openresty搭建网站防火墙

实现一个简单的防火墙,例如:当我提交一个 select * from 疑似 sql注入的参数时,则会直接被拦截下载waf配置:wget https://github.com/loveshell/ngx_lua_waf/archive/v0.7.2.tar.gz解压文件并将./config.lua,./init.lua,./waf.lua,./wafconf/*文件移动到你的项目目录例如在上篇…

学习MVC之租房网站(六)-用户登录和权限控制

在上一篇<学习MVC之租房网站&#xff08;五&#xff09;-权限、角色、用户管理>完成了权限、角色、用户的增删改查&#xff0c;现在将基于前面完成的内容&#xff0c;进行后台用户登录和权限控制功能的开发。 一、用户登录 用户登录涉及到密码的MD5校验、验证码、Session…

普通网站用双路cpu服务器,双路服务器怎么设置CPU

双路服务器怎么设置CPU 内容精选换一换云游戏场景&#xff0c;需要配置专业显卡。具体的场景典型配置如下&#xff1a;问题现象用户配置完成应用发布资源后&#xff0c;通过云堡垒机首次访问应用发布资源&#xff0c;不能正常访问。可能原因原因一&#xff1a;应用程序启动路径…

Web网站实现Google登录

一、打开谷歌控制台&#xff1a;https://console.developers.google.com/apis 二、点击创建凭据&#xff0c;如下图&#xff0c;填写项目地址等 三、创建好客户端ID和秘钥后&#xff0c;填写对应的项目网址和登录页网址 四、修改OAuth同意屏幕网站首页地址和隐私政策网址 五、代…

java如何截取网页数据_我想用java截取网站上的一条数据怎么截取不下来

展开全部苏宁的这个页面没有class"footer-bd"的&#xff0c;你换个试62616964757a686964616fe59b9ee7ad9431333337393562试&#xff0c;我试了下"footer-bom",这个就能拿到,你测试下&#xff1f;附测试代码&#xff1a;import java.io.BufferedReader;impo…

根据网站错误页面判断服务器和系统服务

判断容器 随便找一个网站&#xff0c;比方说这个&#xff1b;https://777kuu.com/ &#xff0c;在网址后面加上不可能存在的东西&#xff0c;比方说&#xff1a;https://777kuu.com/123.jpg ,让他暴露错误信息 像这样白底黑字加红字的就是windows 2008 R2 IIS7.5或IIS7.0 像…

《大型网站技术架构:核心原理与案例分析》读书笔记-高可用

万无一失&#xff1a;网站的高可用架构 1.网站可用性的度量 网站的页面能完整呈现在最终用户面前&#xff0c;需要经过很多个环节&#xff0c;任何一个环节出了 问题&#xff0c;都可能导致网站页面不可访问。DNS会被劫持、CDN服务可能会挂掉、网站服务 器可能会宕机、网络交换…