其实早在微信开放公众号开发平台时就想弄一个自己的公众号服务器,奈何对web服务器搭建和开发一窍不通,只是注册了一下开发者帐号,并没有采取行动,万恶的拖延症。

前一年,开始接触python,打开了神奇世界的大门,以前都是用C,C++写程序,开发一个程序就像安装一台机器,有严格的说明书,一步一步不能有差。而用python开发,特别是

自己用的助手程序,怎么说呢,就像飞在空中一般,广阔天空,任尔发挥。python的精彩在这里不做赘述,自己也只是学了一点皮毛,还有更好玩的在后面等着去学,继续努力哈。

  最初学python,是看的《python基础教程》,对我而言是本不错的书,第15章就是介绍python web开发,只需要简单的代码就可以搭建一个简单的服务器,并且也知道了python的

网络框架Django,再后来开始看《Django Web开发指南》,加上自己有一些需求,想定制自己的微信公众号,给自己提供特定的功能,就有了用Django搭建自己的微信公众号服务器的念头。

  Django和Apache 搭建web服务器,是比较简单的,《Django Web 开发指南》上有,推荐到这个网站上去看一下

http://www.ziqiangxuetang.com/django/django-deploy.html

这个网址专门讲了Django开发,从初级到实践,作者讲的很好。这里只是建议在开发阶段把Django 的Debug 设置成True(默认就是True),这样在访问服务器出错时,可以在浏览器上看到出错在哪里,

当然,在linux上,查看/var/log/apache2/error.log 也可以查看出错的日志。

  对于服务器来说,一般是不关机的,对我来说,一直开着台式机好像有点浪费电,因为现在服务只提供给个人,在网上买个云服务器也划不来,刚好有块闲置的树莓派二代,就想把服务器搭在pi上面,平时只要

