1. 首页
  2. > 香港公司年审 >

第三方调用微信支付业务流程(微信小程序调用第三方支付)



代码实现

首次签名逻辑

第一次请求生成预付单号的签名文档为: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 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息