예제 #1
0
 def decrypt(self, text, appid):
     """对解密后的明文进行补位删除
     @param text: 密文
     @return: 删除填充补位后的明文
     """
     try:
         cryptor = AES.new(self.key, self.mode, self.key[:16])
         # 使用BASE64对密文进行解码,然后AES-CBC解密
         plain_text = cryptor.decrypt(base64.b64decode(text))
     except Exception:
         return WXBizMsgCrypt_DecryptAES_Error, None
     try:
         if not isinstance(plain_text[-1], int):
             pad = ord(plain_text[-1])
         else:
             pad = plain_text[-1]
         # 去掉补位字符串
         # pkcs7 = PKCS7Encoder()
         # plain_text = pkcs7.encode(plain_text)
         # 去除16位随机字符串
         content = plain_text[16:-pad]
         xml_len = socket.ntohl(struct.unpack(b"I", content[:4])[0])
         xml_content = content[4:xml_len + 4]
         from_appid = smart_bytes(content[xml_len + 4:])
     except Exception:
         return WXBizMsgCrypt_IllegalBuffer, None
     if from_appid != smart_bytes(appid):
         return WXBizMsgCrypt_ValidateAppid_Error, None
     return 0, xml_content
예제 #2
0
 def decrypt(self, text, appid):
     """对解密后的明文进行补位删除
     @param text: 密文
     @return: 删除填充补位后的明文
     """
     try:
         cryptor = AES.new(self.key, self.mode, self.key[:16])
         # 使用BASE64对密文进行解码,然后AES-CBC解密
         plain_text = cryptor.decrypt(base64.b64decode(text))
     except Exception:
         return WXBizMsgCrypt_DecryptAES_Error, None
     try:
         if not isinstance(plain_text[-1], int):
             pad = ord(plain_text[-1])
         else:
             pad = plain_text[-1]
         # 去掉补位字符串
         # pkcs7 = PKCS7Encoder()
         # plain_text = pkcs7.encode(plain_text)
         # 去除16位随机字符串
         content = plain_text[16:-pad]
         xml_len = socket.ntohl(struct.unpack(b"I", content[:4])[0])
         xml_content = content[4:xml_len+4]
         from_appid = smart_bytes(content[xml_len+4:])
     except Exception:
         return WXBizMsgCrypt_IllegalBuffer, None
     if from_appid != smart_bytes(appid):
         return WXBizMsgCrypt_ValidateAppid_Error, None
     return 0, xml_content
예제 #3
0
 def encrypt(self, text, appid):
     """对明文进行加密
     @param text: 需要加密的明文
     @return: 加密得到的字符串
     """
     # 16位随机字符串添加到明文开头
     pack_str = struct.pack(b"I", socket.htonl(len(text)))
     text = smart_bytes(self.get_random_str()) + pack_str + smart_bytes(text) + smart_bytes(appid)
     # 使用自定义的填充方式对明文进行补位填充
     pkcs7 = PKCS7Encoder()
     text = pkcs7.encode(text)
     # 加密
     cryptor = AES.new(self.key, self.mode, self.key[:16])
     try:
         ciphertext = cryptor.encrypt(text)
         # 使用BASE64对加密后的字符串进行编码
         return WXBizMsgCrypt_OK, base64.b64encode(ciphertext)
     except Exception:
         return WXBizMsgCrypt_EncryptAES_Error, None
예제 #4
0
def params_filter(params, delimiter='&', charset='utf-8',
                  excludes=['sign', 'sign_type']):
    if six.PY3:
        ks = sorted(params)
    else:
        ks = params.keys()
        ks.sort()
    newparams = {}
    prestr = ''
    if params.get('input_charset', None):
        charset = params['input_charset']
    for k in ks:
        v = params[k]
        k = smart_bytes(k, charset)
        if k not in excludes and v != '':
            newparams[k] = smart_bytes(v, charset)
            prestr += '%s=%s%s' % (k, newparams[k], delimiter)
    prestr = prestr[:-1]
    return newparams, prestr
예제 #5
0
 def encode(self, text):
     """ 对需要加密的明文进行填充补位
     @param text: 需要进行填充补位操作的明文
     @return: 补齐明文字符串
     """
     text_length = len(text)
     # 计算需要填充的位数
     amount_to_pad = self.block_size - (text_length % self.block_size)
     if amount_to_pad == 0:
         amount_to_pad = self.block_size
     # 获得补位所用的字符
     pad = smart_bytes(chr(amount_to_pad))
     return text + pad * amount_to_pad
예제 #6
0
 def encode(self, text):
     """ 对需要加密的明文进行填充补位
     @param text: 需要进行填充补位操作的明文
     @return: 补齐明文字符串
     """
     text_length = len(text)
     # 计算需要填充的位数
     amount_to_pad = self.block_size - (text_length % self.block_size)
     if amount_to_pad == 0:
         amount_to_pad = self.block_size
     # 获得补位所用的字符
     pad = smart_bytes(chr(amount_to_pad))
     return text + pad * amount_to_pad
예제 #7
0
 def prepare_request(self, method, path, params):
     kwargs = {}
     _params = self.get_base_params()
     params.update(_params)
     newparams, prestr = params_filter(params)
     sign = build_mysign(prestr, self.partner_key)
     # 将内容转化为unicode xmltodict 只支持unicode
     newparams = params_encoding(newparams)
     newparams['sign'] = sign
     xml_dict = {'xml': newparams}
     kwargs['data'] = smart_bytes(xmltodict.unparse(xml_dict))
     url = self._full_url(path)
     if self.mch_cert and self.mch_key:
         kwargs['cert'] = (self.mch_cert, self.mch_key)
     return method, url, kwargs
예제 #8
0
def generation_objectid():
    random_str = ''.join(random.sample(safe_char[:-4], 12))
    # return random_str
    return ObjectId(smart_bytes(random_str))
예제 #9
0
openid = ""
form_id = "0e282a55bc674d9abf9aa2e33eed2768"
imageId = ""
json_body = {
    "touser": openid,
    "template_id": template_id,
    "page": "/pages/history/detail/detail?id=%s" % imageId,
    "form_id": form_id,
    "data": {
        "keyword1": {
            # 时间
            "value": datetime.now().strftime("%Y-%m-%d %H:%M:%S")
        },
        "keyword2": {
            # 备注
            "value": smart_bytes("请点击查看").decode("latin1")
        },
        "keyword3": {
            # 状态
            "value": smart_bytes("图片已经生成").decode("latin1"),
            "color": "#173177",
        },
    },
    "emphasis_keyword": "keyword3.DATA",
}

api = WXAPPAPI(access_token=token)
resp = api.send_template(json_body=json_body)
print(resp)

예제 #10
0
# -*- coding: utf-8 -*-

from weixin.helper import smart_bytes
from weixin.pay import WeixinPay

APPID = 'appid'
MCH_ID = 'mchid'

create_pay_info = {
    'body': smart_bytes("这里写点啥呢?"),
    'out_trade_no': '20181206130823938475',
    'total_fee': 1,
    'trade_type': "JSAPI",
    'openid': 'ol9GscXefkyakBnRV4s',
}

wxpay = WeixinPay(APPID,
                  MCH_ID,
                  partner_key='partner key',
                  notify_url='http://www.qq.com/pay/notify')
order = wxpay.unifiedorder(**create_pay_info)

print(order)