Skip to content

Commit

Permalink
Add WeChat customservice session management APIs. Close #29
Browse files Browse the repository at this point in the history
  • Loading branch information
messense committed Mar 9, 2015
1 parent c43eb24 commit f5996fc
Show file tree
Hide file tree
Showing 9 changed files with 221 additions and 1 deletion.
4 changes: 4 additions & 0 deletions tests/fixtures/customservice_kfsession_close.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"errcode": 0,
"errmsg": "ok"
}
4 changes: 4 additions & 0 deletions tests/fixtures/customservice_kfsession_create.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
{
"errcode": 0,
"errmsg": "ok"
}
6 changes: 6 additions & 0 deletions tests/fixtures/customservice_kfsession_getsession.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"errcode" : 0,
"errmsg" : "ok",
"kf_account" : "test1@test",
"createtime": 123456789
}
12 changes: 12 additions & 0 deletions tests/fixtures/customservice_kfsession_getsessionlist.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
{
"sessionlist": [
{
"openid": "OPENID",
"createtime": 123456789
},
{
"openid": "OPENID",
"createtime": 123456789
}
]
}
15 changes: 15 additions & 0 deletions tests/fixtures/customservice_kfsession_getwaitcase.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"count": 150,
"waitcaselist": [
{
"openid": "OPENID",
"kf_account" : "test1@test",
"createtime": 123456789
},
{
"openid": "OPENID",
"kf_account" : "test2@test",
"createtime": 123456789
}
]
}
31 changes: 31 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -264,6 +264,37 @@ def test_customservice_get_online_accounts(self):
result = self.client.customservice.get_online_accounts()
self.assertEqual(2, len(result))

def test_customservice_create_session(self):
with HTTMock(wechat_api_mock):
result = self.client.customservice.create_session(
'openid',
'test1@test'
)
self.assertEqual(0, result['errcode'])

def test_customservice_close_session(self):
with HTTMock(wechat_api_mock):
result = self.client.customservice.close_session(
'openid',
'test1@test'
)
self.assertEqual(0, result['errcode'])

def test_customservice_get_session(self):
with HTTMock(wechat_api_mock):
result = self.client.customservice.get_session('openid')
self.assertEqual('test1@test', result['kf_account'])

def test_customservice_get_session_list(self):
with HTTMock(wechat_api_mock):
result = self.client.customservice.get_session_list('test1@test')
self.assertEqual(2, len(result))

def test_customservice_get_wait_case(self):
with HTTMock(wechat_api_mock):
result = self.client.customservice.get_wait_case()
self.assertEqual(150, result['count'])

