微信小程序开发记录(二)

  • 微信小程序开发记录(二)
    • 配置消息推送--开发者服务器接收消息推送
      • 填写服务器配置
      • 验证服务器地址的有效性
          • Controller 微信小程序消息验证和配置
          • ServiceImpl 逻辑实现
      • 接收消息和事件,实现业务逻辑
          • Controller 微信小程序客服消息自动回复
          • ServiceImpl 逻辑实现

微信小程序开发记录(二)

前面通过code到微信服务器换取到了微信用户身份openid,将微信和已存在的平台账号关联起来。关联起来后,就可以做自己想做的操作了。但有时候需要小程序自动回复客户的问题,也就是微信的消息推送功能了。这里针对开发者服务器接收消息推送讲一讲,云函数接收消息推送就不多说了,自己去微信公众平台看API。

配置消息推送–开发者服务器接收消息推送

开发者需要按照如下步骤完成:

  1. 填写服务器配置
  2. 验证服务器地址的有效性
  3. 接收消息和事件,实现业务逻辑

填写服务器配置

登录小程序后台后,在「开发」-「开发设置」-「消息推送」中,管理员扫码启用消息服务,填写服务器地址(URL)、令牌(Token) 和 消息加密密钥(EncodingAESKey)等信息。

  1. URL: 开发者用来接收微信消息和事件的接口 URL。开发者所填写的URL 必须以 http:// 或 https:// 开头,分别支持80 端口和 443 端口。
  2. Token: 可由开发者可以任意填写,用作生成签名(该 Token 会和接口 URL 中包含的 Token 进行比对,从而验证安全性)。
  3. EncodingAESKey: 由开发者手动填写或随机生成,将用作消息体加解密密钥。
    同时,开发者可选择消息加解密方式:明文模式(默认)、兼容模式和安全模式。可以选择消息数据格式:XML 格式(默认)或 JSON 格式。
    在这里插入图片描述

验证服务器地址的有效性

开发者点击提交按钮,模式的选择与服务器配置在提交成功后都会立即生效。但是怎么提交成功呢??直接点提交就行了吗?并不是这样的,微信会验证开发者填写的URL是否正确,正确才能提交成功,保存设置。
微信服务器会发送一个GET请求到填写的服务器地址URL,就是上面填写的URL。这个请求就是用来验证开发者填写的URL是否正确的,如果不正确就无法提交成功。注意这个请求只和URL和Token有关。而EncodingAESKey和加密方式、数据格式是为后面服务器用来将加密后的原文进行解密准备的。

微信服务器将发送GET请求到填写的服务器地址URL上,GET请求携带参数如下表所示:

参数 描述
signature 微信加密签名,signature结合了开发者填写的token参数和请求中的timestamp参数、nonce参数。
timestamp 时间戳
nonce 随机数
echostr 随机字符串

实质上是微信对开发者填写的服务器地址URL发出GET请求,这个get请求带有四个参数,signature 是由微信结合开发者填写的Token、还有同时传过来的timestamp参数、nonce参数加密生成的一个字符串。开发者在填写的URL接口的逻辑中将自己填写的Token、还有接收到的timestamp参数、nonce参数这三个参数进行加密,加密后获取的字符串与signature 对比,一样的话就返回传过来的echostr参数,表示接入成功,否则返回空或其他,表示接入失败。微信接收到返回值,如果是echostr参数,那么就可以提交成功,保存消息推送配置。如果不是,则在Token(令牌)一行会显示“Token校验失败,请检查确认”。
在这里插入图片描述
加密/校验流程如下(来自微信公众平台API):

  1. 将token、timestamp、nonce三个参数进行字典序排序
  2. 将三个参数字符串拼接成一个字符串进行sha1加密
  3. 开发者获得加密后的字符串可与signature对比,若校验成功则原样返回echostr,表示接入成功,否则接入失败
    在这里插入图片描述
Controller 微信小程序消息验证和配置
 /*** 开放接口--微信小程序消息验证和配置* @return*/@ResponseBody@ApiOperation(value="微信小程序消息验证和配置", response = SimpleMessage.class)@RequestMapping(value = "/message" ,method = RequestMethod.GET)public String getProcess(HttpServletRequest request, HttpServletResponse response) {return weChatCustomerService.getProcess(request,response);}
