Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
Y
ypt_mgw_local
项目
项目
详情
活动
周期分析
仓库
仓库
文件
提交
分支
标签
贡献者
图表
比较
统计图
议题
0
议题
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
CI / CD
CI / CD
流水线
作业
日程
统计图
Wiki
Wiki
代码片段
代码片段
成员
成员
折叠边栏
关闭边栏
活动
图像
聊天
创建新问题
作业
提交
问题看板
Open sidebar
苏星豪
ypt_mgw_local
Commits
b206ad1e
提交
b206ad1e
authored
11月 21, 2024
作者:
李思鑫
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
增加zsk类
上级
caf0312a
全部展开
隐藏空白字符变更
内嵌
并排
正在显示
6 个修改的文件
包含
200 行增加
和
28 行删除
+200
-28
urls.py
datacenter/urls.py
+2
-0
public_key.txt
wx/cert/zsk/req/public_key.txt
+3
-0
private_key.txt
wx/cert/zsk/resp/private_key.txt
+27
-0
public_key.txt
wx/cert/zsk/resp/public_key.txt
+9
-0
views.py
wx/views.py
+0
-0
zskpay.py
wx/zskpay.py
+159
-28
没有找到文件。
datacenter/urls.py
浏览文件 @
b206ad1e
...
...
@@ -1179,6 +1179,8 @@ urlpatterns = [
url
(
r'^test/send_hb/$'
,
wx_views
.
test_send_hb
),
url
(
r'^test/consumer_winner_hit/$'
,
sal_views
.
test_consumer_winner_hit
),
url
(
r'^test/zsk_pay/$'
,
wx_views
.
test_zsk
),
url
(
r'^wx/kangnian/terminal/$'
,
wx_views
.
kangnian_getTerminal
),
...
...
wx/cert/zsk/req/public_key.txt
0 → 100644
浏览文件 @
b206ad1e
-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCefZbdsT6RiaCRqWKKIi4rWrntio3oX1RbCFSGHI3o2jS34Aew0QwBDDftdPS6ohgMRksIykoTTmXE8/1xgLc43Ed1kAQ2AHUkTdIRzhI3Sp5Ac6sD9B/Ys3Adb05PRvfCEcqDlRVjsLYCeFFpi9djZev97ojmKSajJ3kS7OnmuQIDAQAB
-----END PUBLIC KEY-----
wx/cert/zsk/resp/private_key.txt
0 → 100644
浏览文件 @
b206ad1e
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA6NLHoZOiPT0wgnfg0nRl3CqcyNGWDBoCDkJ5Cw/AHt5IAEQ1
R81w+5vBcLxGCttz4Qapcbpy+ck9zYiiVtOjInhS14tbgJad9jCTWm8+ejShVp/M
k9Xe1irORrxbj9YJ3L3BbYr5K3wTuAMd43Wp+7Ia7LpplmGSvOZumTRYRyFQgSs6
Vfv0x4fRQI4/JdUp+sX3DUUns0kXy8ggoI/B6kUYS6+Th+YWjcztdliJtRMb9sM5
BIJGWuGUNCDo93+UNyTxrEI8cTczfxqlzKRZSoadHa4xJF3TBKrgm4D5fZNF/ZEs
WmfsC7qalc0x0sHuPBnXTKM97d4t0WosTJkvAQIDAQABAoIBABT6Fr/9Vf8IAhSj
OeekUqAfW8BxN8Bv4HMJ9K91NBVj6B9UBevp++3Dhw6B/BqS0rI54C7twlm0ksOv
tZa2m0pqBmbCuNQRXfqWPlSF1N58WvP70loYiSsJMMwpQOOpAHr5wtF8lb4gAAPS
jhEWIyJZFflxwz0oHek0ps7Za0G/N+cFLZAdju9OXoO3mQMvuP8AQ7qT3A3sGJP4
d6K5YzMZSNT2SrwLR18VUpaFIDkCLp4XW5LZ7SJP5Ps2OoAPGawDA8g5OFC3z3J2
lZvT9BlOhkETimhwkXjuJV68RD+YmMulIxU5Q+erljACImfP43r6aOgIs7mezm2R
bSvQXmUCgYEA7N6GuphLIOV8tOfmDpCWKgmsArTVD2t/wLa4yYpffN57gz9NZ/oa
LsOIrl62MRmybWoVa/WlP9d3cNbS5NsyJeispKftMqzdiWi2d78X358GtgebxpzG
2s+e4k4pWvVSPW98YcqBn0xa0RWVtfREyyQ6ZJCxOMxShCgPKWXJZc0CgYEA+6CZ
9ctoRWGXXGC3VRYbwVEWtu3g40cTUILX7ZA1weXilE+9pr5BgmOPqm9i16GMjTKe
92rn6H2VBm5o9nlLX1KR2IiY3YEZ77QgQuOGNrJrk9GXRGOVoR4553ACaqzD/d5N
NTMYGSLlUMvu2K74S7Y1tTMfle7wKw9M0utA+gUCgYEAjENZVLVKB7jdF+MagBVu
VoZTrWaXpAHsLJoG4pFl6fN1AEtD8wZO6tIu5dJ/4KNu3Qusk7lqmVtmBxOu3oZO
M9SMJxSpiRCEPxIaut4VrP3mY3Qt8nZz6q53T1spcgtDH84cwWvBRitYu+ckOBLl
icVyLorf5tpXIpr2H3V+xSECgYBu9PPPGiHhrlYTSyaso3IbvckZYy3uqrHOp9PV
kujRlrBiHAOSGoVCnOqGClX4pekXfkHw8jhPIclsK5WnUfc1knBznlBiJIKuW6x6
MmBFkEm1xg9A/fTGNlDsSE0YgxRtxvAezGgM9YFPLo4lCIq+wBtQyrlb4SAQrM+A
lnJxjQKBgA9YtJU5xpIR9KkKqqyCZINi+XmAwffh6XoT0e8DgOHXHnc8GgODCasL
wtCqmARfdnSy8UE2NSdHHPJUVx299t6wL0VLv11MEZqKu8mJwCIiAdR5YsHbaKTp
H+qprpac3lhMgEh25H93mxjZBxaRSjLzy2+n6XQtr2vYt5sdztVQ
-----END RSA PRIVATE KEY-----
wx/cert/zsk/resp/public_key.txt
0 → 100644
浏览文件 @
b206ad1e
-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA6NLHoZOiPT0wgnfg0nRl
3CqcyNGWDBoCDkJ5Cw/AHt5IAEQ1R81w+5vBcLxGCttz4Qapcbpy+ck9zYiiVtOj
InhS14tbgJad9jCTWm8+ejShVp/Mk9Xe1irORrxbj9YJ3L3BbYr5K3wTuAMd43Wp
+7Ia7LpplmGSvOZumTRYRyFQgSs6Vfv0x4fRQI4/JdUp+sX3DUUns0kXy8ggoI/B
6kUYS6+Th+YWjcztdliJtRMb9sM5BIJGWuGUNCDo93+UNyTxrEI8cTczfxqlzKRZ
SoadHa4xJF3TBKrgm4D5fZNF/ZEsWmfsC7qalc0x0sHuPBnXTKM97d4t0WosTJkv
AQIDAQAB
-----END PUBLIC KEY-----
wx/views.py
浏览文件 @
b206ad1e
差异被折叠。
点击展开。
wx/zskpay.py
浏览文件 @
b206ad1e
#橙券支付
#中数科支付
#接口文档 https://doc.apipost.net/docs/detail/34ff33e7bce7000?target_id=ef551d7ba901a
import
hashlib
import
datetime
...
...
@@ -8,46 +10,175 @@ import urllib.request
import
urllib.parse
import
random
import
base64
import
os
from
Crypto.Cipher
import
AES
from
Crypto.Util.Padding
import
unpad
domain
=
'https://api.chengquan.cn'
from
cryptography.hazmat.backends
import
default_backend
from
cryptography.hazmat.primitives.asymmetric
import
rsa
from
cryptography.hazmat.primitives
import
serialization
,
hashes
from
cryptography.hazmat.primitives.asymmetric
import
padding
env
=
'dev'
domain
=
'http://ywymtest-api.azhiyun.cn'
sign
=
{
'dev'
:
{
'ym-id'
:
'645206198756315136'
,
'ym-key'
:
'15a5ba24711540f0bd3246b92a7c7daa'
},
'prod'
:{}
}
class
ZSKPay
:
def
__init__
(
self
,
appid
,
k
,
aes_key
=
''
,
aes_iv
=
''
):
self
.
appid
=
appid
self
.
k
=
k
self
.
aes_key
=
aes_key
self
.
aes_iv
=
aes_iv
def
__init__
(
self
):
self
.
MAX_ENCRYPTION_SIZE
=
117
#214
# 计算签名
def
generate_sign
(
self
,
data
):
return
''
def
http_post
(
self
,
data
,
type
,
url
):
timestamp
=
int
(
round
(
time
.
time
()
*
1000
))
data
[
'timestamp'
]
=
timestamp
data
[
'ym-id'
]
=
self
.
appid
if
type
:
data
[
'type'
]
=
type
sign
=
self
.
generate_sign
(
data
)
data
[
'ym-key'
]
=
sign
data
=
json
.
dumps
(
data
)
data
=
bytes
(
data
,
"utf8"
)
headers
=
{
'Content-Type'
:
'application/json'
}
request
=
urllib
.
request
.
Request
(
domain
+
url
,
data
,
headers
)
res
=
urllib
.
request
.
urlopen
(
request
)
.
read
()
.
decode
(
'utf-8'
)
return
json
.
loads
(
res
)
# # 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'
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
:
public_key_content
=
public_file
.
read
()
public_key_loaded
=
serialization
.
load_pem_public_key
(
public_key_content
,
backend
=
default_backend
()
)
# 将数据分块
for
i
in
range
(
0
,
len
(
data
),
self
.
MAX_ENCRYPTION_SIZE
):
chunk
=
data
[
i
:
i
+
self
.
MAX_ENCRYPTION_SIZE
]
try
:
# 使用公钥加密内容
ciphertext
=
public_key_loaded
.
encrypt
(
chunk
,
padding
.
PKCS1v15
()
)
encrypted_chunks
.
append
(
ciphertext
)
except
Exception
as
e
:
print
(
"加密块失败:"
,
e
)
# 将所有加密后的块连接在一起
resp
=
b
''
.
join
(
encrypted_chunks
)
return
base64
.
b64encode
(
resp
)
.
decode
(
'utf-8'
)
def
decrypt_data
(
self
,
data
):
current_directory
=
os
.
getcwd
()
with
open
(
current_directory
+
"/wx/cert/zsk/resp/private_key.txt"
,
"rb"
)
as
public_file
:
private_key_content
=
public_file
.
read
()
# 加载私钥
private_key_loaded
=
serialization
.
load_pem_private_key
(
private_key_content
,
password
=
None
,
backend
=
default_backend
()
)
# 解密
data
=
json
.
jmson
.
loads
(
data
)
plaintext
=
private_key_loaded
.
decrypt
(
base64
.
b64decode
(
data
),
padding
.
PKCS1v15
()
)
return
plaintext
.
decode
(
'utf-8'
)
def
http_post
(
self
,
data
=
{},
url
=
''
):
data
=
json
.
dumps
(
data
)
.
encode
(
'utf-8'
)
# 加密数据
data
=
self
.
encrypt_data
(
data
)
# print("加密后数据:", type(data), data)
headers
=
{
'Content-Type'
:
'application/json'
,
**
sign
[
env
]
}
request
=
urllib
.
request
.
Request
(
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
)
except
urllib
.
error
.
HTTPError
as
e
:
print
(
"HTTP错误:"
,
e
.
code
,
e
.
read
()
.
decode
())
except
urllib
.
error
.
URLError
as
e
:
print
(
"网络错误:"
,
e
.
reason
)
def
transfer
(
self
):
data
=
{
#转账
def
transfer
(
self
,
data
):
print
(
'开始转账:'
)
handle_data
=
{
"taxId"
:
1836580691238883330
,
"batchNo"
:
data
.
get
(
'batchNo'
,
self
.
generate_batchNo
()),
"appid"
:
data
.
get
(
'appid'
,
'wxb8516c6064271fe4'
),
"batchName"
:
data
.
get
(
'batchName'
,
'活动批次'
),
"batchRemark"
:
data
.
get
(
'batchRemark'
,
'默认备注'
),
"totalAmount"
:
0
,
"totalNum"
:
0
,
#转账总笔数
"transferSceneId"
:
""
,
#转账场景ID
"notifyUrl"
:
""
,
#回调地址
#转账明细列表
"transferDetailList"
:
data
.
get
(
'transferDetailList'
,[])
# [
# {
# "transferNo": "tj_consumer_winner_001", //商家明细单号
# "transferAmount": 30, //转账金额单位为“分”
# "transferRemark": "红包", //转账备注,【转账备注】 单条转账备注(微信用户会收到该备注),UTF8编码,最多允许32个字符
# "openid": "oCZuC5RiJ8RId4qacC0inhy74vRc", //【收款用户openid】商户appid下,某用户的openid
# "userName": "
# }
# ]
}
return
self
.
http_post_form
(
data
,
''
,
''
)
if
len
(
data
[
'transferDetailList'
])
==
0
:
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'):
# 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'
)
#转账信息查询
def
tranfer_info
(
self
,
data
=
{}):
if
not
data
.
get
(
'batchNo'
)
or
data
.
get
(
'batch'
,
''
):
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
)
return
json
.
loads
(
decrypted_body
)
# 生成订单号
def
generate_
order_number
():
def
generate_
batchNo
():
timestamp
=
int
(
time
.
time
())
random_number
=
random
.
randint
(
1000
,
9999
)
order_number
=
str
(
timestamp
)
+
str
(
random_number
)
return
order_number
batchNo
=
'tj'
+
str
(
timestamp
)
+
str
(
random_number
)
return
batchNo
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论