def test_datacube_get_user_summary(self):
with HTTMock(wechat_api_mock):
result = self.client.datacube.get_user_summary(
Expand Down
50 changes: 50 additions & 0 deletions tests/test_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -180,3 +180,53 @@ def test_merchant_order_event(self):
self.assertEqual(2, event.order_status)
self.assertEqual('test_product_id', event.product_id)
self.assertEqual('10001:1000012;10002:100021', event.sku_info)

def test_kf_create_session_event(self):
from wechatpy.events import KfCreateSessionEvent

xml = """<xml>
<ToUserName><![CDATA[touser]]></ToUserName>
<FromUserName><![CDATA[fromuser]]></FromUserName>
<CreateTime>1399197672</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[kf_create_session]]></Event>
<KfAccount><![CDATA[test1@test]]></KfAccount>
</xml>"""

event = parse_message(xml)
self.assertTrue(isinstance(event, KfCreateSessionEvent))
self.assertEqual('test1@test', event.account)

def test_kf_close_session_event(self):
from wechatpy.events import KfCloseSessionEvent

xml = """<xml>
<ToUserName><![CDATA[touser]]></ToUserName>
<FromUserName><![CDATA[fromuser]]></FromUserName>
<CreateTime>1399197672</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[kf_close_session]]></Event>
<KfAccount><![CDATA[test1@test]]></KfAccount>
</xml>"""

event = parse_message(xml)
self.assertTrue(isinstance(event, KfCloseSessionEvent))
self.assertEqual('test1@test', event.account)

def test_kf_switch_session_event(self):
from wechatpy.events import KfSwitchSession

xml = """<xml>
<ToUserName><![CDATA[touser]]></ToUserName>
<FromUserName><![CDATA[fromuser]]></FromUserName>
<CreateTime>1399197672</CreateTime>
<MsgType><![CDATA[event]]></MsgType>
<Event><![CDATA[kf_switch_session]]></Event>
<FromKfAccount><![CDATA[test1@test]]></FromKfAccount>
<ToKfAccount><![CDATA[test2@test]]></ToKfAccount>
</xml>"""

event = parse_message(xml)
self.assertTrue(isinstance(event, KfSwitchSession))
self.assertEqual('test1@test', event.from_account)
self.assertEqual('test2@test', event.to_account)
81 changes: 80 additions & 1 deletion wechatpy/client/api/customservice.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from __future__ import absolute_import, unicode_literals
import hashlib

from wechatpy.utils import to_binary
from wechatpy.utils import to_binary, NotNoneDict
from .base import BaseWeChatAPI


Expand Down Expand Up @@ -115,3 +115,82 @@ def get_online_accounts(self):
"""
res = self._get('customservice/getonlinekflist')
return res['kf_online_list']

def create_session(self, openid, account, text=None):
"""
多客服创建会话
详情请参考
http://mp.weixin.qq.com/wiki/2/6c20f3e323bdf5986cfcb33cbd3b829a.html
:param openid: 客户 openid
:param account: 完整客服账号
:param text: 附加信息,可选
:return: 返回的 JSON 数据包
"""
data = NotNoneDict()
data['openid'] = openid
data['kf_account'] = account
data['text'] = text
return self._post(
'customservice/kfsession/create',
data=data
)

def close_session(self, openid, account, text=None):
"""
多客服关闭会话
详情请参考
http://mp.weixin.qq.com/wiki/2/6c20f3e323bdf5986cfcb33cbd3b829a.html
:param openid: 客户 openid
:param account: 完整客服账号
:param text: 附加信息,可选
:return: 返回的 JSON 数据包
"""
data = NotNoneDict()
data['openid'] = openid
data['kf_account'] = account
data['text'] = text
return self._post(
'customservice/kfsession/close',
data=data
)

def get_session(self, openid):
"""
获取客户的会话状态
详情请参考
http://mp.weixin.qq.com/wiki/2/6c20f3e323bdf5986cfcb33cbd3b829a.html
:param openid: 客户 openid
:return: 返回的 JSON 数据包
"""
return self._get(
'customservice/kfsession/getsession',
params={'openid': openid}
)

def get_session_list(self, account):
"""
获取客服的会话列表
详情请参考
http://mp.weixin.qq.com/wiki/2/6c20f3e323bdf5986cfcb33cbd3b829a.html
:param account: 完整客服账号
:return: 客服的会话列表
"""
res = self._get(
'customservice/kfsession/getsessionlist',
params={'kf_account': account}
)
return res['sessionlist']

def get_wait_case(self):
"""
获取未接入会话列表
详情请参考
http://mp.weixin.qq.com/wiki/2/6c20f3e323bdf5986cfcb33cbd3b829a.html
:return: 返回的 JSON 数据包
"""
return self._get('customservice/kfsession/getwaitcase')
19 changes: 19 additions & 0 deletions wechatpy/events.py
Original file line number Diff line number Diff line change
Expand Up @@ -290,3 +290,22 @@ class MerchantOrderEvent(BaseEvent):
order_status = IntegerField('OrderStatus')
product_id = StringField('ProductId')
sku_info = StringField('SkuInfo')


@register_event('kf_create_session')
class KfCreateSessionEvent(BaseEvent):
event = 'kf_create_session'
account = StringField('KfAccount')


@register_event('kf_close_session')
class KfCloseSessionEvent(BaseEvent):
event = 'kf_close_session'
account = StringField('KfAccount')


@register_event('kf_switch_session')
class KfSwitchSession(BaseEvent):
event = 'kf_switch_session'
from_account = StringField('FromKfAccount')
to_account = StringField('ToKfAccount')

0 comments on commit f5996fc

Please sign in to comment.