ServiceImpl 逻辑实现
	import java.security.MessageDigest;/*** 微信小程序消息验证和配置* @param request* @param response* @return*/@Overridepublic String getProcess(HttpServletRequest request, HttpServletResponse response) {// 微信加密签名String signature = request.getParameter("signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");// 随机字符串String echostr = request.getParameter("echostr");// 通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败if (this.checkSignature(signature, timestamp, nonce)) {return echostr;}return null;}/*** 工具--通过检验signature对请求进行校验,若校验成功则原样返回echostr,表示接入成功,否则接入失败* @param signature* @param timestamp* @param nonce* @return*/private  boolean checkSignature(String signature, String timestamp, String nonce) {String[] arr = new String[] { messageToken, timestamp, nonce };//messageToken为常值,就是开发者自己填写的Token(令牌)// 将token、timestamp、nonce三个参数进行字典序排序Arrays.sort(arr);StringBuilder content = new StringBuilder();for (int i = 0; i < arr.length; i++) {content.append(arr[i]);}MessageDigest md = null;String tmpStr = null;try {md = MessageDigest.getInstance("SHA-1");// 将三个参数字符串拼接成一个字符串进行sha1加密byte[] digest = md.digest(content.toString().getBytes());tmpStr = byteToStr(digest);} catch (Exception e) {e.printStackTrace();}content = null;// 将sha1加密后的字符串可与signature对比,标识该请求来源于微信return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;}/*** 工具--将字节数组转换为十六进制字符串* @author 13* @param byteArray* @return*/private static String byteToStr(byte[] byteArray) {String strDigest = "";for (int i = 0; i < byteArray.length; i++) {strDigest += byteToHexStr(byteArray[i]);}return strDigest;}/*** 工具--将字节转换为十六进制字符串* @author 13* @param mByte* @return*/private static String byteToHexStr(byte mByte) {char[] Digit = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A','B', 'C', 'D', 'E', 'F' };char[] tempArr = new char[2];tempArr[0] = Digit[(mByte >>> 4) & 0X0F];tempArr[1] = Digit[mByte & 0X0F];String s = new String(tempArr);return s;}

接收消息和事件,实现业务逻辑

当验证服务器地址的有效性后,提交消息推送配置即成功。之后只要当用户操作引发事件推送时(如用户向小程序客服发送消息、或者进入会话等情况),微信服务器会将消息(或事件)的数据包以 POST 请求发送到开发者配置的 URL,开发者可以依据自身业务逻辑进行响应。这里请求的还是之前开发者配置的URL,只是由GET请求变成了POST请求。
微信服务器在将用户的消息发给开发者服务器地址后,微信服务器在五秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次。如果在调试中,发现用户无法收到响应的消息,可以检查是否消息处理超时。这里的重试三次,可能造成开发者服务器连续接到多次的相同请求,所以还需要进行消息的排重。关于重试的消息排重,有 msgid 的消息推荐使用 msgid 排重。事件类型消息推荐使用 FromUserName + CreateTime 排重。
服务器收到请求必须做出下述回复,这样微信服务器才不会对此作任何处理,并且不会发起重试,否则,将出现严重的错误提示。详见下面说明:

  1. 直接回复success(推荐方式)
  2. 直接回复空串(指字节长度为0的空字符串,而不是结构体中content字段的内容为空)
  3. 若接口文档有指定返回内容,应按文档说明返回

对于客服消息,一旦遇到以下情况,微信会在小程序会话中向用户下发系统提示“该小程序客服暂时无法提供服务,请稍后再试”:

  1. 开发者在5秒内未回复任何内容
  2. 开发者回复了异常数据
    如果开发者希望增强安全性,可以在开发者中心处开启消息加密,这样,用户发给小程序的消息以及小程序被动回复用户消息都会继续加密。
    看下图就知道我们选择了进行消息加密,安全模式,数据格式为xml。所以在验证服务器地址的有效性时,GET请求只和URL和Token有关。而EncodingAESKey和消息加密方式、数据格式都是为这时开发者服务器用来接收POST请求准备的。
    在这里插入图片描述

后面的代码很多,主要的是接受微信转过来的用户消息,将用户加密的信息进行解密,得到真实的消息,然后根据消息进行开发者自己的逻辑处理,我这里是根据用户的消息,自动回复图片。自动回复字符串很简单,只需要写在代码里,但是回复图片就不行了,微信要求先上传到微信,得到一个图片id,把id存在数据库中,要回复哪个图片就向要回复的消息模板里添加哪个图片的id。

Controller 微信小程序客服消息自动回复
/*** 开放接口--微信小程序客服消息自动回复* @return*/@ResponseBody@ApiOperation(value="微信小程序客服消息自动回复", response = SimpleMessage.class)@RequestMapping(value = "/message", method = RequestMethod.POST)public String replyMessage(@RequestBody String encrypt_msg , HttpServletRequest request, HttpServletResponse response) throws Exception {return weChatCustomerService.replyMessage(encrypt_msg,request,response);}
ServiceImpl 逻辑实现
	import org.dom4j.Document;import org.dom4j.DocumentHelper;import org.dom4j.Element;import com.alibaba.fastjson.JSONObject;/*** 小程序平台填写的43位EncodingAESKey*/@Value("${spring.wx.encodingAesKey}")private String EncodingAESKey;/*** 小程序平台消息推送填写的Token(令牌)*/@Value("${spring.wx.messageToken}")private String messageToken;/*** 小程序发送客服消息给用户请求地址*/@Value("${spring.wx.customerServiceSend}")private String customerServiceSend;@Autowiredprivate WeChatUtil weChatUtil;private static final String[] keyWord = {"1", "2", "3"};private static final String[] imageKeyWord = {"account.jpg", "androidEnterprise.png", "androidGovernment.png"};private static final List<String> keyList = Arrays.asList(keyWord);/*** 微信小程序客服消息自动回复* @param encrypt_msg 加密后的原文* @param request* @param response* @return* @throws Exception*/@Overridepublic String replyMessage(String encrypt_msg, HttpServletRequest request, HttpServletResponse response) throws Exception {//将加密后的原文进行解密重新封装String d=decryptMsg(request,encrypt_msg);Map<String, String> msg = new HashMap<>(6);//将解密后的xml消息转为MapDocument doc = DocumentHelper.parseText(d);Element root = doc.getRootElement();List<Element> list = root.elements();for (Element e : list) {msg.put(e.getName(), e.getText());}//获取消息排重结果Boolean r=weChatUtil.getDuplicateMessage(msg);if(r){return "SUCCESS";}logger.info("客服消息自动回复-----------------start");logger.info("客服消息自动回复msg-----------------{}",msg);String openId = msg.get("FromUserName");Map<String, String> contentMap = new HashMap<String, String>();//发送结果String result = "";String content = msg.get("Content") == null ? "" : msg.get("Content");//判断文字中是否包含关键词,若包含则提前自动回复boolean flag = false;int keyWord = 0;for (String string : keyList) {if (content.equals(string)) {flag = true;keyWord=Integer.parseInt(string);break;}}//若用户消息包含关键字则自动回复图片if (flag) {//关键字对应图片名称String imageName=imageKeyWord[keyWord-1];//此处根据自己的业务逻辑获取微信临时素材idString mediaId=weChatUtil.getImageId(imageName);//若没有活动临时素材则不进项操作if (StringUtils.isBlank(mediaId)) {// 此处将消息转发至人工客服,不然人工客服窗会没有消息Map<String, Object> tranMap = new HashMap<String, Object>();tranMap.put("ToUserName", msg.get("FromUserName"));tranMap.put("FromUserName", msg.get("ToUserName"));tranMap.put("CreateTime", msg.get("CreateTime"));tranMap.put("MsgType", "transfer_customer_service");String messageJson = JSONObject.toJSONString(tranMap);logger.info("消息转发至人工客服-----------------");return messageJson;}//有临时素材照片则自动回复临时素材图片media_id【 活动二维码或推广二维码等】contentMap.put("media_id", mediaId);result = sendMessage(openId, "image", contentMap);}//若用户消息没有包含关键字则自动回复操作提示if (!flag) {String text="回复1获取公众号二维码进行关注\n回复2获取Android二维码进行下载\n回复3获取ios二维码进行下载";contentMap.put("content", text);result = sendMessage(openId, "text", contentMap);//此处将消息转发至人工客服,不然人工客服窗会没有消息Map<String, Object> tranMap = new HashMap<String, Object>();tranMap.put("ToUserName", msg.get("FromUserName"));tranMap.put("FromUserName", msg.get("ToUserName"));tranMap.put("CreateTime", msg.get("CreateTime"));tranMap.put("MsgType", "transfer_customer_service");String messageJson = JSONObject.toJSONString(tranMap);logger.info("消息转发至人工客服-----------------");return messageJson;}logger.info("客服自动回复结果-----------------{}",result);return "SUCCESS";}/*** 工具--将加密后的原文进行解密重新封装* @param request* @param originalXml 原xml* @return    重新解密后的xml*/private  String  decryptMsg(HttpServletRequest request, String originalXml) {// 微信加密签名String msgSignature = request.getParameter("msg_signature");// 时间戳String timestamp = request.getParameter("timestamp");// 随机数String nonce = request.getParameter("nonce");try {WXBizMsgCrypt pc = new WXBizMsgCrypt(messageToken, EncodingAESKey,AppId);//检验消息的真实性,并且获取解密后的明文return pc.decryptMsg(msgSignature, timestamp, nonce, originalXml);} catch (AesException e) {e.printStackTrace();}return null;}/*** 工具--客服消息自动回复* @param opendId* @param msgtype* @param contentMap* @return* @throws UnsupportedEncodingException*/private String sendMessage(String opendId, String msgtype, Map<String, String> contentMap) throws Exception {Map<String, Object> replyMessageMap = new HashMap<String, Object>();replyMessageMap.put("touser", opendId);replyMessageMap.put("msgtype", msgtype);replyMessageMap.put(msgtype, contentMap);String messageJson = JSONObject.toJSONString(replyMessageMap);messageJson = new String(messageJson.getBytes(), "UTF-8");String url = customerServiceSend + weChatUtil.getToken();// 发送结果JSONObject obj= ConnectUtil.HttpPostWithJson(url, messageJson);String messageObj = JSONObject.toJSONString(obj);return  messageObj;}

消息加解密 WXBizMsgCrypt 这个当时我也是在网上找的,也不知道是谁写的,感谢作者分享。

/*** 对公众平台发送给公众账号的消息加解密示例代码.* * @copyright Copyright (c) 1998-2014 Tencent Inc.*/// ------------------------------------------------------------------------/*** 针对org.apache.commons.codec.binary.Base64,* 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)* 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi*/
package com.hanboard.educloud.utils.WeChatDecryptUtil;import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Random;import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;import org.apache.commons.codec.binary.Base64;/*** 提供接收和推送给公众平台消息的加解密接口(UTF8编码的字符串).* <ol>* 	<li>第三方回复加密消息给公众平台</li>* 	<li>第三方收到公众平台发送的消息,验证消息的安全性,并对消息进行解密。</li>* </ol>* 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案* <ol>* 	<li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:*      http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>* 	<li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>* 	<li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>* 	<li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>* </ol>*/
public class WXBizMsgCrypt {static Charset CHARSET = Charset.forName("utf-8");Base64 base64 = new Base64();byte[] aesKey;String token;String appId;/*** 构造函数* @param token 公众平台上,开发者设置的token* @param encodingAesKey 公众平台上,开发者设置的EncodingAESKey* @param appId 公众平台appid* * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息*/public WXBizMsgCrypt(String token, String encodingAesKey, String appId) throws AesException {if (encodingAesKey.length() != 43) {throw new AesException(AesException.IllegalAesKey);}this.token = token;this.appId = appId;aesKey = Base64.decodeBase64(encodingAesKey + "=");}// 生成4个字节的网络字节序byte[] getNetworkBytesOrder(int sourceNumber) {byte[] orderBytes = new byte[4];orderBytes[3] = (byte) (sourceNumber & 0xFF);orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);return orderBytes;}// 还原4个字节的网络字节序int recoverNetworkBytesOrder(byte[] orderBytes) {int sourceNumber = 0;for (int i = 0; i < 4; i++) {sourceNumber <<= 8;sourceNumber |= orderBytes[i] & 0xff;}return sourceNumber;}// 随机生成16位字符串String getRandomStr() {String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";Random random = new Random();StringBuffer sb = new StringBuffer();for (int i = 0; i < 16; i++) {int number = random.nextInt(base.length());sb.append(base.charAt(number));}return sb.toString();}/*** 对明文进行加密.* * @param text 需要加密的明文* @return 加密后base64编码的字符串* @throws AesException aes加密失败*/String encrypt(String randomStr, String text) throws AesException {ByteGroup byteCollector = new ByteGroup();byte[] randomStrBytes = randomStr.getBytes(CHARSET);byte[] textBytes = text.getBytes(CHARSET);byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);byte[] appidBytes = appId.getBytes(CHARSET);// randomStr + networkBytesOrder + text + appidbyteCollector.addBytes(randomStrBytes);byteCollector.addBytes(networkBytesOrder);byteCollector.addBytes(textBytes);byteCollector.addBytes(appidBytes);// ... + pad: 使用自定义的填充方式对明文进行补位填充byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());byteCollector.addBytes(padBytes);// 获得最终的字节流, 未加密byte[] unencrypted = byteCollector.toBytes();try {// 设置加密模式为AES的CBC模式Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);// 加密byte[] encrypted = cipher.doFinal(unencrypted);// 使用BASE64对加密后的字符串进行编码String base64Encrypted = base64.encodeToString(encrypted);return base64Encrypted;} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.EncryptAESError);}}/*** 对密文进行解密.* * @param text 需要解密的密文* @return 解密得到的明文* @throws AesException aes解密失败*/String decrypt(String text) throws AesException {byte[] original;try {// 设置解密模式为AES的CBC模式Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);// 使用BASE64对密文进行解码byte[] encrypted = Base64.decodeBase64(text);// 解密original = cipher.doFinal(encrypted);} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.DecryptAESError);}String xmlContent, from_appid;try {// 去除补位字符byte[] bytes = PKCS7Encoder.decode(original);// 分离16位随机字符串,网络字节序和AppIdbyte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);int xmlLength = recoverNetworkBytesOrder(networkOrder);xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);from_appid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),CHARSET);} catch (Exception e) {e.printStackTrace();throw new AesException(AesException.IllegalBuffer);}// appid不相同的情况if (!from_appid.equals(appId)) {throw new AesException(AesException.ValidateAppidError);}return xmlContent;}/*** 将公众平台回复用户的消息加密打包.* <ol>* 	<li>对要发送的消息进行AES-CBC加密</li>* 	<li>生成安全签名</li>* 	<li>将消息密文和安全签名打包成xml格式</li>* </ol>* * @param replyMsg 公众平台待回复用户的消息,xml格式的字符串* @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp* @param nonce 随机串,可以自己生成,也可以用URL参数的nonce* * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息*/public String encryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {// 加密String encrypt = encrypt(getRandomStr(), replyMsg);// 生成安全签名if (timeStamp == "") {timeStamp = Long.toString(System.currentTimeMillis());}String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);// System.out.println("发送给平台的签名是: " + signature[1].toString());// 生成发送的xmlString result = XMLParse.generate(encrypt, signature, timeStamp, nonce);return result;}/*** 检验消息的真实性,并且获取解密后的明文.* <ol>* 	<li>利用收到的密文生成安全签名,进行签名验证</li>* 	<li>若验证通过,则提取xml中的加密消息</li>* 	<li>对消息进行解密</li>* </ol>* * @param msgSignature 签名串,对应URL参数的msg_signature* @param timeStamp 时间戳,对应URL参数的timestamp* @param nonce 随机串,对应URL参数的nonce* @param postData 密文,对应POST请求的数据* * @return 解密后的原文* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息*/public String decryptMsg(String msgSignature, String timeStamp, String nonce, String postData)throws AesException {// 密钥,公众账号的app secret// 提取密文Object[] encrypt = XMLParse.extract(postData);// 验证安全签名String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());// 和URL中的签名比较是否相等// System.out.println("第三方收到URL中的签名:" + msg_sign);// System.out.println("第三方校验签名:" + signature);if (!signature.equals(msgSignature)) {throw new AesException(AesException.ValidateSignatureError);}// 解密String result = decrypt(encrypt[1].toString());return result;}/*** 验证URL* @param msgSignature 签名串,对应URL参数的msg_signature* @param timeStamp 时间戳,对应URL参数的timestamp* @param nonce 随机串,对应URL参数的nonce* @param echoStr 随机串,对应URL参数的echostr* * @return 解密之后的echostr* @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息*/public String verifyUrl(String msgSignature, String timeStamp, String nonce, String echoStr)throws AesException {String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);if (!signature.equals(msgSignature)) {throw new AesException(AesException.ValidateSignatureError);}String result = decrypt(echoStr);return result;}}

获取消息排重结果 weChatUtil 这里用的是redis进行记录

	@Value("${spring.wx.redisFolderName}")private String redisFolderName;//自己随便编一个用于redis命名/*** redis图片分层文件夹名称*/private static final String weChatImageId="weChat_image_id:";/*** redis Token分层文件夹名称*/private static final String weChatAccessToken="weChat_access_token";/*** redis 消息排重分层文件夹名称*/private static final String duplicateMessage="duplicate_message:";@Autowiredprivate RedisTemplate redisTemplate;/*** 方法--获取消息排重结果* @param msg* @return*/public Boolean getDuplicateMessage(Map<String, String> msg){String FromUserName=msg.get("FromUserName");String CreateTime=msg.get("CreateTime");String MsgId=msg.get("MsgId");String value=FromUserName+CreateTime;//获取duplicateMessage,进行消息排重Boolean hasKey=redisTemplate.hasKey(redisFolderName+duplicateMessage+MsgId);if(hasKey){//有参数String value1=(String)redisTemplate.opsForValue().get(redisFolderName+duplicateMessage+MsgId);if(value1.equals(value)){return true;}return false;}else {//redis新增duplicateMessageredisTemplate.opsForValue().set(redisFolderName+duplicateMessage+MsgId, value, 20, TimeUnit.SECONDS);return false;}}/*** 方法--获取media_id* @return  String*/public String getImageId(String imageName){//获取接口访问令牌String media_id = null;Boolean hasKey=redisTemplate.hasKey(redisFolderName+weChatImageId+imageName);if(hasKey){//有参数media_id=(String)redisTemplate.opsForValue().get(redisFolderName+weChatImageId+imageName);}else {try{//无参数-访问第三方接口重新获取media_id= uploadFileToWeChat(imageName);//redis新增WeChatImageIdredisTemplate.opsForValue().set(redisFolderName+weChatImageId+imageName, media_id, 2, TimeUnit.DAYS);}catch (Exception e){logger.error("远程获取微信访问令牌失败!");}}return media_id;}/*** 工具--微信接口临时素材上传* @return  String* @throws Exception*/private String uploadFileToWeChat(String imageName) throws Exception {String result = null;InputStream inputStream=this.getClass().getResourceAsStream("/template/"+imageName);String property = System.getProperty("user.dir");//在根目录生成一个文件File file = new File(property+imageName);logger.info(property+imageName);//将流转成File格式FileUtils.copyInputStreamToFile(inputStream, file);if (!file.exists() || !file.isFile()) {logger.info("文件不存在");throw new IOException("文件不存在");}String url = uploadTempMedia + getToken() + "&type=image";URL urlObj = new URL(url);HttpURLConnection con = (HttpURLConnection) urlObj.openConnection();con.setRequestMethod("POST");con.setDoInput(true);con.setDoOutput(true);con.setUseCaches(false);// 设置请求头信息con.setRequestProperty("Connection", "Keep-Alive");con.setRequestProperty("Charset", "UTF-8");// 设置边界String BOUNDARY = "----------" + System.currentTimeMillis();con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + BOUNDARY);// 请求正文信息// 第一部分:StringBuilder sb = new StringBuilder();sb.append("--"); // 必须多两道线sb.append(BOUNDARY);sb.append("\r\n");sb.append("Content-Disposition: form-data;name=\"media\";filename=\"" + file.getName() + "\"\r\n");sb.append("Content-Type:application/octet-stream\r\n\r\n");byte[] head = sb.toString().getBytes("utf-8");// 获得输出流OutputStream out = new DataOutputStream(con.getOutputStream());// 输出表头out.write(head);// 文件正文部分// 把文件已流文件的方式 推入到url中DataInputStream in = new DataInputStream(new FileInputStream(file));int bytes = 0;byte[] bufferOut = new byte[1024];while ((bytes = in.read(bufferOut)) != -1) {out.write(bufferOut, 0, bytes);}in.close();// 结尾部分byte[] foot = ("\r\n--" + BOUNDARY + "--\r\n").getBytes("UTF-8");// 定义最后数据分隔线out.write(foot);out.flush();out.close();StringBuffer buffer = new StringBuffer();BufferedReader reader = null;try {// 定义BufferedReader输入流来读取URL的响应reader = new BufferedReader(new InputStreamReader(con.getInputStream()));String line = null;while ((line = reader.readLine()) != null) {buffer.append(line);}if (result == null) {result = buffer.toString();}} catch (IOException e) {System.out.println("发送POST请求出现异常! {}");e.printStackTrace();throw new IOException("数据读取异常");} finally {if (reader != null) {reader.close();}}// 获取到返回HTTP结果Map<String, Object> map = JSONObject.parseObject(result, Map.class);if (map.containsKey("media_id")) {return map.get("media_id").toString();}logger.error("小程序上传临时素材出错,返回信息为----------{}",result);return null;}
查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. yolo对象检测算法

    如何利用神经网络进行对象定位 定位:判断物体在图片中的具体位置。(bx,by,bh,bw)被检测对象的边界框的参数化表示。 定义目标标签y **损失函数:**用的平方误差pc指是否有目标,有的话,pc=1 特征点检测x:图片;y:特征点的坐标 如何通过卷积网络进行对象检测 基于滑动窗口的目…...

    2024/5/9 0:30:09
  2. jQuery学习第二天——jQuery的常见效果(上)

    主要学习了以下几种: 1.隐藏/显示 2.淡入淡出 3.滑动 4.动画 5.stop() 6.Callback() 7.Chaining() 先学习了前四类,在这里总结一下: 隐藏/显示: 主要用到hide()和show()两个方法。 实例1:通过两个按钮来实现显示和隐藏 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML …...

    2024/5/9 0:07:06
  3. Week13 作业

    A - TT 的神秘任务1(必做) 这一天,TT 遇到了一个神秘人。 神秘人给了两个数字,分别表示 n 和 k,并要求 TT 给出 k 个奇偶性相同的正整数,使得其和等于 n。 例如 n = 10,k = 3,答案可以为 [4 2 4]。 TT 觉得这个任务太简单了,不愿意做,你能帮他完成吗? 本题是SPJ Inp…...

    2024/5/7 15:12:35
  4. pycharts简单使用

    pyecharts 是一个用于生成 Echarts 图表的类库。 Echarts 是百度开源的一个数据可视化 JS 库。可以生成很多效果很棒的图表。 pycharts文档 |分割| echarts官网 本文主要介绍pycharts的简单使用安装# 安装 1.0.x 以上版本 (需要python3.6及以上) $ pip install pyecharts -U…...

    2024/5/8 20:44:37
  5. 浅谈微信内置浏览器调用支付宝支付完整教程《2》

    话不多说直接上代码 1、 支付宝文档底部下载demo, 2、demo里有ap.js,pay.htm,post.htm等,pay.htm是支付宝为提供的demo中间页,用框架构造项目的需要自己改造下,在跳转中间页面的时候,需要用ap.js的方法 /** **创建订单接口,这个接口后台会返回一个form表单的字符串 *关注…...

    2024/5/8 12:38:02
  6. ES6(Module模块化)

    模块化ES6的模块化的基本规则或特点:1:每一个模块只加载一次, 每一个JS只执行一次, 如果下次再去加载同目录下同文件,直接从内存中读取。 一个模块就是一个单例,或者说就是一个对象;2:每一个模块内声明的变量都是局部变量, 不会污染全局作用域;3:模块内部的变量或者…...

    2024/4/24 10:43:28
  7. RSA前端加密(vue项目)

    1,安装插件npm install jsencrypt --save2,安装成功之后,在main.js文件引入import JSEncrypt from jsencrypt;//引入模块 Vue.prototype.$jsEncrypt = JSEncrypt;//配置全局变量3,在需要使用的组件(本文以登录页面对账号和密码进行了加密)getPublicKey({}).then((res)=&g…...

    2024/5/8 20:54:38
  8. 手写源码之路(六):Mybatis框架篇(5)执行篇

    手写源码之路(六):Mybatis框架篇(5)执行篇ExecutorDataSourceFactoryTransactionFactory 终于来到最后的重头戏了,执行方法返回结果,首先在执行之前,mybatis需要构建执行环境,包括执行器,数据源工厂,事务工厂等对象,执行器负责执行数据库的增删改查,数据源工厂负责…...

    2024/5/8 11:50:06
  9. 分布式电商项目二十九:商品服务的后台页面分组

    renren-fast-vue前端代码.zip之后对该页面功能的实现,只编写后端部分,按照给出的接口文档进行编写。前端资源直接下载放入renren-fast-vue中即可立即下载商品服务的后台页面分组 之后对该页面功能的实现,只编写后端部分,按照给出的接口文档进行编写。前端资源直接下载放入r…...

    2024/5/8 15:33:35
  10. AN OPTIMIZATION VIEW ON DYNAMIC ROUTING BETWEEN CAPSULES 翻译

    说实话,这篇文章没有怎么看懂,不过知道这篇文章对2017年所提出的胶囊网络的路由协议进行了细致的讲解,同时该作者提出了一种改进的路由协议。具体的看论文。摘要尽管最近在(Sabour et al。,2017)中提出了动态路由程序的有效性,但我们仍然缺乏启发式方法及其含义的标准形…...

    2024/4/27 23:47:28
  11. ps快速抠头发-庞姿姿

    今天分享的是ps快速抠头发。ps操作过程中抠图必不可少,而且抠图对象不同使用的方法也不同,相比较头发丝算是比较难操作的一种了,有粉丝私信问我ps快速抠头发,下面就来分享一下方法。跟着我操作一遍吧~首先现在需要去除的区域。在工具栏「快速选择工具」快捷键(W) 在主菜单…...

    2024/5/8 23:03:27
  12. Two Sum(C++两数之和)

    解题思路:(1)使用组合,可惜耗时比较久,笑哭class Solution { public:vector<int> twoSum(vector<int>& nums, int target) {vector<int> v={0,0};combination(v, nums, target, 0, 0, 2);return v;}int combination(vector<int> &v, vect…...

    2024/5/7 7:41:22
  13. C#.水仙花数

    static void Main(string[] args){//水仙花数,百位的立方+十位的立方+个位的立方=原数//判断100-999之间的水仙花数for (int i = 100; i <= 999; i++){int iHundred = i / 100;int iTen = i / 10 % 10;int iUnit = i % 10;if (iHundred * iHundred * iHundred + iTen * iTe…...

    2024/5/8 13:55:08
  14. php策略模式

    <?php //策略模式interface Love{function love_me();}class Tiger implements Love{function love_me(){echo 给老娘过来;}}class Cuter implements Love{function love_me(){echo 讨厌死了,不理你了;}}class GirlFrend{private $nature;function __construct($nature){$…...

    2024/5/8 14:20:35
  15. Pandas工具包实战(8)pivot数据透视表:series, dataframe

    数据透视表 import pandas as pdexample = pd.DataFrame({Month: ["January", "January", "January", "January", "February", "February",...

    2024/5/5 1:51:47
  16. 侵入对方系统的N种姿势

    文章目录一、Web漏洞二、反序列化漏洞三、未授权访问漏洞本文章是对获取网站控制权,操控对方电脑的所有方式的总结、仅供参考学习研究,未授权攻击别人的计算机系统都是违法行为!望君自重!!! 由于工作和精力问题,操作方法会定期持续更新,还望各位读者理解 😉一、Web漏…...

    2024/5/6 6:33:48
  17. 阿里云服务器 ECS通用型规格族g6特点

    阿里云服务器 ECS通用型实例规格族g6特点阿里云服务器 ECS通用型实例规格族g6的特点如下:依托神龙架构,将大量虚拟化功能卸载到专用硬件,降低虚拟化开销,提供稳定可预期的超高性能I/O优化实例支持ESSD云盘、SSD云盘和高效云盘说明 不同实例规格族的云盘性能上限不同,单台g…...

    2024/4/24 10:43:20
  18. 算法工程师的数学基础|线性代数中的向量内积和外积概念及几何意义

    线性代数主要包含向量、向量空间(或称线性空间)以及向量的线性变换和有限维的线性方程组。本篇文章主要介绍线性代数部分中的向量和向量空间。本篇内容主要是对线性代数中向量点积和外积补充,同时说明一下向量的四则运算,如果对向量和向量空间相关含义有所遗忘的话可以回顾:…...

    2024/4/24 10:43:17
  19. 物品服装道具租赁微信小程序

    最近给客户开发了一款服装道具租赁小程序相信不少喜欢打扮自己的男生女生都有经常网购的习惯,但是,不知不觉中,我们也感觉这种方式缺乏新奇感,相信很大一部分人都有这个心理,那么,我们何不尝试一下租赁呢?以下是小编为您整理的服装租赁的市场前景分析的相关内容。人群量…...

    2024/4/24 10:43:18
  20. Re 库的match对象

    match的类型 import re match = re.search(r[1-9]\d{5},BIT126095) if match:print(match.group(0)) type(match)#返回match的类型import re m = re.search(r[1-9]\d{5},BIT126095) m.string #待匹配的字符串 m.re#所使用的正则表达式 m.pos #搜索位置的开始位置 m.endpos#搜索…...

    2024/4/24 10:43:21

最新文章

  1. C++缺省参数、函数重载、引用

    一、缺省参数 1.1缺省参数概念 缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时&#xff0c;如果没有指定实参则采用该形参的缺省值&#xff0c;否则使用指定的实参。 void func(int n 0) {cout << n << endl; }int main() {func();func…...

    2024/5/9 4:57:28
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/7 10:36:02
  3. 3d representation的一些基本概念

    顶点&#xff08;Vertex&#xff09;&#xff1a;三维空间中的一个点&#xff0c;可以有多个属性&#xff0c;如位置坐标、颜色、纹理坐标和法线向量。它是构建三维几何形状的基本单元。 边&#xff08;Edge&#xff09;&#xff1a;连接两个顶点形成的直线段&#xff0c;它定…...

    2024/5/8 5:12:31
  4. 【JavaScript】如何在npm中切换源以及使用指定源安装依赖

    忘不掉的是什么我也不知道 想不起当年模样 看也看不到 去也去不了的地方 也许那老街的腔调是属于我的忧伤 嘴角那点微笑越来越勉强 忘不掉的是什么我也不知道 放不下熟悉片段 回头望一眼 已经很多年的时间 透过手指间看着天 我又回到那老街 靠在你们身边渐行渐远 …...

    2024/5/8 13:58:17
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/8 6:01:22
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/7 9:45:25
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/9 4:20:59
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/7 11:36:39
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/8 20:48:49
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/7 9:26:26
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/8 19:33:07
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/8 20:38:49
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57