提交 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):
cert_serial_no=models.CharField(_('商户证书序列号'),max_length=100,blank=True,null=True)
cert_path=models.CharField(_('证书地址'),max_length=200)
pay_id=models.CharField(_('商户号'),max_length=100)
remark=models.CharField(_('备注'),max_length=200,blank=True,null=True)
comp_abbr=models.CharField(_('公司缩写'),max_length=100,blank=True,null=True)
send_hb_method = models.SmallIntegerField(_('发放类型'),blank=True,null=True)
......@@ -37,7 +36,8 @@ class Pay(models.Model):
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_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:
verbose_name = _('微信商户平台')
......
......@@ -70,6 +70,7 @@ from utils.security_os import decryptQueryString
from .wx_miniprogram import WxMiniprogram
from datacenter.decorator_utils import throttle_request
from django.core.exceptions import ObjectDoesNotExist
from .zskpay import ZSKPay
def decrypt_11(code):
c=''
......@@ -363,6 +364,14 @@ def get_activity(company_id,label_code,lng=0,lat=0,phone='',activity_id=0, jmcpi
city = adr['city']
if city != '吐鲁番市':
return data
# 五星酒厂 只在贵州出奖
if company_id == '200399' and lng and lat:
lng_lat = gcj02_to_bd09(lng, lat)
adr = getAddressInfoByBaiDuApi(lng_lat)
province = adr['province']
if province != '贵州省':
return data
cur=connection.cursor()
......@@ -401,25 +410,28 @@ def get_activity(company_id,label_code,lng=0,lat=0,phone='',activity_id=0, jmcpi
data['package_id']=package_id
data['label_pk_id'] = d.infor['label_pk_id']
data['label_pk_code'] = d.infor['label_pk_code']
stock_dev = d.get_stk_dev()
#print(lb, json.dumps(stock_dev))
stock_dev_len = len(stock_dev)
if stock_dev_len>0:
for sto in stock_dev:
#print(sto['bill_no'])
data['batch_no_arr'].append(sto['bill_no'])
if sto['vtype_id']==2 and c.name == sto['company']:
data['is_ck']= True
if not fh_tm:
fh_tm = sto["tm"]
elif sto['vtype_id']==1 and c.name == sto['company']:
if not rk_tm:
rk_tm = sto["tm"]
if sto["agent"]["id"]:
data['agent_id'] = sto["agent"]["id"]
data['batch_no'] = stock_dev[stock_dev_len-1]['bill_no']
#print(product_id)
try:
stock_dev = d.get_stk_dev()
#print(lb, json.dumps(stock_dev))
stock_dev_len = len(stock_dev)
if stock_dev_len>0:
for sto in stock_dev:
#print(sto['bill_no'])
data['batch_no_arr'].append(sto['bill_no'])
if sto['vtype_id']==2 and c.name == sto['company']:
data['is_ck']= True
if not fh_tm:
fh_tm = sto["tm"]
elif sto['vtype_id']==1 and c.name == sto['company']:
if not rk_tm:
rk_tm = sto["tm"]
if sto["agent"]["id"]:
data['agent_id'] = sto["agent"]["id"]
data['batch_no'] = stock_dev[stock_dev_len-1]['bill_no']
except Exception as e:
pass
if product_id == 0:
lb = wuliu_label_code if wuliu_label_code else label_code
......@@ -427,9 +439,10 @@ def get_activity(company_id,label_code,lng=0,lat=0,phone='',activity_id=0, jmcpi
d=label_sys_info(lb,company,has_price=False)
#print(d)
product_id=d['product']['id']
package_id=d['package']['id']
if d['package']['id']:
package_id=d['package']['id']
data['package_id']=package_id
data['product_id']=d['product']['id']
data['package_id']=package_id
data['product_name']=d['product']['name']
data['batch_no'] = d['qc']
data['label_pk_id'] = d['label_pk_id']
......@@ -1543,6 +1556,14 @@ def wx_process_label_scan(request,company_id,app_id=None):
act_id='null'
wx_labelscan_id=None
# 2024-12-09 Jonathan 市场反应包装厂将康庄大道的标签用给了辽宁铁研客户 故此需要做采集判断
if company_id == "180087":
cur.execute(f"select count(0) from mes_labelbindpx where company_id = 243885 and (bottle_code = '{label_code}')")
r = cur.fetchone()
if r and r[0] > 0:
company_id = "243885"
app_id = "0"
papePath=PagePath.objects.filter(company_id=company_id,app_id=app_id)
if papePath:
papePath=papePath[0]
......@@ -2297,7 +2318,7 @@ def ajax_get_activity(request):
need_jmcpid = False
if company_id == "158353" and label_code.startswith('9170')==False:
need_jmcpid = True
if company_id == "208869" or company_id == "208500" or company_id == "211376" or company_id == "107413" or company_id == "210165":
if company_id == "208869" or company_id == "208500" or company_id == "211376" or company_id == "107413" or company_id == "210165" or company_id == "200399" or company_id == "255607":
need_jmcpid = True
if need_jmcpid:
if not jmcpid:
......@@ -2317,7 +2338,7 @@ def ajax_get_activity(request):
r = cur.fetchone()
if r[0] < 1:
return JsonResponse({'e':'不在活动范围内 no bind'})
elif company_id == "208869" or company_id == "107413" or company_id == "210165":
elif company_id == "208869" or company_id == "107413" or company_id == "210165" or company_id == "200399" or company_id == "255607":
s = f"select label_code from logistics.mes_bottlcap where cap = '{jmcpid}' order by id limit 1"
cur.execute(s)
r = cur.fetchone()
......@@ -2458,6 +2479,8 @@ def ajax_get_activity(request):
max_month_win_cnt = 20
elif company_id == "238273":
max_day_win_cnt = 6
elif company_id == "200399":
max_day_win_cnt = 6
cur.execute(f"select count(0) from sales_consumerwinner where consumer_id = {consumer_id} and company_id = {company_id} and tm> '{datetime.datetime.now().strftime('%Y-%m-%d')}'")
cnt = cur.fetchone()
......@@ -3464,6 +3487,8 @@ def wx_oauth_info(request,company_id,app_id='0'):
subscribe = rs['subscribe']
if subscribe == 0 and company_id == "134666":
return HttpResponseRedirect("https://tjfnew.china315net.com/dist/chuanjiu/wxgz.html")
if subscribe == 0 and company_id == "190399":
return HttpResponseRedirect("https://tjfnew.china315net.com/dist/hqxf/wxgz.html")
user_url="https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh-CN"
d=requests.get(user_url.format(access_token,data['openid']))
......@@ -5758,7 +5783,7 @@ def wx_label_scan_record(request):
fwcode=cur.fetchone()[0]
# 辽宁铁研后的公司走新查询接口
if int(compid)>=243885:
if int(compid)>=243885 or compid == '180087':
d = LabelQuery(int(compid),fwcode)
p = d.get_product()
if 'id' in d.package:
......@@ -5792,7 +5817,7 @@ def wx_label_scan_record(request):
data['fh_time'] = sto['tm']
# 辽宁铁研
if compid == '243885':
if compid == '243885' or compid == '180087':
xcode = d.infor['label_pk_code']
data['boxes'] = xcode
if xcode:
......@@ -6187,6 +6212,7 @@ def wx_consumer_activity_win_record(request):
company_id=int(company_id)).exclude(award=None)
if winner:
for w in winner:
tm_redeemed = ''
if w.tm_redeemed:
tm_redeemed = w.tm_redeemed.strftime("%Y-%m-%d %H:%M:%S")
......@@ -7110,13 +7136,13 @@ def channel_rebate_action(request,what):
# @csrf_exempt
@csrf_exempt
def test_send_hb(request):
openid = u'o39S9jhRCWRQd5yozq5eoRhH0Oc0'
openid = u'ouB2r5irnr6RRGzTAB4KeYoUvuCM'
#appid = 'wxe9a919e0d3c419ee'
appid = 'wx73986617af90c47b'
appid = ''
money = 100
company_id = 255607
company_id = 158353
data = {
'e':''
}
......@@ -7134,8 +7160,13 @@ def send_hb(openid,money,company_id,appid=''):
# return send_hb_sxtb(openid,money,appid)
if str(company_id) == "19257":
return send_hb_mjh(openid,money)
pay_platform = None
if str(company_id) == "107413":
pay_platform = 'zsk'
company_id = 16687
wp = Pay.objects.filter(company_id=int(company_id))
wp = Pay.objects.filter(company_id=int(company_id), pay_platform=pay_platform)
if wp:
wp = wp[0]
wx_app_id = wp.appid
......@@ -7143,6 +7174,11 @@ def send_hb(openid,money,company_id,appid=''):
wx_mch_key = wp.key
path = wp.cert_path
send_name = wp.remark
public_key_id=None
public_key=None
if wp.public_key_id:
public_key_id = wp.public_key_id
public_key = wp.public_key
if wp.pay_platform == 'cq':
if appid:
......@@ -7164,13 +7200,40 @@ def send_hb(openid,money,company_id,appid=''):
er['return_msg']='发放成功'
er['send_listid']=err['data']['orderId']
return er
if wp.pay_platform == 'zsk':
pay_plat_appid = wp.pay_platform_appid
pay_plat_key = wp.pay_platform_key
print('zsk---',wx_app_id, wx_mch_id, pay_plat_appid, pay_plat_key, path)
order_no = str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())))+ str(time.time()).replace('.', '')[-7:]
zsk = ZSKPay(wx_app_id, wx_mch_id, pay_plat_appid, pay_plat_key, path)
err = zsk.transfer({
'company_id': company_id,
'transferNo': order_no,#中奖记录id
"transferAmount": 30,
"transferRemark": "红包",
"openid": openid, #oCZuC5RiJ8RId4qacC0inhy74vRc
})
er = {
'return_code':'fail',
'result_code':'fail',
'return_msg':'网络超时',
'send_listid':'',
}
#print(err)
if err['code'] == 200:
er['return_code']='SUCCESS'
er['result_code']='SUCCESS'
er['return_msg']='发放成功'
er['send_listid']= order_no
return er
#if (wp.send_hb_method == 1 and wp.version == "V3") or openid == "ol_or5uHr5WPOMijCqkOobncuLE8":
if wp.send_hb_method == 1 and wp.version == "V3":
if appid:
wx_app_id = appid
with open(r'E:\work\datacenter\wx\cert\sxgt\apiclient_key.pem') as f:
with open(path+'apiclient_key.pem') as f:
PRIVATE_KEY = f.read()
#logging.basicConfig(filename=os.path.join('F:\hzy\log\wechatpay', 'demo.log'), level=logging.DEBUG, filemode='a', format='%(asctime)s - %(process)s - %(levelname)s: %(message)s')
#LOGGER = logging.getLogger("demo")
......@@ -7182,10 +7245,12 @@ def send_hb(openid,money,company_id,appid=''):
apiv3_key=wp.key_v3,
appid=wx_app_id,
notify_url='',
cert_dir='E:\\work\\datacenter\\wx\\cert\\sxgt\\',
cert_dir=path,
logger=None,
partner_mode=False,
proxy=None)
proxy=None,
public_key=public_key,
public_key_id=public_key_id)
order_no = str(time.strftime('%Y%m%d%H%M%S', time.localtime(time.time())))+ str(time.time()).replace('.', '')[-7:]
transfer_detail_list = [{"out_detail_no": order_no, "transfer_amount": int(money), "transfer_remark": "商家转帐", "openid": openid}]
err=wxpay_v3.transfer_batch(
......@@ -7196,7 +7261,7 @@ def send_hb(openid,money,company_id,appid=''):
total_num=1,
transfer_detail_list=transfer_detail_list
)
print(err)
#print(err)
er = {
'return_code':'fail',
'result_code':'fail',
......@@ -13180,6 +13245,38 @@ def get_nfc_code_by_label_code(request):
else:
data['e'] = '数据丢失'
return JsonResponse(data)
def get_nfc_bind_product(request):
data = {'msg': '', 'code':200, 'data':{}}
fwcode = request.GET.get('fwcode', '')
if fwcode:
fwcode = decryptQueryString(fwcode)
cur = connection.cursor()
s = f"""select id, label_pkg, tm, nfc, treasure_code, product_id, dt_product, remark
from label.lbl_nfc where label_code = '{fwcode}' order by id desc limit 1"""
cur.execute(s)
r = cur.fetchone()
if r:
data['data']={
'id': r[0],
'label_pkg': r[1],
'tm': r[2],
'nfc': r[3],
'treasure_code': r[4],
'product_id': r[5],
'dt_product': r[6],
'remark': r[7],
}
else:
data['e'] = '未绑定'
data['code'] = '402'
else:
data = {
'e':'数据丢失',
'code':400,
'data':{}
}
return JsonResponse(data)
# 20240711 2116 【川酒集团】-终端店返利(实物或者酒票)开发
@csrf_exempt
......@@ -13633,28 +13730,43 @@ def wx_consumer_winner_active(request, what):
else:
data['e'] = '数据丢失'
return JsonResponse(data)
data['e'] = '未知的请求内容'
return JsonResponse(data)
from .zskpay import ZSKPay
def test_zsk(request):
zsk_pay_instance = ZSKPay()
respones = zsk_pay_instance.transfer({
'transferDetailList': [
{
'transferNo':'tj_consumer_winner_001',
"transferAmount": 30,
"transferRemark": "红包",
"openid": "oCZuC5RiJ8RId4qacC0inhy74vRc",
elif what == 'record':
consumer_id = request.GET.get('consumer_id','')
if consumer_id:
consumer_id = int(decrypt_p(consumer_id))
cur = connection.cursor()
s = f"""
select
id,
status,
(select name from sales_activityawards where id = a.award_id),
to_char(tm,'yyyy-mm-dd HH24:MI:SS'),
photo
from
sales_consumerwinneractive a
where
consumer_id = {consumer_id}
"""
cur.execute(s)
rs = cur.fetchall()
status_dict = {
0: '等待资料上传',
1: '审核中',
2: '已发放',
3: '上传资料不符合活动要求'
}
]
})
# resp = zsk_pay_instance.transfer_info({
# 'batchNo': 'tjhd-001',
# 'transferNo':'tj_consumer_winner_001',
# })
return JsonResponse({'success': 1})
data['record'] = []
for r in rs:
data['record'].append({
'id': r[0],
'status': r[1],
'award_name': r[2],
'tm': r[3],
'photo': r[4],
'status_name': status_dict[r[1]]
})
else:
data['e'] = '数据丢失'
return JsonResponse(data)
data['e'] = '未知的请求内容'
return JsonResponse(data)
\ No newline at end of file
#橙券支付
#中数科支付
#接口文档 https://doc.apipost.net/docs/detail/34ff33e7bce7000?target_id=ef551d7ba901a
......@@ -19,45 +18,34 @@ from cryptography.hazmat.primitives.asymmetric import rsa
from cryptography.hazmat.primitives import serialization, hashes
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 = {
'dev': {
'ym-id': '645206198756315136',
'ym-key': '15a5ba24711540f0bd3246b92a7c7daa'
},
'prod':{}
}
domain = domainMap[env]
class ZSKPay:
def __init__(self):
def __init__(self, appid, taxId, ymId, ymKey, cert):
self.MAX_ENCRYPTION_SIZE = 117 #214
# 计算签名
def generate_sign(self,data):
# # 1. 整理参数
# sorted_keys = sorted(data.keys())
# sorted_data = []
# 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'
self.appid = appid
self.domain = domain
self.taxId = taxId
self.ymId = ymId
self.ymKey = ymKey
self.cert = cert
def encrypt_data(self, data):
encrypted_chunks = []
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_loaded = serialization.load_pem_public_key(
......@@ -110,17 +98,17 @@ class ZSKPay:
# print("加密后数据:", type(data), data)
headers = {
'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:
response = urllib.request.urlopen(request)
# 读取响应体
res_body = response.read().decode('utf-8')
print("返回结果:", res_body)
return json.loads(res_body)
......@@ -131,19 +119,26 @@ class ZSKPay:
#转账
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 = {
"taxId": 1836580691238883330,
"batchNo":data.get('batchNo', self.generate_batchNo()),
"appid": data.get('appid','wxb8516c6064271fe4'),
"batchName": data.get('batchName','活动批次'),
"batchRemark": data.get('batchRemark','默认备注'),
"taxId": self.taxId,
"batchNo": batchNo,
"appid": self.appid,
"batchName": batchName,
"batchRemark": batchRemark,
"totalAmount": 0,
"totalNum": 0, #转账总笔数
"transferSceneId": "", #转账场景ID
"notifyUrl": "", #回调地址
#转账明细列表
"transferDetailList":data.get('transferDetailList',[])
"transferDetailList": transferDetailList
# [
# {
# "transferNo": "tj_consumer_winner_001", //商家明细单号
......@@ -154,16 +149,18 @@ class ZSKPay:
# }
# ]
}
if len(data['transferDetailList']) == 0:
raise ValueError("transferDetailList 必传")
for item in data['transferDetailList']:#计算总金额和总笔数
for item in transferDetailList:#计算总金额和总笔数
# if not item.get('transferNo') or not item.get('transferAmount') or not item.get('transferRemark') or not item.get('openid'):
# raise ValueError("缺少转账参数")
handle_data['totalAmount'] += item['transferAmount']
handle_data['totalNum'] += 1
print('加密前数据----:',handle_data)
return self.http_post(data=handle_data,url='/wx-pay/transfer')
# print('加密前数据----:',handle_data)
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={}):
......@@ -171,11 +168,11 @@ class ZSKPay:
raise ValueError("缺少参数")
encrypt_body = self.http_post(data=data,url='/wx-pay/transfer-info')
decrypted_body = self.decrypt_data(encrypt_body['data'])
print('解密后的查询数据',decrypted_body)
# print('解密后的查询数据',decrypted_body)
return json.loads(decrypted_body)
# 生成订单号
def generate_batchNo():
def generate_batchNo(self):
timestamp = int(time.time())
random_number = random.randint(1000, 9999)
batchNo ='tj'+ str(timestamp) + str(random_number)
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论