jsapi.py 3.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. import time
  4. from wechatpy.client.api.base import BaseWeChatAPI
  5. from wechatpy.utils import WeChatSigner
  6. class WeChatJSAPI(BaseWeChatAPI):
  7. """
  8. https://work.weixin.qq.com/api/doc#90001/90144/90539
  9. """
  10. def get_ticket(self):
  11. """
  12. 获取企业的jsapi_ticket
  13. https://work.weixin.qq.com/api/doc#90001/90144/90539/获取企业的jsapi_ticket/
  14. :return: 返回的 JSON 数据包
  15. """
  16. return self._get('get_jsapi_ticket')
  17. def get_jsapi_signature(self, noncestr, ticket, timestamp, url):
  18. """
  19. 获取 JSAPI 签名
  20. https://work.weixin.qq.com/api/doc#90001/90144/90539/签名算法/
  21. :param noncestr: nonce string
  22. :param ticket: JS-SDK ticket
  23. :param timestamp: 时间戳
  24. :param url: URL
  25. :return: 签名
  26. """
  27. data = [
  28. 'noncestr={noncestr}'.format(noncestr=noncestr),
  29. 'jsapi_ticket={ticket}'.format(ticket=ticket),
  30. 'timestamp={timestamp}'.format(timestamp=timestamp),
  31. 'url={url}'.format(url=url),
  32. ]
  33. signer = WeChatSigner(delimiter=b'&')
  34. signer.add_data(*data)
  35. return signer.signature
  36. def get_agent_ticket(self):
  37. """
  38. 获取应用的jsapi_ticket
  39. https://work.weixin.qq.com/api/doc#90001/90144/90539/获取应用的jsapi_ticket/
  40. :return: 返回的 JSON 数据包
  41. """
  42. return self._get('ticket/get', params={'type': 'agent_config'})
  43. def get_jsapi_ticket(self):
  44. """
  45. 获取微信 JS-SDK ticket
  46. 该方法会通过 session 对象自动缓存管理 ticket
  47. :return: ticket
  48. """
  49. ticket_key = '{}_jsapi_ticket'.format(self._client.corp_id)
  50. expires_at_key = '{}_jsapi_ticket_expires_at'.format(self._client.corp_id)
  51. ticket = self.session.get(ticket_key)
  52. expires_at = self.session.get(expires_at_key, 0)
  53. if not ticket or expires_at < int(time.time()):
  54. jsapi_ticket = self.get_ticket()
  55. ticket = jsapi_ticket['ticket']
  56. expires_at = int(time.time()) + int(jsapi_ticket['expires_in'])
  57. self.session.set(ticket_key, ticket)
  58. self.session.set(expires_at_key, expires_at)
  59. return ticket
  60. def get_agent_jsapi_ticket(self):
  61. """
  62. 获取应用的jsapi_ticket
  63. 该方法会通过 session 对象自动缓存管理 ticket
  64. :return: ticket
  65. """
  66. ticket_key = '{}_agent_jsapi_ticket'.format(self._client.corp_id)
  67. expires_at_key = '{}_agent_jsapi_ticket_expires_at'.format(self._client.corp_id)
  68. ticket = self.session.get(ticket_key)
  69. expires_at = self.session.get(expires_at_key, 0)
  70. if not ticket or expires_at < int(time.time()):
  71. jsapi_ticket = self.get_agent_ticket()
  72. ticket = jsapi_ticket['ticket']
  73. expires_at = int(time.time()) + int(jsapi_ticket['expires_in'])
  74. self.session.set(ticket_key, ticket)
  75. self.session.set(expires_at_key, expires_at)
  76. return ticket