基于springboot微信公众号开发(微信自动回复)

效果图

1.准备工作

申请微信订阅号(个人只能申请订阅号,而且没什么功能,也无法认证),申请完毕,点击 开发=>基本配置,如下图:

服务器配置需要有 域名 80端口,我猜你没有,这里推荐个实用工具,pagekite,下载链接,

这个工具需要 python2.7以上环境,还有邮箱一个,一个邮箱一个月,邮箱这东西大家懂得,

用pagekite申请完域名,就可以用自己的电脑做订阅号服务器了.

2.服务器代码

创建个springboot工程

pom.xml

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
  </properties>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>1.5.9.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <!-- 使thymeleaf支持h5标签 -->
    <dependency>
      <groupId>net.sourceforge.nekohtml</groupId>
      <artifactId>nekohtml</artifactId>
      <version>1.9.22</version>
    </dependency>
    <dependency>
			      <groupId>dom4j</groupId>
			      <artifactId>dom4j</artifactId>
			      <version>1.6.1</version>
		    </dependency>
  </dependencies>
  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
      </plugin>
    </plugins>
  </build>

入口类

@SpringBootApplication
public class WeChatApplication {

  public static void main(String[] args) {
    SpringApplication.run(WeChatApplication.class, args);
    System.out.println("====启动成功====");
  }

}

application.properties,配置server.port=80

Controller,这个是处理微信请求,get方法就是微信公众平台 服务器配置url请求的路径,post是处理用户事件

@RestController
public class WeChatController {
  @Autowired
  private WeChatService weChatService;
  /**
   * 处理微信服务器发来的get请求,进行签名的验证
   *
   * signature 微信端发来的签名
   * timestamp 微信端发来的时间戳
   * nonce   微信端发来的随机字符串
   * echostr  微信端发来的验证字符串
   */
  @GetMapping(value = "wechat")
  public String validate(@RequestParam(value = "signature") String signature,
      @RequestParam(value = "timestamp") String timestamp,
      @RequestParam(value = "nonce") String nonce,
      @RequestParam(value = "echostr") String echostr) {
    return WeChatUtil.checkSignature(signature, timestamp, nonce) ? echostr : null;

  }
  /**
   * 此处是处理微信服务器的消息转发的
   */
  @PostMapping(value = "wechat")
  public String processMsg(HttpServletRequest request) {
    // 调用核心服务类接收处理请求
    return weChatService.processRequest(request);
  }
}

Service,处理post请求

/**
 * 核心服务类
 */
