微信公众号后端开发怎么做?

作者:鱼爪创媒网 点击:160 发布时间:2021-11-05

  微信公众号后端开发怎么做?各位微信用户们,以下是小编整理的微信公众号后端怎么开发的内容哦,各位亲们如果要开发微信公众号后端,可以参考以下小编整理的方法和微信代码哦。

  微信公众号后端开发怎么做?

  首先登陆微信公众号账号和微信公众号密码,然后接入微信公众平台。

  登录微信公众平台后台后,点“功能”-“高级功能”-“开发模式”,进入开发模式,如果公众平台显示“尚未成为开发者”,就点击“成为开发者”:

  

  同意协议后,填写URL和Token:

 

  URL是指微信服务器向哪个URL发送消息而Token是微信服务器和我们自己的服务器通信时验证身份用的,可以随便填写,但要注意保密。

  然后点“提交”,一般来说会报错“URL超时”或者“没有正确返回echostr”,因为我们的后台还没有准备好,所以,第一步是接收微信后台发送的验证消息,微信后台会发送一个GET请求到上面的URL,并附带以下参数:

  signature,timestamp,nonce,echostr

  我们的服务器在接收到上述参数后,需要验证signature是否正确,验证方法是先对timestamp、nonce和token先排序,再拼接成一个字符串,计算出sha1,并和signature对比:

  Python:

  def check_signature(signature, timestamp, nonce):

  L = [timestamp, nonce, token]

  L.sort()

  s = L[0] + L[1] + L[2]

  return hashlib.sha1(s).hexdigest() == signature

  Java微信代码:

  public static boolean check_signature(signature, timestamp, nonce) {

  String[] arr = new String[] { timestamp, nonce, token };

  Arrays.sort(arr);

  String s = arr[0] + arr[1] + arr[2];

  md = MessageDigest.getInstance("SHA-1");

  byte[] digest = md.digest(s.getBytes("utf-8"));

  return signature == bytes2HexString(digest);

  注意token不是微信服务器发过来的,而是我们自己写死的一个常量,就是在微信后台填写的Token。

  如果计算的sha1和微信传过来的signature相等,说明这个请求确实是微信后台发过来的,如果是别人伪造的请求,由于他不知道token,所以,无法计算出正确的signature。

  要防止第三方通过监听发动replay攻击,还需要验证timestamp和nonce,这个以后再讨论。

  如果signature计算无误,就把微信后台传过来的echostr原封不动地传回去,这样,就可以通过验证,成为开发者。

  在确保开发模式打开的情况下,微信后台会把微信用户消息发到我们的服务器上。

  微信后台发送消息是一个POST请求,但和普通的POST请求不同的是,首先,URL会带上signature、timestamp、nonce这3个参数:

  然后,HTTP请求的BODY是一个不规范的XML:

  我们自己的服务器只需要处理该XML,然后,向微信返回一个类似如下的XML:

  就可以完成微信消息的回复。微信后台要求必须在5秒内回复,最多重试3次,否则我们自己的回复消息就到达不了用户的手机了。如果我们自己的服务器无法在5秒内回复,就回复一个空字符串,告诉微信服务器,不用重试了,这个消息处理不了,不给用户回复了。

  上面的交互逻辑看起来很简单,但实际上坑有很多。

  首先,微信服务器发送的POST请求根本就不符合HTTP规范。原则上POST请求不应该在URL上附带参数,但微信后台偏偏要这么干,这就让很多编程语言的标准框架无法获取到POST参数,因为标准的POST参数是从HTTP BODY中解析的。

  所以,从POST获取URL参数就需要用到更底层的代码。比如,在Python中,必须通过WSGI的environ字典获取,并且自己来解析:

  # python:

  environ = ...

  qs = environ.get('query_string', '')

  q = urlparse.parse_qs(qs)

  signature = q['signature'][0]

  timestamp = q['timestamp'][0]

  nonce = q['nonce'][0]

  # TODO: check signature...

  在Java中,用HttpServletRequest在POST模式下别想用getParameter()拿到URL参数,必须用getQueryString()然后自己想办法解析字符串:

  // java:

  String qs = request.getQueryString();

  Map map = parse(qs);

  // TODO: check signature...

  然后,我们再讨论如何读取微信后台发过来的XML。在Python中,需要从environ读取原始的wsgi.input流:

  fp = environ['wsgi.input']

  在Java中,需要从HttpServletRequest中获取Reader流:

  Reader reader = request.getReader();

  如果有乱码,写一个EncodingFilter把Request强制设置为UTF-8编码:

  public class EncodingFilter implements Filter {

  public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {

  req.setCharacterEncoding("UTF-8");

  resp.setCharacterEncoding("UTF-8");

  chain.doFilter(req, resp);

  }

  public void init(FilterConfig config) throws ServletException {}

  public void destroy() {}

  }

  不需要读取为字符串,只要有了流就可以解析XML了,建议用SAX解析,最终我们应该得到微信的XML中传过来的几个值:

  ToUserName: 'abc'

  FromUserName: 'xyz'

  CreateTime: '12345678'

  MsgType: 'text'

  Content: '用户发的消息'

  根据MsgType我们可以判断消息是文本、语音、图片、位置还是视频,然后,构造一个XML回复给微信后台,如果一切顺利,微信后台就把我们的消息发给用户。

  目前我们只讨论如何回复文本消息,只需构造如下的XML:

  在回复的XML中,把接收的ToUserName和FromUserName交换,这两个字符串都是用户ID(公众号本身也是一个用户ID),CreateTime是以秒为单位的UNIX时间戳,计算如下:

  Python:

  CreateTime = int(time.time())

  Java:

  long CreateTime = System.currentTimeMillis() / 1000;

  MsgType仍是text,Content就是我们自动回复的消息,注意不要超过600个字符。

  回复的时候,需要注意,一是最好明确地设置Content-Type: text/xml,二是XML的编码必须是UTF-8,否则,回复的消息就会出现乱码。

  如何创建回复XML?由于该XML结构相当简单,所以无需动用任何XML接口,直接拼接字符串最简单快速。

  最后,把代码部署到服务器,记住把接收的参数和XML,以及自己生成的XML在log中打印出来,一边看log,一边用手机端的微信来调试。只要调通了一种接口,其他接口参考微信文档就很容易开发了:

  目前,微信公众平台的API还有很多限制,比如没有每天自动群发消息的API,要回复图文等多媒体消息需要V认证等等。

  微信和微信公众平台虽然产品很先进,但后台API设计得确实不咋地。由于API是给开发人员使用的,所以,设计一个好的API要从开发人员的角度出发。与其使用笨重的XML,不如使用更符合Web潮流的JSON。而且,没有必要把验证单独用GET区分,完全可以全部使用POST方式,在JSON中把所有信息全部包括,以action和data来区分消息类型和数据,例如,验证服务器:

  {

  "signature": "xxx",

  "timestamp": 123456,

  "nonce": "xxx",

  "action": "verify",

  "data": {

  "echostr": "echo"

  }

  }

  发送消息:

  {

  "signature": "xxx",

  "timestamp": 123456,

  "nonce": "xxx",

  "action": "msg",

  "data": {

  "id": "123456",

  "type": "text",

  "from": "user-abc",

  "to": "user-xyz",

  "create_time": 1234567,

  "content": "blablabla..."

  }

  }

  回复消息:

  {

  "action": "msg",

  "data": {

  "type": "text",

  "from": "user-xyz",

  "to": "user-abc",

  "create_time": 1234567,

  "content": "reply to..."

  }

  }

  这样设计的API,各种编程语言都能处理,而且处理逻辑更简单,速度更快。

  微信公众号后端开发怎么做呢?各位微信用户们,以上是小编整理的微信公众号后端怎么开发的内容了哦,希望小编整理的内容会对大家有所帮助哦,大家请多多关注鱼爪创媒。感谢大家的关注。

相关阅读:

微信小程序应用场景是什么?

微信小程序上线有哪些开发思路?

微信公众平台技术支持?

鱼爪创媒是一家专业提供公众号交易、公众号迁移、公众号增粉、公众号买卖交易的平台,如果您有这方面的需求,欢迎电话咨询:13018202357。有任何疑问,可以 【立即咨询】 我们平台的客服或者添加微信号 【13018202357】 。此文章来源于网络,如有侵权,请联系删除

标签:

资金保障

提供买卖双方资金担保交易
更放心

法律保障

交易签订具有法律效益合同
提供法律支持

急速退款

专属资金通道,快速拿到
钱款

全资公司

全资控股公司,大平台交易
有保障

服务优质

3500+专业团队,为您提供24
小时一对一贴心服务