Django 微信开发(一)——环境搭建

随着移动互联网时代的到来,微信——一个改变着我们生活的产品悄悄走近了我们的生活。我们不得不觉得自己很幸运,自己能在这个世界上遇到像QQ、微博、微信这样优秀的产品,同时,也不得不感叹这些产品的强大之处。就拿微信来说吧,我们可以文字聊天、发语音、报告位置、甚至是发视频、对讲机等功能,确实为我们平时的沟通大大降低了成本,譬如以前生日祝福等都是打电话、发短信,可在微信时代我们只要发文字或者是发一段语音就好了——省钱、简单、好用。

移动互联网的时代,你不一定需要你自己的移动APP,而且自己外包给别人做成本也比较高,小小的创业公司,就算你有了自己的移动APP,还要自己去发展用户(不同性质的公司需求不一样,举个例子而已),而且还要花大量的时间和精力在移动APP的维护上。基于不同的平台需要不同的人开发,譬如安卓版、IOS版、WP版等。因此,选择在微信上做二次开发是中小企业的不二选择。也有不少企业也有了自己的公众账号,甚至是服务号。

关于订阅号、服务号有哪些优点和缺点以及怎么使用,楼主在这里就不再赘述了,因为已经有最好的了。参考链接:http://www.zhongyaofang.cn/combat_power/weixin_jiaocheng_vol1.html 。

基于公众账号的二次开发,楼主选择的是最简单易懂的Python语言,结合Python一个轻量级的框架Django开发,操作比较简单,简单两下就能学会。由于业务发展需要,最近楼主也为自己所在的公司从事微信相关开发。因此将开发中遇到的问题及解决方案总结出来与大家,共同进步、共同成长。

  需求描述:

楼主所在的公司是一家微型金融机构,有自己的网站,现在要将网站上的一部分功能(譬如放贷、购买理财产品等)在微信端实现,这样方便微信用户的操作,顺便也从微信用户中导一份流量到自己的网站。

首先,我们来了解一下微信通信的原理。现在假设你也接到和楼主相同的需求。举个简单的流程:在微信端实现放贷的流程。                第一步,用户在微信端发送放贷请求到微信服务器,请求格式由你自己决定,只要能解析就行;

第二步,微信服务器接受到请求信息,将信息转发到你自己的网站;

第三步,在你自己的网站处理完业务逻辑,反馈结果发送到微信服务器;

第四步,微信服务器将反馈结果转发给用户。

简单四步,完成了整个通讯,详细的流程如下图:

上图中,已经清晰的描述了通讯的原理,但是在开发过程中,我们大多都在本地,一般都是局域网,怎样才能和微信服务器实现通讯呢?当然你可以选择在服务器提供商买一台服务器,在那上面做开发。不过,细细盘算下来,成本确实有点高,所以我们要选择最简便有效的方法来解决我们的问题。在这里,楼主用到了SAE,当然你也可以用GAE, 在本地(局域网内)搭建了一个开发环境。当然,其原理还是跟上图很类似,只是稍微复杂了一点点:

第一步,用户在微信端发送放贷请求到微信服务器;

第二步,微信服务器接受到请求信息,将信息转发SAE(需要自己配置);

第三步,SAE将请求转发到指定位置(需要自己配置,还需要提供域名),我们暂且命名为“中转站”;

第四步,指定位置(“中转站”)将请求转发到你的路由;

第五步,路由通过映射转发到你的内网IP(即你的本地服务器);

第六步,你本地服务器处理完成后发送反馈到路由器;

第七步,路由器转发到指定位置(中转站);

第八步,指定位置(中转站)转发到SAE;

第九步,SAE转发到微信服务器;

第十步,微信服务器将反馈结果转发给用户。

看起来,确实有一点点复杂,不急,先看看图,且听我细细道来。

具体思路我们已经很清楚了,现阶段,我们只需要解决各个节点中的问题即可了。

我们从简单的开始:

(1) 配置路由器映射。可能不是所有的路由器都有这个功能,其目的是为了在外网能访问你本地的IP。一般在你上网的时候,都会对应有一个IP地址,可以通过在百度中输入IP来查询你的外网IP(见下图)。由于外网IP没有给用户开放80端口(如果开放了大家的机器都可以当服务器用了),所以你需要自己打开一个端口,让外网可以访问。我在本地我指定的是9000端口,假设我现在的IP地址是192.168.0.99,外网IP经查得是116.77.5.229,那么当你本地开启网络服务后,通过访问116.77.5.229:9000地址,就可以和你本机进行通信了。

