Odoo中文网|Odoo实施培训

 找回密码
 立即注册
搜索
热搜: Odoo OpenERP 实施
查看: 8632|回复: 1
打印 上一主题 下一主题

微信企业号

[复制链接]

8

主题

8

帖子

28

积分

新手上路

Rank: 1

积分
28
跳转到指定楼层
楼主
发表于 2015-9-14 20:12:20 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
企业号出来了。姑且不论大家是接受还是抵触。
作为一个技术人员,我们要抱着发现新大陆的态度。
不过这个新大陆有点让我蛋疼,尤其在中文的处理上莫名其妙。好吧,如果你要推海外市场,可能它是一个很好的选择,用于替换手机上的app,野心有点大,估计安卓和苹果都不干了。

闲话少讲,直奔主题。
模式:主动模式这个就是说,主动去骚扰用户,你可以调用腾信的企业号的api,用于给关注你的企业号的人,push各种东西(消息、新闻、视频,声音等),以及修改企业号里面的相关信息(通讯录,组织架构之类的)
回调模式这个比上面的有好点,用户通过微信找我们,让我们提供服务。这时服务可以以主动模式提供过去,这就不叫做骚扰了。
webjs模式做些装饰性的工作。略。

体验一把开发语言:python
服务器: ubuntu 12

接下来上代码,我们大致的体验下主动模式和回调模式。
主动模式首先,腾讯要求,你要骚扰用户,必须有凭证token。好吧,token这样获取:
1
2
3
4
5
6
7
8
def getTokenIntime(CorpId,Secret):
    res = urllib2.urlopen('https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s'%(CorpId,Secret))
    res_dict = simplejson.loads(res.read())
    token = res_dict.get('access_token',False)
    if not token:
        with open(r'./wx_log.txt','ab') as f:
            f.write(u'异常: 无法取得token')
    return token




token有超时时间,目前是2个小时。也就是说,获取一次token,两个小时以内就不用再次获取了。
好了,拿到凭证了,接着可以骚扰别人了,以发短信为例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
def sendTxtMsg(token,content,to_user="@all",to_party="",to_tag="",application_id=0,safe=0):
    try:
        data = {
           "touser": to_user,
           "toparty": to_party,
           "totag": to_tag,
           "msgtype": "text",
           "agentid": application_id,
           "text": {
               "content": content,
           },
           "safe":safe
        }

        data = simplejson.dumps(data,ensure_ascii=False)
        if Debug:
            with open(r'./wx_data.txt','ab') as f:
                f.write(data+'\r\n')
        req = urllib2.Request('https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=%s'%(token,))        
        resp = urllib2.urlopen(req,data)
        msg = u'返回值:' + resp.read()
    except Exception,ex:
        msg = u'异常:' + str(ex)
    finally:
        with open(r'./wx_log.txt','ab') as f:
            f.write(msg+'\r\n')




之后发送新闻神马的,略了。
目前发现,声音/图片/视频,所谓的media_id,根本找不到,我确定我找过了企业号平台的每一个角落。所以这三个目前发不了。

好吧,主动模式玩了一段之后,发现似乎太无趣了。中文超过一定字数,直接报错{"errcode":41011,"errmsg":"missing agentid"}。在企业号的开发者论坛上问了,无人应答。

好吧,自我安慰下,瑕不掩瑜,虽然我们都是中国人,虽然基本等于宣判不能大肆用中文。试试回调模式,看看中文问题能否得到解决。
回调模式首先,要开启回调模式, 也就是告诉企业号你的服务器url,你想要的token和密钥。
直接设了,点击,报错,各种错。受不了了。好吧,看看文档。
文档说,开启回调模式,需要进行“两次握手”,也许是三次。而不是设置了就好了。
第一次,企业号想你的服务器发送一段信息,post方式,内容放在xml里面。(暗号)
第二次,你的服务器将内容解密,返回给企业号。(明文)
第三次,企业号,将你发过来的明文进行比对什么的,然后反馈给在web后台操作的你。(核对)
严格来讲,第三次,不算握手。

接下来,动手:
首先,你需要一个公网的服务器(没有的话自行解决)。
其次,你需要在服务器上部署一个web应用,接受企业号的暗号并解密回传之用。
简而言之,其实只需要一个在公网的应用即可(比如 GAE 应用)。

由于只是测试,因此简单新建了一个django项目。
路由映射
1
url(r'^$','wx_handler.views.veryfi_callback'),




视图:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
# -*- coding: utf-8 -*-
from django.shortcuts import render
from django.http import HttpResponse
from .WXBizMsgCrypt import WXBizMsgCrypt
import xml.etree.cElementTree as ET

def veryfi_callback(req):
    msg_signature = req.GET.get('msg_signature',False)
    timestamp = req.GET.get('timestamp',False)
    nonce = req.GET.get('nonce',False)
    wxcpt = WXBizMsgCrypt('MJyh7es2bn1R','8j1F3fXp3eGn6RMeC17RtYiHiEUxUpgCrXassD3vHVE','wxd33505f2be01d541')
    if req.method =='GET':
        echostr = req.GET.get('echostr',False)
        ret,sEchoStr=wxcpt.VerifyURL(msg_signature, timestamp,nonce,echostr)
        if(ret!=0):
            ret_val = "ERR: VerifyURL ret: " + str(ret)
            return ret_val

        return HttpResponse(sEchoStr)
    else:
        if req.method=='POST':
            data = req.body #not POST
            ret,sMsg=wxcpt.DecryptMsg(data, msg_signature, timestamp, nonce)
            if( ret!=0 ):
                ret_val =  "ERR: DecryptMsg ret: " + str(ret)
                return HttpResponse(ret_val)

            xml_tree = ET.fromstring(sMsg)
            from_uid = xml_tree.find('FromUserName').text
            content = xml_tree.find("Content").text

            sRespData = "<xml><ToUserName><![CDATA[%s]]></ToUserName><FromUserName><![CDATA[wxd33505f9be01d541]]></FromUserName><CreateTime>1348831860</CreateTime><MsgType><![CDATA[text]]></MsgType><Content><![CDATA[%s]]></Content><MsgId>1</MsgId><AgentID>1</AgentID></xml>"%(from_uid,'you saied:' + content,)
            ret,sEncryptMsg=wxcpt.EncryptMsg(sRespData, nonce, timestamp)
            return HttpResponse(sEncryptMsg)
        else:
            return HttpResponse("http method not suppoted")





其中,有几个地方小小的掉进坑里了。
由于企业号抛过来的数据类型是 text/xml, 因此用 request.POST是抓不到数据的。
然后,不能有csrf_token保护,因为企业号肯定不会考虑传入一个form,然后加上csrf_token。因此需要把对应的middleware给取消掉。(反正我是把所有middleware全部屏蔽了)

最后,这个只是针对消息的回复。(不会处理event)

回复

使用道具 举报

11

主题

33

帖子

101

积分

注册会员

Rank: 2

积分
101
沙发
发表于 2015-10-31 23:34:33 | 只看该作者
微信端大有可为!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|技术支持|开发手册|Odoo中文网-远鼎旗下odoo培训网站 ( 苏ICP备15039516号 )

GMT+8, 2024-5-3 09:13 , Processed in 0.011972 second(s), 8 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表