Source code for wego.settings

# -*- coding: utf-8 -*-
"""
wego.settings
default setting
"""
from .exceptions import InitError
import wego
import logging
[docs]def init(**kwargs): """ Init settings, get wechat config at https://mp.weixin.qq.com :param APP_ID: Wechat AppID get it at basic configuration(基本配置). :param APP_SECRET: Wechat AppSecret get it at basic configuration(基本配置). :param REGISTER_URL: As same as you set at interface permissions(接口权限) >> authorized users obtain basic information page(网页授权获取用户基本信息). :param HELPER: Official helper 'wego.helpers.DjangoHelper' and 'wego.helpers.TornadoHelper' or you can customized yourself helper with http://wego.quseit.com/customized/helper(building). :param MCH_ID: (optional) Mac ID get it at https://pay.weixin.qq.com/ (商户号). :param MCH_SECRET: (optional) MCH SECRET As same as you set at https://pay.weixin.qq.com/ (API 密钥). :param CERT_PEM_PATH: (optional) Path to apiclient_cert.pem. :param KEY_PEM_PATH: (optional) Path to apiclient_key.pem. :param PAY_NOTIFY_PATH: (optional) Default notify url for wechat pay callback. :param PUSH_TOKEN: (optional) Set at basic configuration(基本配置). :param PUSH_ENCODING_AES_KEY: (optional) Set at basic configuration(基本配置). :param GET_GLOBAL_ACCESS_TOKEN: (optional) A function that return a global access token, if your application run at multiple servers it required. How to customized your GET_GLOBAL_ACCESS_TOKEN: http://wego.quseit.com/customized/GET_GLOBAL_ACCESS_TOKEN(building). :param USERINFO_EXPIRE: (optional) Set number of seconds expired, default is 0. subscribe, language, remark and groupid still is real time. :param REDIRECT_PATH: (optional) Default redirect path, redirect when we get user`s authorize. :param REDIRECT_STATE: (optional) Default redirect state, redirect when we get user`s authorize. :param DEBUG: (optional) Default is True, When Debug equal True it will log all information and wechat payment only spend a penny(0.01 yuan). :return: :class:`WegoApi <wego.api.WegoApi>` object. :rtype: WegoApi. """ default_settings = { 'GET_GLOBAL_ACCESS_TOKEN': wego.api.official_get_global_access_token, 'USERINFO_EXPIRE': 0, 'DEBUG': False } kwargs = dict(default_settings, **kwargs) check_settings(kwargs) if 'REDIRECT_STATE' not in kwargs: kwargs['REDIRECT_STATE'] = False if 'REDIRECT_PATH' not in kwargs: kwargs['REDIRECT_PATH'] = False if 'PAY_NOTIFY_PATH' in kwargs: kwargs['PAY_NOTIFY_URL'] = kwargs['REGISTER_URL'] + kwargs['PAY_NOTIFY_PATH'][1:] logger = logging.getLogger('wego') formatter = logging.Formatter('%(asctime)s WEGO %(levelname)s: %(message)s', datefmt='%Y/%m/%d %I:%M:%S') ch = logging.StreamHandler() ch.setFormatter(formatter) logger.addHandler(ch) logger.setLevel(logging.INFO) logger.warn = lambda x: logging.Logger.warn(logger, u'\033[1;31m%s\033[0m' % x) if kwargs['DEBUG']: logger.setLevel(logging.DEBUG) logger.warn(u'WEGO 运行在 DEBUG 模式, 微信支付付款金额将固定在 1 分钱.') kwargs['LOGGER'] = logger return wego.WegoApi(WegoSettings(kwargs))
[docs]def check_settings(settings): """ check if settings is available :param settings: a dict. :return: None """ required_list = [ 'APP_ID', 'APP_SECRET', 'REGISTER_URL', 'HELPER' ] # optional_couple optional_couple_list = [ ['MCH_ID', 'MCH_SECRET', 'PAY_NOTIFY_PATH', 'CERT_PEM_PATH', 'KEY_PEM_PATH'], ['PUSH_TOKEN', 'PUSH_ENCODING_AES_KEY'], ] for i in optional_couple_list: for j in i: if j in settings: required_list += i break for i in required_list: if i not in settings or not settings[i]: raise InitError('Missing required parameters "{param}"(缺少必须的参数 "{param}")'.format(param=i)) if not settings['REGISTER_URL'].endswith('/'): raise InitError('REGISTER_URL has to ends with "/"(REGISTER_URL 需以 "/" 结尾)') if 'REDIRECT_PATH' in settings and not settings['REDIRECT_PATH'].startswith('/'): raise InitError('REDIRECT_PATH have to starts with "/"(REDIRECT_PATH 需以 "/" 开始)') if 'PAY_NOTIFY_PATH' in settings and not settings['PAY_NOTIFY_PATH'].startswith('/'): raise InitError('PAY_NOTIFY_PATH have to starts with "/"(PAY_NOTIFY_PATH 需以 "/" 开始)') if type(settings['HELPER']) is str: modules = settings['HELPER'].split('.') settings['HELPER'] = getattr(__import__('.'.join(modules[:-1]), fromlist=['']), modules[-1]) if not issubclass(settings['HELPER'], wego.helpers.BaseHelper): raise InitError('Helper have to inherit the wego.helper.BaseHelper(Helper 必须继承至 wego.helper.BaseHelper)') if not hasattr(settings['GET_GLOBAL_ACCESS_TOKEN'], '__call__'): raise InitError('GET_GLOBAL_ACCESS_TOKEN is not a function(GET_ACCESS_TOKEN 不是一个函数)') # TODO 检查推送消息加解密所需依赖是否安装 PUSH_TOKEN PUSH_ENCODING_AES_KEY settings['DEBUG'] = not not settings['DEBUG']
[docs]class WegoSettings(object): """ Wego settings """ def __init__(self, data): self.data = data def __getattr__(self, key): if key in self.data: return self.data[key] return ''