(2) 配置“中转站”。通常,我们上网的 外网IP都是随机分配的,也就是说,我们每次上网时的外网IP都是不一样的,所以在与微信端通信的时候就比较麻烦了。在这里我们用到的"中转站"就是为了解决这一问题——让你的域名可以顺利解析到你本地的外网IP。因此,我们需要找一个DNS供应商,在这里,楼主找到了免费的DNSPod:https://www.dnspod.cn/ ,不过需要你在这上面注册一个用户,然后将你在域名提供商购买的域名配置为DNSPod的DNS地址,如图:

除此之外,我们还要配置一个子域名如:wx.xxxx.com(xxxx是你的域名),记录值那一栏就是你外网的IP,但是这样你每次都要查询你的外网IP,然后将IP更改过来来。是不是很繁琐?有没有一劳永逸的办法?

答案是:当然有。楼主整来了下面一段代码,将你在DNSPod上的用户名和密码写入,在本地配上Python环境就可以使用喔:

#!/usr/bin/env python
# coding: utf-8 import httplib, urllib, urllib2
import time
import sys,os
import re
import json username = 'yima1006@qq.com' #账号
password = 'password' #密码
format = 'json' domain = [u'wx.xxxxx.com'] #要解析的域名 def get_domain_info(domain):
domain_split = domain.split('.')
domain_split_len = len(domain_split)
maindomain = domain_split[domain_split_len - 2] + '.' + domain_split[domain_split_len - 1]
return maindomain,domain params = {'login_email':username,'login_password':password,'format':format} def request(action, params, method = 'POST'):
headers = {"Content-type": "application/x-www-form-urlencoded", "Accept": "text/json"}
conn = httplib.HTTPSConnection("dnsapi.cn")
conn.request(method, '/' + action, urllib.urlencode(params), headers)
response = conn.getresponse()
data = response.read()
conn.close()
if response.status == 200:
return data
else:
return None def get_my_domain_id():
data = request('Domain.List',params)
data = json.loads(data)
domainlist = data.get('domains')
domaninfo = {}
for d in domainlist:
domaninfo[d.get('name')] = d.get('id')
return domaninfo def get_my_domain_record_id(domain_id):
params['domain_id'] = domain_id
data = request('Record.List',params)
data = json.loads(data)
if data.get('code') == '10':
return None
domainname = data.get('domain').get('name')
record_list = data.get('records')
record = {}
for r in record_list:
if r.get('type') == 'A':
key = r.get('name') != '@' and r.get('name') + '.' + domainname or domainname
record[key] = {'id':r.get('id'),'value':r.get('value')}
print record
return record def changerecord(domain,domain_id,record_id,ip):
params['domain_id'] = domain_id
params['record_id'] = record_id
params['record_type'] = 'A'
params['record_line'] = '默认'
params['sub_domain'] = domain
params['ttl'] = 600
params['value'] = ip
data = request('Record.Modify',params) def getip():
url = 'http://iframe.ip138.com/ic.asp'
response = urllib2.urlopen(url)
text = response.read()
ip = re.findall(r'\d+.\d+.\d+.\d+', text)
print '外网IP:%s'%ip[0]
return ip[0] or None def updatedomaininfo(domain):
m,sub_m = get_domain_info(domain)
domain_id = my_domain_id_list.get(m)
record_list = get_my_domain_record_id(domain_id)
if record_list == None:
return None
rocord_info = record_list.get(sub_m)
record_ip = rocord_info.get('value')
record_id = rocord_info.get('id')
return sub_m,record_ip,record_id,domain_id if __name__ == '__main__':
my_domain_id_list = get_my_domain_id()
try:
for dm in domain:
domaindata = updatedomaininfo(dm)
if domaindata == None:
continue
dnsdomain,dnsdmainip,record_id,domain_id = domaindata
domain_name = dnsdomain.split('.')[0]
ip = getip()
if ip == dnsdmainip:
continue
else:
changerecord(domain_name,domain_id,record_id,ip)
except:
pass

这样,通过访问http://wx.xxxx.com:9000端口就能找到你本地的服务器了。

(3)配置SAE应用。在SAE上,我们只需要做一个简单的代理就行,即将微信服务器转发过来的请求按照原来的方式转发到你的“中转站”就好了。在这里,我们用到了一个Python机器轻量级的web框架——web.py。我们可以在SAE上直接创建一个Python项目,然后在index.wsgi文件中贴如如下一段代码就行了。

