jsapi.py 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. # -*- coding: utf-8 -*-
  2. from __future__ import absolute_import, unicode_literals
  3. import time
  4. import logging
  5. from library import to_text, random_string
  6. from library.wechatpy.pay.base import BaseWeChatPayAPI
  7. from library.wechatpy.pay.utils import calculate_signature
  8. logger = logging.getLogger(__name__)
  9. class WeChatJSAPI(BaseWeChatPayAPI):
  10. def get_jsapi_signature(self, prepay_id, timestamp=None, nonce_str=None):
  11. """
  12. 获取 JSAPI 签名
  13. :param prepay_id: 统一下单接口返回的 prepay_id 参数值
  14. :param timestamp: 可选,时间戳,默认为当前时间戳
  15. :param nonce_str: 可选,随机字符串,默认自动生成
  16. :return: 签名
  17. """
  18. data = {
  19. 'appId': self.sub_appid or self.appid,
  20. 'timeStamp': timestamp or to_text(int(time.time())),
  21. 'nonceStr': nonce_str or random_string(32),
  22. 'signType': 'MD5',
  23. 'package': 'prepay_id={0}'.format(prepay_id),
  24. }
  25. return calculate_signature(
  26. data,
  27. self._client.api_key if not self._client.sandbox else self._client.sandbox_api_key
  28. )
  29. def get_jsapi_params(self, prepay_id, timestamp=None, nonce_str=None, jssdk=False):
  30. """
  31. 获取 JSAPI 参数
  32. :param prepay_id: 统一下单接口返回的 prepay_id 参数值
  33. :param timestamp: 可选,时间戳,默认为当前时间戳
  34. :param nonce_str: 可选,随机字符串,默认自动生成
  35. :param jssdk: 前端调用方式,默认使用 WeixinJSBridge
  36. 使用 jssdk 调起支付的话,timestamp 的 s 为小写
  37. 使用 WeixinJSBridge 调起支付的话,timeStamp 的 S 为大写
  38. :return: 参数
  39. """
  40. data = {
  41. 'appId': self.sub_appid or self.appid,
  42. 'timeStamp': timestamp or to_text(int(time.time())),
  43. 'nonceStr': nonce_str or random_string(32),
  44. 'signType': 'MD5',
  45. 'package': 'prepay_id={0}'.format(prepay_id),
  46. }
  47. sign = calculate_signature(
  48. data,
  49. self._client.api_key if not self._client.sandbox else self._client.sandbox_api_key
  50. )
  51. logger.debug('JSAPI payment parameters: data = %s, sign = %s', data, sign)
  52. data['paySign'] = sign
  53. if jssdk:
  54. data['timestamp'] = data.pop('timeStamp')
  55. return data