@Service
public class WeChatServiceImpl implements WeChatService{
  @Autowired
  private FeignUtil feignUtil;
  @Autowired
  private RedisUtils redisUtils;
  public String processRequest(HttpServletRequest request) {
    // xml格式的消息数据
    String respXml = null;
    // 默认返回的文本消息内容
    String respContent;
    try {
      // 调用parseXml方法解析请求消息
      Map<String,String> requestMap = WeChatUtil.parseXml(request);
       // 消息类型
      String msgType = (String) requestMap.get(WeChatContant.MsgType);
      String mes = null;
      // 文本消息
      if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_TEXT)) {
        mes =requestMap.get(WeChatContant.Content).toString();
        if(mes!=null&&mes.length()<2){
          List<ArticleItem> items = new ArrayList<>();
          ArticleItem item = new ArticleItem();
          item.setTitle("照片墙");
          item.setDescription("阿狸照片墙");
          item.setPicUrl("http://changhaiwx.pagekite.me/photo-wall/a/iali11.jpg");
          item.setUrl("http://changhaiwx.pagekite.me/page/photowall");
          items.add(item);

          item = new ArticleItem();
          item.setTitle("哈哈");
          item.setDescription("一张照片");
          item.setPicUrl("http://changhaiwx.pagekite.me/images/me.jpg");
          item.setUrl("http://changhaiwx.pagekite.me/page/index");
          items.add(item);

          item = new ArticleItem();
          item.setTitle("小游戏2048");
          item.setDescription("小游戏2048");
          item.setPicUrl("http://changhaiwx.pagekite.me/images/2048.jpg");
          item.setUrl("http://changhaiwx.pagekite.me/page/game2048");
          items.add(item);

          item = new ArticleItem();
          item.setTitle("百度");
          item.setDescription("百度一下");
          item.setPicUrl("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1505100912368&di=69c2ba796aa2afd9a4608e213bf695fb&imgtype=0&src=http%3A%2F%2Ftx.haiqq.com%2Fuploads%2Fallimg%2F170510%2F0634355517-9.jpg");
          item.setUrl("http://www.baidu.com");
          items.add(item);

          respXml = WeChatUtil.sendArticleMsg(requestMap, items);
        }else if("我的信息".equals(mes)){
          Map<String, String> userInfo = getUserInfo(requestMap.get(WeChatContant.FromUserName));
          System.out.println(userInfo.toString());
          String nickname = userInfo.get("nickname");
          String city = userInfo.get("city");
          String province = userInfo.get("province");
          String country = userInfo.get("country");
          String headimgurl = userInfo.get("headimgurl");
          List<ArticleItem> items = new ArrayList<>();
          ArticleItem item = new ArticleItem();
          item.setTitle("你的信息");
          item.setDescription("昵称:"+nickname+" 地址:"+country+" "+province+" "+city);
          item.setPicUrl(headimgurl);
          item.setUrl("http://www.baidu.com");
          items.add(item);

          respXml = WeChatUtil.sendArticleMsg(requestMap, items);
        }
      }
      // 图片消息
      else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_IMAGE)) {
        respContent = "您发送的是图片消息!";
        respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
      }
      // 语音消息
      else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_VOICE)) {
        respContent = "您发送的是语音消息!";
        respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
      }
      // 视频消息
      else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_VIDEO)) {
        respContent = "您发送的是视频消息!";
        respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
      }
      // 地理位置消息
      else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_LOCATION)) {
        respContent = "您发送的是地理位置消息!";
        respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
      }
      // 链接消息
      else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_LINK)) {
        respContent = "您发送的是链接消息!";
        respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
      }
      // 事件推送
      else if (msgType.equals(WeChatContant.REQ_MESSAGE_TYPE_EVENT)) {
        // 事件类型
        String eventType = (String) requestMap.get(WeChatContant.Event);
        // 关注
        if (eventType.equals(WeChatContant.EVENT_TYPE_SUBSCRIBE)) {
          respContent = "谢谢您的关注!";
          respXml = WeChatUtil.sendTextMsg(requestMap, respContent);
        }
        // 取消关注
        else if (eventType.equals(WeChatContant.EVENT_TYPE_UNSUBSCRIBE)) {
          // TODO 取消订阅后用户不会再收到公众账号发送的消息,因此不需要回复
        }
        // 扫描带参数二维码
        else if (eventType.equals(WeChatContant.EVENT_TYPE_SCAN)) {
          // TODO 处理扫描带参数二维码事件
        }
        // 上报地理位置
        else if (eventType.equals(WeChatContant.EVENT_TYPE_LOCATION)) {
          // TODO 处理上报地理位置事件
        }
        // 自定义菜单
        else if (eventType.equals(WeChatContant.EVENT_TYPE_CLICK)) {
          // TODO 处理菜单点击事件
        }
      }
      mes = mes == null ? "不知道你在干嘛" : mes;
      if(respXml == null)
        respXml = WeChatUtil.sendTextMsg(requestMap, mes);
      System.out.println(respXml);
      return respXml;
    } catch (Exception e) {
      e.printStackTrace();
    }
    return "";

  }
}

微信工具类(只写了回复文本消息,和图文消息,其他的都是大同小异)

package com.wechat.util;

import java.io.InputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import javax.servlet.http.HttpServletRequest;

import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

import com.wechat.bean.ArticleItem;

/**
 * 请求校验工具类
 *
 * @author 32950745
 *
 */
public class WeChatUtil {  

