代码实现
首次签名逻辑
第一次请求生成预付单号的签名文档为:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_0.shtml, 共5个部分参与签名,其组成格式为:
HTTP请求方法
URL
请求时间戳
请求随机串
请求报文主体
对应签名代码:
class WechatPayDALBase(object):
def __init__(self, mch_appid, mchid, v3key, serial_no, client_key):
self.mch_appid = mch_appid
self.mchid = mchid
self.v3key = v3key
# serial_no可通过openssl直接获取, 例: openssl x509 -in 1900009191_20180326_cert.pem -noout -serial
self.serial_no = serial_no
with open(client_key, r) as ifile:
pkey = RSA.importKey(ifile.read())
self.signer = pkcs1_15.new(pkey)
def compute_sign_v3(self, method, url, body):
V3签名逻辑
ts = int(time.time())
nonce = self.generate_nonce()
uparts= parse_url(url)
ustr = uparts.path (?{}.format(uparts.query) if uparts.query else )
content = {}
{}
{}
{}
{}
.format(method, ustr, ts, nonce, body)
digest = SHA256.new(content.encode(utf-8))
sign_v = base64.b64encode(self.signer.sign(digest)).decode(utf-8)
sign_str = serial_no="{}",mchid="{}",timestamp="{}",nonce_str="{}",signature="{}".format(
self.serial_no, self.mchid, ts, nonce, sign_v)
return sign_str
def make_headers_v3(self, url, headers=None, body=, method=GET):
微信支付V3版本签名header生成函数
if not headers:
headers = {}
headers[Accept] = application/json
sign = self.compute_sign_v3(method, url, body)
auth_info = WECHATPAY2-SHA256-RSA2048 {}.format(sign)
headers[Authorization] = auth_info
return headers
def generate_nonce(self):
rnd = int(time.time()) random.randint(100000, 1000000)
nonce = hashlib.md5(str(rnd).encode()).hexdigest()[:16]
return nonce
二次签名逻辑
由业务后端返回给APP的二次签名信息文档为:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_4.shtml
共4个部分参与签名,其组成格式为:
应用id
时间戳
随机字符串
预支付交易会话ID
返回签名支付信息的对应代码:
def get_pay_sign_info(self, prepay_id):
ts = int(time.time())
nonce = self.generate_nonce()
content = {}
{}
{}
{}
.format(self.mch_appid, ts, nonce, prepay_id)
digest = SHA256.new(content.encode(utf-8))
sign_v = base64.b64encode(self.signer.sign(digest)).decode(utf-8)
return {
appid: self.mch_appid,
partnerid: self.mchid,
timestamp: str(ts),
noncestr: nonce,
prepay_id: prepay_id,
package: Sign=WXPay,
sign: sign_v,
}
业务后端查询订单详情
文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_2.shtml
代码如下:
def query_order(self, out_trade_no):
查询指定订单信息
url = fhttps://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{out_trade_no}?mchid={self.mchid}
headers = self.make_headers_v3(url)
rsp = requests.get(url, headers=headers)
pay_logger.info(out_trade_no:{}, rsp:{}|{}.format(out_trade_no, rsp.status_code, rsp.text))
rdct = rsp.json()
return rdct
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至123456@qq.com 举报,一经查实,本站将立刻删除。