#/usr/bin/python
#coding:utf-8 import sys
reload(sys)
sys.setdefaultencoding('utf-8')
import web
import urllib2
try:
import sae
except:
pass urls = (
'/weixin/?', 'weixin',
) web.config.debug = True
app = web.application(urls, globals()) class weixin:
def GET(self):
""" GET 请求转发"""
url = "http://wx.xxxx.com:9000/weixin/?" # 转发地址,与你的路由器端口映射
d = web.input() # 读取参数
data = []
for i in d:
data.append(i + '=' + d[i])
url = url + '&'.join(data) # 拼接参数
req = urllib2.Request(url=url)
res = urllib2.urlopen(req )
return res.read() def POST(self):
""" POST请求转发 """
data = web.data() # 转发参数
url = "http://wx.xxxx.com:9000/weixin/?" # 转发地址,与你的路由器端口映射
req = urllib2.Request(url=url, data=data)
res = urllib2.urlopen(req, timeout=10 )
return res.read() if __name__ =="__main__":
app.run()
else:
try:
app = web.application(urls, globals()).wsgifunc()
application = sae.create_wsgi_app(app)
#application = sae.create_wsgi_app(ShellMiddleware(app))
except:
pass

这样,我们本地的开发环境搭建已经基本完成,只需要稍作配置就可以开发了。

感谢您的关注,更多详细,请听下回为您分解。

[置顶] Django 微信开发(一)——环境搭建的更多相关文章

  1. django 1.开发接口环境搭建

    首先需要的环境: pycharm Python 3.6.0 django 2.1.3        安装命令: pip3 install django   查看版本号和安装的路径: pip show ...

  2. Python开发:环境搭建(python3、PyCharm)

    Python开发:环境搭建(python3.PyCharm) python3版本安装 PyCharm使用(完全图解(最新经典))

  3. golang开发android环境搭建_window

    golang开发android环境搭建介绍 一 安装依赖软件: git:版本管理 go:  go开发环境(版本>=1.5),可直接下载window版的go安装包. android studio: ...

  4. IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  5. 【nginx,apache】thinkphp ,laravel,yii2开发运行环境搭建

    缘由 经常会有人问xx框架怎么配置运行环境,这里我就给贴出吉祥三宝(Yii2,Laravel5,Thinkphp5 )的Nginx和Apache的配置,供大家参考 Nginx Yii2 server  ...

  6. 【1】windows下IOS开发基础环境搭建

    一.目的 本文的目的是windows下IOS开发基础环境搭建做了对应的介绍,大家可根据文档步骤进行mac环境部署: 二.安装虚拟机 下载虚拟机安装文件绿色版,点击如下文件安装 获取安装包:       ...

  7. ArcGIS API for Silverlight/ 开发入门 环境搭建

    Silverlight/ 开发入门 环境搭建1 Silverlight SDK下载ArcGIS API for Microsoft Silverlight/WPF ,需要注册一个ESRI Gloab ...

  8. 基于Axis1.4的webservice接口开发(环境搭建)

    基于Axis1.4的webservice接口开发(环境搭建) 一.环境搭建: 1.搜索关键字“Axis1.4”下载Axis1.4相关的jar包. 下载地址:http://download.csdn.n ...

  9. Django 01 django基本介绍及环境搭建

    Django 01 django基本介绍及环境搭建 #http服务器 #用来接收用户请求,并将请求转发给web应用框架进行处理 #Web应用框架 #处理完请求后在发送给http服务器,http服务器在 ...

随机推荐

  1. softmax 杂谈

    在多分类问题中,我们可以使用 softmax 函数,对输出的值归一化为概率值.下面举个例子: import sys sys.path.append("E:/zlab/") from ...

  2. HDU - 1051 Wooden Sticks 贪心 动态规划

    Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)    ...

  3. CentOS 7下MySQL5.7.23的服务配置参数测试

    CentOS 7默认安装MySQL5.7.23,服务管理发生了变化,从sysvinit(service mysql start)变化为systemd(systemctl start mysqld.se ...

  4. 1011 World Cup Betting (20)(20 point(s))

    problem With the 2010 FIFA World Cup running, football fans the world over were becoming increasingl ...

  5. [BZOJ5292][BJOI2018]治疗之雨(概率DP+高斯消元)

    https://blog.csdn.net/xyz32768/article/details/83217209 不难找到DP方程与辅助DP方程,发现DP方程具有后效性,于是高斯消元即可. 但朴素消元显 ...

  6. nginx与Lua执行顺序

    Nginx顺序 Nginx 处理每一个用户请求时,都是按照若干个不同阶段(phase)依次处理的,而不是根据配置文件上的顺序. Nginx 处理请求的过程一共划分为 11 个阶段,按照执行顺序依次是 ...

  7. 安卓中WebKit的使用

    1.在安卓开发中,使用webkit显示网页 步骤: ①初始化一个webkit控件: ②获取webkit的WebSettings对象: ③设置javascript为enable ④为webkit设置&q ...

  8. UVA 350 Pseudo-Random Numbers

     Pseudo-Random Numbers  Computers normally cannot generate really random numbers, but frequently are ...

  9. git一些命令

    ************git基本命令***************git config --global user.name "xielehe" 设置名字git config - ...

  10. spring @Transactional注解无效

    <!-- 配置事务管理器 --> <bean id="transactionManager" class="org.springframework.jd ...