  /**
   * 验证签名
   *
   * @param signature
   * @param timestamp
   * @param nonce
   * @return
   */
  public static boolean checkSignature(String signature, String timestamp, String nonce) {
    String[] arr = new String[] { WeChatContant.TOKEN, timestamp, nonce };
    // 将token、timestamp、nonce三个参数进行字典序排序
    // Arrays.sort(arr);
    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 (NoSuchAlgorithmException e) {
      e.printStackTrace();
    }

    content = null;
    // 将sha1加密后的字符串可与signature对比,标识该请求来源于微信
    return tmpStr != null ? tmpStr.equals(signature.toUpperCase()) : false;
  }

  /**
   * 将字节数组转换为十六进制字符串
   *
   * @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;
  }

  /**
   * 将字节转换为十六进制字符串
   *
   * @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;
  }

  private static void sort(String a[]) {
    for (int i = 0; i < a.length - 1; i++) {
      for (int j = i + 1; j < a.length; j++) {
        if (a[j].compareTo(a[i]) < 0) {
          String temp = a[i];
          a[i] = a[j];
          a[j] = temp;
        }
      }
    }
  }

  /**
   * 解析微信发来的请求(xml)
   *
   * @param request
   * @return
   * @throws Exception
   */
  @SuppressWarnings({ "unchecked"})
  public static Map<String,String> parseXml(HttpServletRequest request) throws Exception {
    // 将解析结果存储在HashMap中
    Map<String,String> map = new HashMap<String,String>();

    // 从request中取得输入流
    InputStream inputStream = request.getInputStream();
    // 读取输入流
    SAXReader reader = new SAXReader();
    Document document = reader.read(inputStream);
    // 得到xml根元素
    Element root = document.getRootElement();
    // 得到根元素的所有子节点
    List<Element> elementList = root.elements();
    // 遍历所有子节点
    for (Element e : elementList)
      map.put(e.getName(), e.getText());

    // 释放资源
    inputStream.close();
    inputStream = null;
    return map;
  }

  public static String mapToXML(Map map) {
    StringBuffer sb = new StringBuffer();
    sb.append("<xml>");
    mapToXML2(map, sb);
    sb.append("</xml>");
    try {
      return sb.toString();
    } catch (Exception e) {
    }
    return null;
  }

  private static void mapToXML2(Map map, StringBuffer sb) {
    Set set = map.keySet();
    for (Iterator it = set.iterator(); it.hasNext();) {
      String key = (String) it.next();
      Object value = map.get(key);
      if (null == value)
        value = "";
      if (value.getClass().getName().equals("java.util.ArrayList")) {
        ArrayList list = (ArrayList) map.get(key);
        sb.append("<" + key + ">");
        for (int i = 0; i < list.size(); i++) {
          HashMap hm = (HashMap) list.get(i);
          mapToXML2(hm, sb);
        }
        sb.append("</" + key + ">");

      } else {
        if (value instanceof HashMap) {
          sb.append("<" + key + ">");
          mapToXML2((HashMap) value, sb);
          sb.append("</" + key + ">");
        } else {
          sb.append("<" + key + "><![CDATA[" + value + "]]></" + key + ">");
        }

      }

    }
  }
  /**
   * 回复文本消息
   * @param requestMap
   * @param content
   * @return
   */
   public static String sendTextMsg(Map<String,String> requestMap,String content){

    Map<String,Object> map=new HashMap<String, Object>();
    map.put("ToUserName", requestMap.get(WeChatContant.FromUserName));
    map.put("FromUserName", requestMap.get(WeChatContant.ToUserName));
    map.put("MsgType", WeChatContant.RESP_MESSAGE_TYPE_TEXT);
    map.put("CreateTime", new Date().getTime());
    map.put("Content", content);
    return mapToXML(map);
  }
   /**
   * 回复图文消息
   * @param requestMap
   * @param items
   * @return
   */
  public static String sendArticleMsg(Map<String,String> requestMap,List<ArticleItem> items){
    if(items == null || items.size()<1){
      return "";
    }
    Map<String,Object> map=new HashMap<String, Object>();
    map.put("ToUserName", requestMap.get(WeChatContant.FromUserName));
    map.put("FromUserName", requestMap.get(WeChatContant.ToUserName));
    map.put("MsgType", "news");
    map.put("CreateTime", new Date().getTime());
    List<Map<String,Object>> Articles=new ArrayList<Map<String,Object>>();
    for(ArticleItem itembean : items){
      Map<String,Object> item=new HashMap<String, Object>();
      Map<String,Object> itemContent=new HashMap<String, Object>();
      itemContent.put("Title", itembean.getTitle());
      itemContent.put("Description", itembean.getDescription());
      itemContent.put("PicUrl", itembean.getPicUrl());
      itemContent.put("Url", itembean.getUrl());
      item.put("item",itemContent);
      Articles.add(item);
    }
    map.put("Articles", Articles);
    map.put("ArticleCount", Articles.size());
    return mapToXML(map);
  }

}