用手机充电器供电即可。

  搭建内网服务器,最主要的问题是如何让外网能访问家里的内网,我用的是在花生壳(http://hsk.oray.com/)上注册一个帐号,它会免费提供一个动态域名,家里用的是TP_Link路由器,在“动态DNS”设置里面

  填写注册的帐号和密码,登录,正常就会显示连接成功,下面的域名信息就可以用作你服务器的域名。接下来就是配置外网访问内网的端口号,通过配置路由器的转发规则可以进行映射

上面的IP地址就是内网服务器的IP地址,服务器端口号就是外网访问时的端口号,内部端口号就是映射到内网服务器监听的端口号,就这样外网可以通过域名访问内网的服务器了,可以通过浏览器加端口号访问测试,如

http://xxx.xicp.net/:443/

  服务器访问配置基本就这些了,接下来就是把服务器的信息添加到微信公众号开发平台上,在自己的开发帐号中,开发--》基本配置 中,填写服务器配置 URL就填写上面的域名 http://xxx.xicp.net(下面会对这个进行修改),

Token(令牌),随便填写一个,在服务器端填成一致就可以了,消息加解密方式,开发阶段填成明文模式就可以了,提交,显示URl访问超时!!! 这里是碰到的第一只拦路虎,一开始不明白为什么会访问超时,因为查看其他人的教程,

都是这么配置的,并且用浏览器访问服务器都是好的,当出现问题时,不要着急去网上找资料,先自己想想,查看一下配置步骤,看看官方的开发文档。终于,看到微信公众号平台支持两个端口号80和443,如果在路由器上映射80端口的话,

会提示80端口被占用,是被电信占用了,没办法,只能映射443端口了,这就需要搭建apache ssl访问了,因为443端口就是对应的https访问。

  apache 上搭建https访问(谢谢网上的分享者):

1.sudo a2enmod ssl

2.sudo apt-get install openssl  //安装openssl (如果已经安装了openssl,就不用安装了,派上面应该已经安装了)

3.openssl genrsa -des3 -out server.key 1024  //创建CA签名, 会提示输入密码,密码在后面启动服务器时需要输入

4.openssl req -new -key server.key -out server.csr //创建CSR

5.openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt  //自己签发证书

6.sudo cp server.crt /etc/ssl/certs  //拷贝文件到ssl的目录下

7.sudo cp server.key /etc/ssl/private

然后在apache服务器配置里面,需要添加一些东西,在/etc/apache2/sites-available/ 这个目录下,有我的之前的apache配置web.conf,这个是自己创建的,

我的配置如下

<VirtualHost *:443> #修改成443

ServerName you.xicp.net  #你的服务器域名
ServerAlias you.xicp.net
ServerAdmin admin
SSLEngine On
SSLOptions +StrictRequire
SSLCertificateFile /etc/ssl/certs/server.crt
SSLCertificateKeyFile /etc/ssl/private/server.key

#下面的配置和你的Django工程有关,配置说明参照 http://www.ziqiangxuetang.com/django/django-deploy.html

Alias /media/ /home/pi/project/media/
Alias /static/ /home/pi/project/static/

<Directory /home/pi/project/media>
Require all granted
</Directory>

<Directory /home/pi/project/static>
Require all granted
</Directory>

WSGIScriptAlias / /home/pi/project/wsgi.py

<Directory /home/pi/project/app>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
</VirtualHost>

红色的是配置https访问加上的内容

然后

sudo a2ensite web.conf #让自己的配置生效

sudo /etc/init.d/apache2 restart #重启apache服务器
重启apache服务器后,会让你输入密码,就是一开始创建CA签名时输入的密码

在Django工程代码中添加url访问

url(r'^$',comm_view.index),
comm_view.index 是你自己的view访问函数,我的代码如下
#coding=utf-8

from django.shortcuts import render

from django.http import HttpResponse
# Create your views here. import hashlib
import json from django.utils.encoding import smart_str
from django.views.decorators.csrf import csrf_exempt WX_TOKEN = "yourtoken" @csrf_exempt
def index(request): print("wx request") if request.method == "GET": signature = request.GET.get("signature",None)
timestamp = request.GET.get("timestamp",None)
nonce = request.GET.get("nonce",None)
echostr = request.GET.get("echostr",None)
token = WX_TOKEN
tmp_list =[token,timestamp,nonce]
tmp_list.sort()
tmp_str = "%s%s%s" % tuple(tmp_list)
tmp_str = hashlib.sha1(tmp_str.encode("unicode_escape")).hexdigest() if tmp_str == signature:
return HttpResponse(echostr)
else:return HttpResponse("sucess")

再去微信公众号开发平台上配置服务器配置,URL这时候要改成https://xxx.xicp.net,其他配置不变,提交后,服务器正常工作的话,就会提示成功!!!。然后 在“修改配置”的边上点击“启用”配置。

这样微信公众号这边也就配置完成了。

再回到上面的代码,上面的代码可以看到是一个“GET”请求,是微信公众号访问我们的服务器验证,如果订阅的人提交消息给我们的公众号,则微信服务器会把消息POST给我们的服务器,我们服务器要做的

就是对POST请求进行处理,返回结果给微信公众号服务器再显示到用户微信上。

一开始,我是这样写的 (接上面代码)

elif request.method == "POST":
HttpResponse("ok,hello")

用自己的微信进行测试时提示“该公众号暂时无法提供服务,请稍候再试”,但是用浏览器访问又是正常的,用开发平台提供的怎么都没想明白,只能继续看开发文档,公众号的开发文档还是写的很好的(十分感谢),看到文档给的例子是接收时对xml进行解析,返回时组成xml格式,在想是不是一定要组成xml格式文档才行,用开发文档提供的例子(https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5&token=&lang=zh_CN),返回时组成xml格式,再试试,成功了!!当然也不是一次就成功的~~,这中间把收到的ToUserName和FromUserName 赋值给了返回的ToUserName和FromUserName,导致用开发平台的工具(http://mp.weixin.qq.com/debug)调试时,能正常收到回应,而用自己的微信号发送消息还是失败,后来仔细检查了一下代码才发现,收到消息时的ToUserName赋值给了回应消息时的FromUserName,这样微信公众号不混乱才怪,互调之后,终于成功。看着微信上回应"OK KO",虽然只是简单的一句话,但内心还是深深的满足感,这也许就是程序员的小满足。

  写这份记录,是对这个过程的一个笔记,用于自己日后查看,第二就是在搭建过程中网上查到的资料和自己的一些体会整理一下,希望能给有相同需求的同学给予一点点帮助。好了,属于自己的服务器搭好了,借着微信的强大平台,定制自己的服务吧!

Django + Apache + 树莓派 搭建内网微信公众号服务器的更多相关文章

  1. Apache James搭建内网邮件服务器

    Apache James搭建内网邮件服务器 极客521 | 极客521 2014-08-21 148 阅读 java 大概之前两个礼拜的日子,讨论会介绍了关于了.net内网邮件服务器的搭建.所以自己也 ...

  2. 微信小程序内链微信公众号的方法

    最近接了一个需求,要求在微信小程序内部添加关注微信公众号的方式并给出解决方案,经过几天的翻官网文档,查周边资料,问资深技术员,初步给出两个解决方案: 题外话: 搬砖容易,建设难,搬砖的小伙伴请注明文章 ...

  3. 关注PHPthinking官网微信公众号——红包来袭

    欢迎大家扫描关注PHPthinking官方微信订阅号,我们将给您定期发送质量博文.新闻趣事.站点公告等等,同一时候还有PHPthinking准备的每日微信红包(金额不等,已发出百元红包)等着你! 官网 ...

  4. 搭建内网的NTP时间服务器

    NTP时间服务器 标签: linux 笔者Q:972581034 交流群:605799367.有任何疑问可与笔者或加群交流 1.简介 NTP(Network Time Protocol,网络时间协议) ...

  5. 微信公众号开发系统入门教程(公众号注册、开发环境搭建、access_token管理、Demo实现、natapp外网穿透)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/a1786223749/article/ ...

  6. 用java开发微信公众号:测试公众号与本地测试环境搭建(一)

    本文为原创,原始地址为:http://www.cnblogs.com/fengzheng/p/5023678.html 俗话说,工欲善其事,必先利其器.要做微信公众号开发,两样东西不可少,那就是要有一 ...

  7. 从Python爬虫到SAE云和微信公众号:二、新浪SAE上搭建微信服务

    目的:用PHP在SAE上搭建一个微信公众号的服务器. 1.申请一个SAE云账号 SAE申请地址:http://sae.sina.com.cn/  可以使用微博账号登陆,SAE是新浪的云服务,时间也比较 ...

  8. 个人微信公众号搭建Python实现 -开发配置和微信服务器转入-配置说明(14.1.2)

    @ 目录 1.查看基本配置 2.修改服务器配置 3.当上面都配置好,点击提交 4.配置如下 1.查看基本配置 登录到微信公众号控制面板后点击基本配置 这里要讲的就是订阅号 前往注册微信公众号 2.修改 ...

  9. Python+Tornado开发微信公众号

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 本教程针对的是已掌握Pyt ...

随机推荐

  1. NNVM打造模块化深度学习系统(转)

    [摘录理由]: 之所以摘录本文,主要原因是:该文配有开源代码(https://github.com/dmlc/nnvm):读者能够直接体会文中所述的意义,便于立刻展开研究. MXNet专栏 :NNVM ...

  2. AES加密补位填充的一个问题

    AES加密支持多种填充方式,NoPadding,PKCS5Padding,ISO10126Padding,ZerosPadding,PKCS7Padding. 其中PKCS7Padding 就是数据个 ...

  3. Ngnix反向代理react-router配置问题解决方法

    项目以react router实现,用ngnix做反向代理的时候出现404找不到页面,有两种解决方法. 第一种  将<Route path="*" component={No ...

  4. delphi 开发者 linux 实务(转)

    Linux Essentials for Delphi Developers   There is currently no way using Delphi to target Linux. Lon ...

  5. remote debug in visual studio

    install "rtools setup x64"[remote debugging monitor] on the target machine, lauch it when ...

  6. C#中获得机器的字符编码webName信息

    在一次解决编码的问题过程中,发现Encoding.GetEncoding("GB2312") == Encoding.GetEncoding("GBK"),到底 ...

  7. TextVeiw 的 No package identifier when getting value for resource numb

    tv_title,tv_detail,tv_comment都是TextView; newInfo.getComment()得到的是int类型 tv_title.setText(newInfo.getT ...

  8. firefox浏览器不支持复制粘贴(linux)

    在Linux主机下使用firefox在线编辑文章时,提示不支持复制粘贴选项,并给出了解决方法,记录一下 1.先找到本机firefox的配置文件的所在文件夹位置,不知道的请遵循以下步骤 点击菜单栏的帮助 ...

  9. 读Javascript高级程序设计第三版第六章面向对象设计--创建对象

    虽然Object构造函数或者对象字面量都可以用来创建单个对象,但是缺点非常明显:使用同一接口创建很多对象,会产生大量重复代码. 工厂模式  1 function CreatePerson(name,a ...

  10. nagios二次开发(一)---开发思想

    NAGIOS现状   从nagios的官网http://www.nagios.org/及其它已经公开的资料,我们可以知道:在web UI层nagios只提供了给我们查看图形界面的操作,界面上有简单的启 ...