提交 acfae641 authored 作者: 李思鑫's avatar 李思鑫

zsk 支付相关

上级 d4ae7f00
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDFROPf3SA7LPmGcNioy4u1ub+tSR9bNhwYc1vdWhCp6Q3AjNSdXQNy3nTUFxtehmmFXTd2nHoY1ogApvecL+6Uks4ExakQTv20UUbXoRZsAUW3QU018+ljqwkB+DcxWViwiXdCBIMvsNSHIDIxx/PyX1HO3Ok6iB3bhQkrm7zlhQIDAQAB
-----END PUBLIC KEY-----
...@@ -26,7 +26,6 @@ class Pay(models.Model): ...@@ -26,7 +26,6 @@ class Pay(models.Model):
cert_serial_no=models.CharField(_('商户证书序列号'),max_length=100,blank=True,null=True) cert_serial_no=models.CharField(_('商户证书序列号'),max_length=100,blank=True,null=True)
cert_path=models.CharField(_('证书地址'),max_length=200) cert_path=models.CharField(_('证书地址'),max_length=200)
pay_id=models.CharField(_('商户号'),max_length=100) pay_id=models.CharField(_('商户号'),max_length=100)
remark=models.CharField(_('备注'),max_length=200,blank=True,null=True) remark=models.CharField(_('备注'),max_length=200,blank=True,null=True)
comp_abbr=models.CharField(_('公司缩写'),max_length=100,blank=True,null=True) comp_abbr=models.CharField(_('公司缩写'),max_length=100,blank=True,null=True)
send_hb_method = models.SmallIntegerField(_('发放类型'),blank=True,null=True) send_hb_method = models.SmallIntegerField(_('发放类型'),blank=True,null=True)
...@@ -37,7 +36,8 @@ class Pay(models.Model): ...@@ -37,7 +36,8 @@ class Pay(models.Model):
pay_platform_pn=models.CharField(_('支付平台项目编码'),max_length=50,blank=True,null=True) pay_platform_pn=models.CharField(_('支付平台项目编码'),max_length=50,blank=True,null=True)
aes_key=models.CharField(_('aes密码'),max_length=50,blank=True,null=True) aes_key=models.CharField(_('aes密码'),max_length=50,blank=True,null=True)
aes_iv=models.CharField(_('aes偏移值'),max_length=50,blank=True,null=True) aes_iv=models.CharField(_('aes偏移值'),max_length=50,blank=True,null=True)
public_key_id=models.CharField(_('公钥id'),max_length=500,blank=True,null=True)
public_key=models.CharField(_('公钥'),max_length=500,blank=True,null=True)
class Meta: class Meta:
verbose_name = _('微信商户平台') verbose_name = _('微信商户平台')
......
差异被折叠。
#橙券支付
#中数科支付 #中数科支付
#接口文档 https://doc.apipost.net/docs/detail/34ff33e7bce7000?target_id=ef551d7ba901a #接口文档 https://doc.apipost.net/docs/detail/34ff33e7bce7000?target_id=ef551d7ba901a
...@@ -19,45 +18,34 @@ from cryptography.hazmat.primitives.asymmetric import rsa ...@@ -19,45 +18,34 @@ from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization, hashes from cryptography.hazmat.primitives import serialization, hashes
from cryptography.hazmat.primitives.asymmetric import padding from cryptography.hazmat.primitives.asymmetric import padding
from wx.models import *
env = 'prod'
domainMap={
'dev':'http://ywymtest-api.azhiyun.cn',
'prod':'https://ywym-api.qidianpw.com'
}
env = 'dev'
domain='http://ywymtest-api.azhiyun.cn'
sign = { domain = domainMap[env]
'dev': {
'ym-id': '645206198756315136',
'ym-key': '15a5ba24711540f0bd3246b92a7c7daa'
},
'prod':{}
}
class ZSKPay: class ZSKPay:
def __init__(self): def __init__(self, appid, taxId, ymId, ymKey, cert):
self.MAX_ENCRYPTION_SIZE = 117 #214 self.MAX_ENCRYPTION_SIZE = 117 #214
self.appid = appid
# 计算签名 self.domain = domain
def generate_sign(self,data): self.taxId = taxId
# # 1. 整理参数 self.ymId = ymId
# sorted_keys = sorted(data.keys()) self.ymKey = ymKey
# sorted_data = [] self.cert = cert
# for key in sorted_keys:
# sorted_data.append(f"{key}={data[key]}")
# # 2. 连接参数
# params_string = '&'.join(sorted_data)
# # 3. 添加签名秘钥
# params_string += f"&key={self.k}"
# # 4. MD5 加密
# sign = hashlib.md5(params_string.encode('utf-8')).hexdigest().upper()
return 'sign'
def encrypt_data(self, data): def encrypt_data(self, data):
encrypted_chunks = [] encrypted_chunks = []
current_directory = os.getcwd() current_directory = os.getcwd()
with open(current_directory+"/wx/cert/zsk/req/public_key.txt", "rb") as public_file: with open(self.cert + "public_key.txt", "rb") as public_file:
public_key_content = public_file.read() public_key_content = public_file.read()
public_key_loaded = serialization.load_pem_public_key( public_key_loaded = serialization.load_pem_public_key(
...@@ -110,17 +98,17 @@ class ZSKPay: ...@@ -110,17 +98,17 @@ class ZSKPay:
# print("加密后数据:", type(data), data) # print("加密后数据:", type(data), data)
headers = { headers = {
'Content-Type': 'application/json', 'Content-Type': 'application/json',
**sign[env] 'ym-id':self.ymId,
'ym-key':self.ymKey
} }
request = urllib.request.Request(domain + url, bytes(json.dumps({'data': data}), "utf8"), headers, method='POST') request = urllib.request.Request(self.domain + url, bytes(json.dumps({'data': data}), "utf8"), headers, method='POST')
# 发送请求并获取响应 # 发送请求并获取响应
try: try:
response = urllib.request.urlopen(request) response = urllib.request.urlopen(request)
# 读取响应体 # 读取响应体
res_body = response.read().decode('utf-8') res_body = response.read().decode('utf-8')
print("返回结果:", res_body)
return json.loads(res_body) return json.loads(res_body)
...@@ -131,19 +119,26 @@ class ZSKPay: ...@@ -131,19 +119,26 @@ class ZSKPay:
#转账 #转账
def transfer(self,data): def transfer(self,data):
print('开始转账:') if not data['transferNo'] or not data['transferAmount'] or not data['transferRemark'] or not data['openid'] :
raise ValueError("transferDetailList 必传")
company_id = data.get('company_id','')
batchNo = data.get('transferNo', self.generate_batchNo())
batchName = data.get('batchName','活动批次')
batchRemark = data.get('batchRemark','无')
transferDetailList = []
transferDetailList.append(data)
handle_data = { handle_data = {
"taxId": 1836580691238883330, "taxId": self.taxId,
"batchNo":data.get('batchNo', self.generate_batchNo()), "batchNo": batchNo,
"appid": data.get('appid','wxb8516c6064271fe4'), "appid": self.appid,
"batchName": data.get('batchName','活动批次'), "batchName": batchName,
"batchRemark": data.get('batchRemark','默认备注'), "batchRemark": batchRemark,
"totalAmount": 0, "totalAmount": 0,
"totalNum": 0, #转账总笔数 "totalNum": 0, #转账总笔数
"transferSceneId": "", #转账场景ID "transferSceneId": "", #转账场景ID
"notifyUrl": "", #回调地址 "notifyUrl": "", #回调地址
#转账明细列表 #转账明细列表
"transferDetailList":data.get('transferDetailList',[]) "transferDetailList": transferDetailList
# [ # [
# { # {
# "transferNo": "tj_consumer_winner_001", //商家明细单号 # "transferNo": "tj_consumer_winner_001", //商家明细单号
...@@ -154,16 +149,18 @@ class ZSKPay: ...@@ -154,16 +149,18 @@ class ZSKPay:
# } # }
# ] # ]
} }
if len(data['transferDetailList']) == 0: for item in transferDetailList:#计算总金额和总笔数
raise ValueError("transferDetailList 必传")
for item in data['transferDetailList']:#计算总金额和总笔数
# if not item.get('transferNo') or not item.get('transferAmount') or not item.get('transferRemark') or not item.get('openid'): # if not item.get('transferNo') or not item.get('transferAmount') or not item.get('transferRemark') or not item.get('openid'):
# raise ValueError("缺少转账参数") # raise ValueError("缺少转账参数")
handle_data['totalAmount'] += item['transferAmount'] handle_data['totalAmount'] += item['transferAmount']
handle_data['totalNum'] += 1 handle_data['totalNum'] += 1
print('加密前数据----:',handle_data) # print('加密前数据----:',handle_data)
return self.http_post(data=handle_data,url='/wx-pay/transfer') body = self.http_post(data=handle_data,url='/wx-pay/transfer')
print('resp body', body)
# if body and body.get('code', '') == 200:
return body
#转账信息查询 #转账信息查询
def tranfer_info(self,data={}): def tranfer_info(self,data={}):
...@@ -171,11 +168,11 @@ class ZSKPay: ...@@ -171,11 +168,11 @@ class ZSKPay:
raise ValueError("缺少参数") raise ValueError("缺少参数")
encrypt_body = self.http_post(data=data,url='/wx-pay/transfer-info') encrypt_body = self.http_post(data=data,url='/wx-pay/transfer-info')
decrypted_body = self.decrypt_data(encrypt_body['data']) decrypted_body = self.decrypt_data(encrypt_body['data'])
print('解密后的查询数据',decrypted_body) # print('解密后的查询数据',decrypted_body)
return json.loads(decrypted_body) return json.loads(decrypted_body)
# 生成订单号 # 生成订单号
def generate_batchNo(): def generate_batchNo(self):
timestamp = int(time.time()) timestamp = int(time.time())
random_number = random.randint(1000, 9999) random_number = random.randint(1000, 9999)
batchNo ='tj'+ str(timestamp) + str(random_number) batchNo ='tj'+ str(timestamp) + str(random_number)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论