微信常量

public class WeChatContant {
   //APPID
  public static final String appID = "appid";
  //appsecret
  public static final String appsecret = "appsecret";
  // Token
  public static final String TOKEN = "zch";
  public static final String RESP_MESSAGE_TYPE_TEXT = "text";
  public static final Object REQ_MESSAGE_TYPE_TEXT = "text";
  public static final Object REQ_MESSAGE_TYPE_IMAGE = "image";
  public static final Object REQ_MESSAGE_TYPE_VOICE = "voice";
  public static final Object REQ_MESSAGE_TYPE_VIDEO = "video";
  public static final Object REQ_MESSAGE_TYPE_LOCATION = "location";
  public static final Object REQ_MESSAGE_TYPE_LINK = "link";
  public static final Object REQ_MESSAGE_TYPE_EVENT = "event";
  public static final Object EVENT_TYPE_SUBSCRIBE = "SUBSCRIBE";
  public static final Object EVENT_TYPE_UNSUBSCRIBE = "UNSUBSCRIBE";
  public static final Object EVENT_TYPE_SCAN = "SCAN";
  public static final Object EVENT_TYPE_LOCATION = "LOCATION";
  public static final Object EVENT_TYPE_CLICK = "CLICK";

  public static final String FromUserName = "FromUserName";
  public static final String ToUserName = "ToUserName";
  public static final String MsgType = "MsgType";
  public static final String Content = "Content";
  public static final String Event = "Event";

}

图文消息实体bean

public class ArticleItem {
  private String Title;
  private String Description;
  private String PicUrl;
  private String Url;
  public String getTitle() {
    return Title;
  }
  public void setTitle(String title) {
    Title = title;
  }
  public String getDescription() {
    return Description;
  }
  public void setDescription(String description) {
    Description = description;
  }
  public String getPicUrl() {
    return PicUrl;
  }
  public void setPicUrl(String picUrl) {
    PicUrl = picUrl;
  }
  public String getUrl() {
    return Url;
  }
  public void setUrl(String url) {
    Url = url;
  }

}

