Skip to content

Commit

Permalink
Add some WeChat JS SDK related APIs
Browse files Browse the repository at this point in the history
  • Loading branch information
messense committed Mar 5, 2015
1 parent a13b6a1 commit 1c11af9
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 2 deletions.
6 changes: 6 additions & 0 deletions tests/fixtures/ticket_getticket.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
{
"errcode":0,
"errmsg":"ok",
"ticket":"bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA",
"expires_in":7200
}
25 changes: 25 additions & 0 deletions tests/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -399,3 +399,28 @@ def test_datacube_get_upstream_msg_dist_month(self):
'2014-12-07'
)
self.assertEqual(1, len(result))

def test_jsapi_get_ticket(self):
with HTTMock(wechat_api_mock):
result = self.client.jsapi.get_ticket()
self.assertEqual(
'bxLdikRXVbTPdHSM05e5u5sUoXNKd8-41ZO3MhKoyN5OfkWITDGgnr2fwJ0m9E8NYzWKVZvdVtaUgWvsdshFKA', # NOQA
result['ticket']
)
self.assertEqual(7200, result['expires_in'])

def test_jsapi_get_jsapi_signature(self):
noncestr = 'Wm3WZYTPz0wzccnW'
ticket = 'sM4AOVdWfPE4DxkXGEs8VMCPGGVi4C3VM0P37wVUCFvkVAy_90u5h9nbSlYy3-Sl-HhTdfl2fzFy1AOcHKP7qg' # NOQA
timestamp = 1414587457
url = 'http://mp.weixin.qq.com?params=value'
signature = self.client.jsapi.get_jsapi_signature(
noncestr,
ticket,
timestamp,
url
)
self.assertEqual(
'0f9de62fce790f9a083d5c99e95740ceb90c27ed',
signature
)
1 change: 1 addition & 0 deletions wechatpy/client/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,7 @@ def __init__(self, appid, secret, access_token=None):
self.merchant = api.WeChatMerchant(weak_self)
self.customservice = api.WeChatCustomService(weak_self)
self.datacube = api.WeChatDataCube(weak_self)
self.jsapi = api.WeChatJSAPI(weak_self)

def fetch_access_token(self):
"""
Expand Down
1 change: 1 addition & 0 deletions wechatpy/client/api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,3 +12,4 @@
from .merchant import WeChatMerchant # NOQA
from .customservice import WeChatCustomService # NOQA
from .datacube import WeChatDataCube # NOQA
from .jsapi import WeChatJSAPI # NOQA
39 changes: 39 additions & 0 deletions wechatpy/client/api/jsapi.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
# -*- coding: utf-8 -*-
"""
wechatpy.client.js
~~~~~~~~~~~~~~~~~~~~
This module provides some APIs for JS SDK
:copyright: (c) 2014 by messense.
:license: MIT, see LICENSE for more details.
"""
from __future__ import absolute_import, unicode_literals

from wechatpy.utils import WeChatSigner
from .base import BaseWeChatAPI


class WeChatJSAPI(BaseWeChatAPI):

def get_ticket(self, type='jsapi'):
"""
获取微信 JS-SDK ticket
:return: 返回的 JSON 数据包
"""
return self._get(
'ticket/getticket',
params={'type': type}
)

def get_jsapi_signature(self, noncestr, ticket, timestamp, url):
data = [
'noncestr={noncestr}'.format(noncestr=noncestr),
'jsapi_ticket={ticket}'.format(ticket=ticket),
'timestamp={timestamp}'.format(timestamp=timestamp),
'url={url}'.format(url=url),
]
signer = WeChatSigner(delimiter=b'&')
signer.add_data(*data)
return signer.signature
5 changes: 3 additions & 2 deletions wechatpy/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,8 +38,9 @@ def __setitem__(self, key, value, dict_setitem=dict.__setitem__):
class WeChatSigner(object):
"""WeChat data signer"""

def __init__(self):
def __init__(self, delimiter=b''):
self._data = []
self._delimiter = to_binary(delimiter)

def add_data(self, *args):
"""Add data to signer"""
Expand All @@ -50,7 +51,7 @@ def add_data(self, *args):
def signature(self):
"""Get data signature"""
self._data.sort()
str_to_sign = b''.join(self._data)
str_to_sign = self._delimiter.join(self._data)
return hashlib.sha1(str_to_sign).hexdigest()


Expand Down

0 comments on commit 1c11af9

Please sign in to comment.