测试号+新浪云+python微信公众平台开发入门
为了了解微信公众平台开发,着手做了一个公众号的demo,主要实现:自定制菜单栏,点击菜单中的选项打开对应的web页面。
因为还没有注册开发者帐号,于是先注册了微信公众平台测试号(支持微信公众平台所有接口)。然后使用新浪云服务(短时间内免费,适合初学者练手)作为服务器。
申请微信公众平台测试账号
浏览器中打开链接,http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login。扫码登录之后,网页会列出测试号的appID
、appsecret
以及测试号的二维码等信息。
扫描测试号的二维码就可以关注测试的公众号了,用户列表中会显示已关注这个公众号的用户。
测试号二维码和用户列表新浪云服务器
-
前往http://sae.sina.com.cn 注册新浪云账号。(邮箱和安全密码在之后使用Git时会用到。)
-
到用户中心中创建“云应用SAE”。选择python以及git。填写域名(在公众号设置中会用到)。
新浪云新建云应用SAE
-
创建版本。到应用>代码管理中可以查看应用并且创建版本。创建之后如下图所示,就可以编辑代码,上传代码包了。在应用管理中可以看到应用对应的网址。
创建版本
应用信息 -
点击“编辑代码”打开
SAE CLOUD EDTOR
。项目下默认只有一个文件index.wsgi
。 -
按照代码管理中的git仓库信息,把项目克隆到本地(使用新浪云账号的邮箱和安全密码),运行
python index.wsgi 80
命令。再打开上面配置的网址 http://testwechatapp.applinzi.com/ ,可以看到"Hello, SAE!",说明是OK了。
配置公众平台开发账号
index.wsgi文件:
#coding: UTF-8
import sae
import web
from handle import Handle
urls = (
'/wx','Handle'
)
app = web.application(urls, globals()).wsgifunc()
application = sae.create_wsgi_app(app)
handle.py文件:
# -*- coding: utf-8 -*-
# filename: handle.py
import hashlib
import web
class Handle(object):
def GET(self):
try:
data = web.input()
if len(data) == 0:
return "hello, this is handle view"
signature = data.signature
timestamp = data.timestamp
nonce = data.nonce
echostr = data.echostr
token = "hello2017" #跟公众平台开发账号的基本配置中的token相同
list = [token, timestamp, nonce]
list.sort()
sha1 = hashlib.sha1()
map(sha1.update, list)
hashcode = sha1.hexdigest()
print "handle/GET func: hashcode, signature: ", hashcode, signature
if hashcode == signature:
return echostr
else:
return ""
except Exception, Argument:
return Argument
再次运行python index.wsgi 80
命令,访问
http://testwechatapp.applinzi.com/wx 页面,显示“hello, this is handle view”的信息表示成功。
接下来配置公众平台开发账号,填写服务器url,并自定义一个token
,用于访问服务器时的验证。注意这个token跟服务器中设置的token相同,url中的/wx
对应index.wsgi代码中的urls
的值。再点击“提交”按钮,配置成功会有提示信息。
制作菜单栏
新建basic.py:
# -*- coding: utf-8 -*-
# filename: basic.py
import urllib
import time
import json
class Basic:
def __init__(self):
self.__accessToken = ''
self.__leftTime = 0
def __real_get_access_token(self):
appId = "wxf9427dc053581219"
appSecret = "e3fbcfe5921fd508cf621668879ab15a"
postUrl = ("https://api.weixin.qq.com/cgi-bin/token?grant_type="
"client_credential&appid=%s&secret=%s" % (appId, appSecret))
urlResp = urllib.urlopen(postUrl)
urlResp = json.loads(urlResp.read())
self.__accessToken = urlResp['access_token']
self.__leftTime = urlResp['expires_in']
def get_access_token(self):
if self.__leftTime < 10:
self.__real_get_access_token()
return self.__accessToken
def run(self):
while(True):
if self.__leftTime > 10:
time.sleep(2)
self.__leftTime -= 2
else:
self.__real_get_access_token()
新建menu.py
# -*- coding: utf-8 -*-
# filename: menu.py
import urllib
from basic import Basic
class Menu(object):
def __init__(self):
pass
def create(self, postData, accessToken):
postUrl = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=%s" % accessToken
if isinstance(postData, unicode):
postData = postData.encode('utf-8')
urlResp = urllib.urlopen(url=postUrl, data=postData)
print urlResp.read()
def query(self, accessToken):
postUrl = "https://api.weixin.qq.com/cgi-bin/menu/get?access_token=%s" % accessToken
urlResp = urllib.urlopen(url=postUrl)
print urlResp.read()
def delete(self, accessToken):
postUrl = "https://api.weixin.qq.com/cgi-bin/menu/delete?access_token=%s" % accessToken
urlResp = urllib.urlopen(url=postUrl)
print urlResp.read()
#获取自定义菜单配置接口
def get_current_selfmenu_info(self, accessToken):
postUrl = "https://api.weixin.qq.com/cgi-bin/get_current_selfmenu_info?access_token=%s" % accessToken
urlResp = urllib.urlopen(url=postUrl)
print urlResp.read()
if __name__ == '__main__':
myMenu = Menu()
postJson = """
{
"button":
[
{
"name": "更多信息",
"sub_button":
[
{
"type": "view",
"name": "百度一下",
"url": "http://www.baidu.cn/"
]
},
]
}
"""
accessToken = Basic().get_access_token()
#myMenu.delete(accessToken)
myMenu.create(postJson, accessToken)
运行python menu.py 80
命令之后,重新关注公众号。可以看到自定义的菜单栏。点击就可以打开页面了。
参考链接:
- 微信公众平台官网-入门指引:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5
- Python+sae搭建微信公众平台后台新手教程:http://www.jianshu.com/p/c81262593c88