好了运行项目,在公众平台配置好url,个人订阅号完成.

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • SpringBoot微信消息接口配置详解

    1.申请测试号,并记录appID和appsecret 2.关注测试号 3.添加消息模板 {{topic.DATA}} 用户名: {{user.DATA}} 单车编号:{{car.DATA}} 锁定时间:{{date.DATA}} {{remark.DATA}} 微信接口配置和代码 1.添加微信配置文件 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframe

  • Springboot网站第三方登录 微信登录

    微信开放平台接入,官网:https://open.weixin.qq.com,在官网注册并添加应用后即可获得APP_ID和APP_SECRET. 步骤一:创建一个继承AuthService的接口,WeChatAuthService,如下 public interface WeChatAuthService extends AuthService { public JSONObject getUserInfo(String accessToken, String openId); } 步骤二:We

  • SpringBoot JS-SDK自定义微信分享的实现

    前言 在介绍使用微信自定义分享前,我们来先了解一下什么是自定义分享? 访问自定义微信外链地址页面,点击红色框位置进行分享给朋友或者朋友圈,具体操作如下图所示: 分享后图文消息如下图所示: 我们要做的就是自定义下图所示中红框中的信息. 闲话少说,接下来就正式开始自定义分享实战环节! 自定义分享实战 第一步需要先申请接口测试号并进行JS接口安全域名设置 访问如下链接进行接口测试号申请.点击访问选择接口测试号申请,如下图所示: 或者直接访问 :申请测试账号页面 如下图所示: 点击登录进行扫码登录,如下

  • Spring Boot获取微信用户信息的超简单方法

    前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要声明一点的是获取微信公众号下的用户信息的权限是服务号才有,个人订阅号是没有该权限的. 获取公众号用户信息实战 第一步需要先申请接口测试号并进行网页授权设置 访问如下链接进行接口测试号申请. https://developers.weixin.qq.com/doc/offiaccount/Basic_

  • SpringBoot中获取微信用户信息的方法

    前言 不知道你是否参加过拼多多上邀请微信好友砍价功能,这个功能实现首先需要考虑的就是获取微信用户的信息.获取用户信息就是获取公众号下微信用户的信息,今天我就来讲讲如何从公众号下获取微信用户信息. 需要声明一点的是获取微信公众号下的用户信息的权限是服务号才有,个人订阅号是没有该权限的. 获取公众号用户信息实战 第一步需要先申请接口测试号并进行网页授权设置 访问如下链接进行接口测试号申请. https://developers.weixin.qq.com/doc/offiaccount/Basic_

  • springboot整合微信支付sdk过程解析

    前言 之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求.提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,要满足3个条件; 之前实现过几个微信支付的接口,不过都是自己码的代码,从网上找找拼凑,觉得看起来不舒服~_~ 于是乎找到了微信官方提供的支付sdk.这里用的是java版本,springboot整合java 下载sdk,引入项目 这里可以直接下载官方提供的sdk,然后将几个java类拷贝到你的项目,也可以直接引入maven依赖,这里是直接将Java类拷贝到我

  • 微信小程序 springboot后台如何获取用户的openid

    openid可以标识一个用户,session_key会变,所以来获取一下openid. openid不能在微信小程序中直接获取,需要后台发送请求到微信的接口,然后微信返回一个json格式的字符串到后台,后台处理之后,再返回到微信小程序. 发布的小程序需要https的域名,而测试的时候可以使用http. 小程序在app.js中,修改login()中的内容: // 登录 wx.login({ success: res => { // 发送 res.code 到后台换取 openId, session

  • 详解nodejs微信公众号开发——2.自动回复

    上一篇文章:nodejs微信公众号开发(1)接入微信公众号,本篇文章将在此基础上实现简单的回复功能. 1. 接入代码的优化 之前我们简单粗暴的实现了微信公众号的接入,接入的代码直接写在了app.js文件里面,从项目开发的角度而言,不便于日后代码的维护,所以将这部分代码独立出来,按照koa的风格,写成一个中间件. 在根目录下新建wechat文件夹,新建generator.js文件, var sha1 = require('sha1'); module.exports = function(opts

  • 详解nodejs微信公众号开发——4.自动回复各种消息

    上一篇文章:nodejs微信公众号开发--3.封装消息响应模块,实现了对消息接口的模块化处理,方便后期的使用,本篇文章将介绍微信公众号回复各种消息的功能实现,包括文本.图片.语音.视频.音乐.图文等. 注:感觉最近localtunnel很不稳定,测试起来比较麻烦,有条件的自己搞个云服务器吧,我比较偷懒,几继续使用localtunnel了. 1. 被动回复用户消息 当用户发送消息给公众号时(或某些特定的用户操作引发的事件推送时),会产生一个POST请求,开发者可以在响应包(Get)中返回特定XML

  • 基于springboot微信公众号开发(微信自动回复)

    效果图 1.准备工作 申请微信订阅号(个人只能申请订阅号,而且没什么功能,也无法认证),申请完毕,点击 开发=>基本配置,如下图: 服务器配置需要有 域名 80端口,我猜你没有,这里推荐个实用工具,pagekite,下载链接, 这个工具需要 python2.7以上环境,还有邮箱一个,一个邮箱一个月,邮箱这东西大家懂得, 用pagekite申请完域名,就可以用自己的电脑做订阅号服务器了. 2.服务器代码 创建个springboot工程 pom.xml <properties> <pr

  • C#微信公众号开发 微信事件交互

    前言 一切准备工作就绪时就先实现一个关注公众号后向客户端推送一条消息.关注后推送消息需要一个get请求.一个post请求,get请求主要是为了向微信服务器验证,post请求主要就是处理微信消息了. 调接口时传递的appid和appsecret请传递自己公众号对应的参数. 微信事件交互 微信事件交互主要是向微信服务器推送XML数据包 看效果 看代码 [HttpGet] [ActionName("Index")] public ActionResult Get(string signatu

  • 详解nodejs微信公众号开发——3.封装消息响应模块

    上一篇文章:nodejs微信公众号开发(2)自动回复,实现了简单的关注回复.采用拼接字符串的形式,并不是很方便,这里我们将其封装承接口. 1. ejs模板引擎 不使用拼接字符串的方式,那么模板引擎就是较好的选择.Nodejs开源模板的选择很多,程序中使用 EJS,有Classic ASP/PHP/JSP的经验用起EJS来的确可以很自然,也就是说,你能够在 <%...%> 块中安排 JavaScript 代码,利用最传统的方式 <%=输出变量%>(另外 <%-输出变量是不会对

  • 详解nodejs微信公众号开发——5.素材管理接口

    上一篇文章:nodejs微信公众号开发--4.自动回复各种消息,我们实现了被动回复文字和图文,回复图片失败,因为需要先获取通过素材管理接口上传多媒体文件而得到的MediaId,这一节们就来实现素材管理的接口.可参看:公众平台开发者文档 1. 新增临时素材 临时素材顾名思义是临时的,上传后一定时间就被清理掉,适用于一些有时效性的图文链接.关于临时素材需要注意的点: 对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要

  • C#微信公众号开发之接收事件推送与消息排重的方法

    本文实例讲述了C#微信公众号开发之接收事件推送与消息排重的方法.分享给大家供大家参考.具体分析如下: 微信服务器在5秒内收不到响应会断掉连接,并且重新发起请求,总共重试三次.这样的话,问题就来了.有这样一个场景:当用户关注微信账号时,获取当前用户信息,然后将信息写到数据库中.类似于pc端网站的注册.可能由于这个关注事件中,我们需要处理的业务逻辑比较复杂.如送积分啊,写用户日志啊,分配用户组啊.等等--一系列的逻辑需要执行,或者网络环境比较复杂,无法保证5秒内响应当前用户的操作,那如果当操作尚未完

  • 微信公众号开发之微信公共平台消息回复类实例

    本文实例讲述了微信公众号开发之微信公共平台消息回复类.分享给大家供大家参考.具体如下: 微信公众号开发代码我在网上看到了有不少,其实都是大同小义了都是参考官方给出的demo文件进行修改的,这里就给各位分享一个. 复制代码 代码如下: <?php /**  * 微信公共平台消息回复类  *  *  */ class BBCweixin{    private $APPID="******";  private $APPSECRET="******";  /*  

  • 详解Vue微信公众号开发踩坑全记录

    本文介绍了Vue微信公众号开发踩坑全记录,分享给大家,也给自己留个笔记. 需求 微信授权登录(基于公众号的登录方案) 接入JS-SDK实现图片上传,分享等功能 现状及难点 采用的Vue框架,前后端分离模式(vue工程仅作为客户端),用户通过域名访问的是客户端,但是微信授权中涉及签名和token校验依赖服务端 JS-SDK需要向服务端获取签名,且获取签名中需要的参数包括所在页面的url,但由于单页应用的路由特殊,其中涉及到IOS和android微信客户端浏览器内核的差异性导致的兼容问题 解决方案

  • Python微信公众号开发平台

    上大学的时候,对微信公众号开发浅尝辄止的玩了一下,感觉还是挺有意思的. http://www.jb51.net/article/133677.htm后来服务器到期了,也就搁置了.由于发布web程序,使用PHP很顺手,就使用了PHP作为开发语言.但是其实微信公众号的开发和语言关联并不大,流程,原理上都是一致的. 快要做毕设了,想着到时候应该会部署一些代码到服务器上,进行长期的系统构建.所以趁着还是学生,就买了阿里云的学生机.买了之后,就想着玩点什么,于是微信公众号的开发,就又提上了日程.但是这次,

随机推荐