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
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
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
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
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
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
def generation_objectid(): random_str = ''.join(random.sample(safe_char[:-4], 12)) # return random_str return ObjectId(smart_bytes(random_str))
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)
# -*- 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)