#1:生成下单请求参数字符串
def make_payment_request(self,params_dict):
""
"
构造支付请求参数
:param params_dict:
:
return
:
""
"
query_str = self.params_to_query(params_dict,) # 拼接参数字符串
sign = self.make_sign(query_str) # 生成签名
sign = urllib.quote(sign, safe='') #解决中文参数编码问题
res =
"%s&sign=%s"
% (query_str, sign)
return
res
def params_to_query(self,params):
""
"
生成需要签名的字符串
:param params:
:
return
:
""
"
""
"
:param params:
:
return
:
""
"
query =
""
dict_items = {}
for
key, value in params.items():
if
isinstance(value, dict) == True:
dict_items[key] = value
params[key] =
"%s"
all_str = ''
for
key in sorted(params.keys()): #把参数按key值排序:这是支付宝下单请求的参数格式规定
all_str = all_str + '%s=%s&' % (key, params[key])
all_str = all_str.rstrip('&')
biz_content_dict = dict_items['biz_content']
content_str = ''
for
key in sorted(biz_content_dict.keys()):
if
isinstance(biz_content_dict[key], basestring) == True:
content_str = content_str + '
"%s"
:
"%s"
,' % (key, biz_content_dict[key])
else
:
content_str = content_str + '
"%s"
:%s,' % (key, biz_content_dict[key])
content_str = content_str.rstrip(',')
content_str = '{' + content_str + '}'
query = all_str % content_str
return
query
def make_sign(self,para_str):
""
"
生成签名
:param message:
:
return
:
""
"
private_key = OpenSSL.crypto.load_privatekey(OpenSSL.crypto.FILETYPE_PEM, open(
'./路径/private_key.txt').read()) #把私钥存到一个文件里,加载出来【尝试过用rsa模块的方法加载私钥字符串,会报格式错误。查看源码得知,需要从文件流加载】
import sys
reload(sys)
sys.setdefaultencoding('utf-8') #这三句:解决签名方法编码报错
sign = base64.encodestring(OpenSSL.crypto.sign(private_key, para_str, 'sha256'))
return
sign