f1147dced3
- app/pay 独立支付子应用(config/wxpay/models/repository/service/routers),便于后期拆分微服务 - 充值订单表 0026_compute_recharge;套餐支持折扣(discount)与上架开关(enabled),DB system_configs 优先、env 兜底 - 统一小程序支付:桌面端出小程序码→扫码进小程序确认页按 openid 发起 JSAPI→回调幂等到账(引擎 adjust_user_quota+镜像回写) - 内嵌 wechatpayv3(含 async_),响应验签失败降级告警;新增 aiofiles 依赖 Co-Authored-By: Claude <noreply@anthropic.com>
201 lines
11 KiB
Python
201 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
|
|
from .type import SignType, WeChatPayType
|
|
|
|
|
|
class WeChatPay():
|
|
def __init__(self,
|
|
wechatpay_type,
|
|
mchid,
|
|
private_key,
|
|
cert_serial_no,
|
|
appid,
|
|
apiv3_key,
|
|
notify_url=None,
|
|
cert_dir=None,
|
|
logger=None,
|
|
partner_mode=False,
|
|
proxy=None,
|
|
timeout=None,
|
|
public_key=None,
|
|
public_key_id=None):
|
|
"""
|
|
:param wechatpay_type: 微信支付类型,示例值:WeChatPayType.MINIPROG
|
|
:param mchid: 直连商户号,示例值:'1230000109'
|
|
:param private_key: 商户证书私钥,示例值:'MIIEvwIBADANBgkqhkiG9w0BAQE...'
|
|
:param cert_serial_no: 商户证书序列号,示例值:'444F4864EA9B34415...'
|
|
:param appid: 应用ID,示例值:'wxd678efh567hg6787'
|
|
:param apiv3_key: 商户APIv3密钥,示例值:'a12d3924fd499edac8a5efc...'
|
|
:param notify_url: 通知地址,示例值:'https://www.weixin.qq.com/wxpay/pay.php'
|
|
:param cert_dir: 平台证书存放目录,示例值:'/server/cert'
|
|
:param logger: 日志记录器,示例值logging.getLoger('demo')
|
|
:param partner_mode: 接入模式,默认False为直连商户模式,True为服务商模式
|
|
:param proxy: 代理设置,示例值:{"https": "http://10.10.1.10:1080"}
|
|
:param timeout: 超时时间,示例值:(10, 30), 10为建立连接的最大超时时间,30为读取响应的最大超时实践
|
|
:param public_key: 微信支付平台公钥,示例值:'MIIEvwIBADANBgkqhkiG9w0BAQE...'
|
|
:param public_key_id: 微信支付平台公钥id,示例值:'PUB_KEY_ID_444F4864EA9B34415...'
|
|
"""
|
|
from .core import Core
|
|
|
|
self._type = wechatpay_type
|
|
self._mchid = mchid
|
|
self._appid = appid
|
|
self._notify_url = notify_url
|
|
self._core = Core(mchid=self._mchid,
|
|
cert_serial_no=cert_serial_no,
|
|
private_key=private_key,
|
|
apiv3_key=apiv3_key,
|
|
cert_dir=cert_dir,
|
|
logger=logger,
|
|
proxy=proxy,
|
|
timeout=timeout,
|
|
public_key=public_key,
|
|
public_key_id=public_key_id)
|
|
self._partner_mode = partner_mode
|
|
|
|
def sign(self, data, sign_type=SignType.RSA_SHA256):
|
|
"""使用RSAwithSHA256或HMAC_256算法计算签名值供调起支付时使用
|
|
:param data: 需要签名的参数清单
|
|
:微信支付订单采用RSAwithSHA256算法时,示例值:['wx888','1414561699','5K8264ILTKCH16CQ2502S....','prepay_id=wx201410272009395522657....']
|
|
:微信支付分订单采用HMAC_SHA256算法时,示例值:{'mch_id':'1230000109','service_id':'88888888000011','out_order_no':'1234323JKHDFE1243252'}
|
|
"""
|
|
return self._core.sign(data, sign_type)
|
|
|
|
def decrypt_callback(self, headers, body):
|
|
"""解密回调接口收到的信息,仅返回resource解密后的参数字符串,此接口为兼容旧版本而保留,建议调用callback()
|
|
:param headers: 回调接口收到的headers
|
|
:param body: 回调接口收到的body
|
|
"""
|
|
return self._core.decrypt_callback(headers, body)
|
|
|
|
def callback(self, headers, body):
|
|
"""解密回调接口收到的信息,返回所有传入的参数
|
|
:param headers: 回调接口收到的headers
|
|
:param body: 回调接口收到的body
|
|
"""
|
|
return self._core.callback(headers, body)
|
|
|
|
def decrypt(self, ciphtext):
|
|
"""解密微信支付平台返回的信息中的敏感字段
|
|
:param ciphtext: 加密后的敏感字段,示例值:'Qe41VhP/sGdNeTHMQGlxCWiUyHu6XNO9GCYln2Luv4HhwJzZBfcL12sB+PgZcS5NhePBog30NgJ1xRaK+gbGDKwpg=='
|
|
"""
|
|
return self._core.decrypt(ciphtext)
|
|
|
|
from .apply4subject import (apply4subject_cancel, apply4subject_query,
|
|
apply4subject_state, apply4subject_submit)
|
|
from .applyment import (applyment_query, applyment_settlement_modify,
|
|
applyment_settlement_query, applyment_submit)
|
|
from .businesscircle import (business_parking_sync, business_point_status,
|
|
points_notify, user_authorization)
|
|
from .capital import (capital_branches, capital_cities,
|
|
capital_corporate_banks, capital_personal_banks,
|
|
capital_provinces, capital_search_bank_number)
|
|
from .complaint import (complaint_complete, complaint_detail_query,
|
|
complaint_history_query, complaint_image_download,
|
|
complaint_image_upload, complaint_list_query,
|
|
complaint_notification_create,
|
|
complaint_notification_delete,
|
|
complaint_notification_query,
|
|
complaint_notification_update, complaint_response,
|
|
complaint_update_refund)
|
|
from .fapiao import (fapiao_applications, fapiao_card_template,
|
|
fapiao_check_submch, fapiao_download_file,
|
|
fapiao_insert_cards, fapiao_merchant_base_info,
|
|
fapiao_merchant_config, fapiao_query,
|
|
fapiao_query_files, fapiao_reverse,
|
|
fapiao_set_merchant_config, fapiao_tax_codes,
|
|
fapiao_title, fapiao_title_url, fapiao_upload_file)
|
|
from .goldplan import (goldplan_advertising_close,
|
|
goldplan_advertising_filter,
|
|
goldplan_advertising_open,
|
|
goldplan_custompage_change, goldplan_plan_change)
|
|
from .marketing import (marketing_busifavor_callback_query,
|
|
marketing_busifavor_callback_update,
|
|
marketing_busifavor_coupon_associate,
|
|
marketing_busifavor_coupon_deactivate,
|
|
marketing_busifavor_coupon_detail,
|
|
marketing_busifavor_coupon_disassociate,
|
|
marketing_busifavor_coupon_return,
|
|
marketing_busifavor_coupon_use,
|
|
marketing_busifavor_couponcode_upload,
|
|
marketing_busifavor_stock_budget,
|
|
marketing_busifavor_stock_create,
|
|
marketing_busifavor_stock_modify,
|
|
marketing_busifavor_stock_query,
|
|
marketing_busifavor_subsidy_pay,
|
|
marketing_busifavor_subsidy_query,
|
|
marketing_busifavor_user_coupon,
|
|
marketing_card_send,
|
|
marketing_favor_callback_update,
|
|
marketing_favor_coupon_detail,
|
|
marketing_favor_refund_flow,
|
|
marketing_favor_stock_create,
|
|
marketing_favor_stock_detail,
|
|
marketing_favor_stock_item,
|
|
marketing_favor_stock_list,
|
|
marketing_favor_stock_merchant,
|
|
marketing_favor_stock_pause,
|
|
marketing_favor_stock_restart,
|
|
marketing_favor_stock_send,
|
|
marketing_favor_stock_start,
|
|
marketing_favor_use_flow,
|
|
marketing_favor_user_coupon,
|
|
marketing_image_upload,
|
|
marketing_partnership_build,
|
|
marketing_partnership_query,
|
|
marketing_paygift_activity_create,
|
|
marketing_paygift_activity_detail,
|
|
marketing_paygift_activity_list,
|
|
marketing_paygift_activity_terminate,
|
|
marketing_paygift_goods_list,
|
|
marketing_paygift_merchant_add,
|
|
marketing_paygift_merchant_delete,
|
|
marketing_paygift_merchants_list)
|
|
from .media import image_upload, video_upload
|
|
from .merchantrisk import (merchantrisk_callback_create,
|
|
merchantrisk_callback_delete,
|
|
merchantrisk_callback_query,
|
|
merchantrisk_callback_update)
|
|
from .parking import (parking_enter, parking_order, parking_order_query,
|
|
parking_service_find)
|
|
from .payscore import (payscore_cancel, payscore_complete, payscore_create,
|
|
payscore_direct_complete, payscore_merchant_bill,
|
|
payscore_modify, payscore_pay, payscore_permission,
|
|
payscore_permission_query,
|
|
payscore_permission_terminate, payscore_query,
|
|
payscore_refund, payscore_refund_query,
|
|
payscore_sync)
|
|
from .profitsharing import (brand_profitsharing_add_receiver,
|
|
brand_profitsharing_amount_query,
|
|
brand_profitsharing_config_query,
|
|
brand_profitsharing_delete_receiver,
|
|
brand_profitsharing_order,
|
|
brand_profitsharing_order_query,
|
|
brand_profitsharing_return,
|
|
brand_profitsharing_return_query,
|
|
brand_profitsharing_unfreeze,
|
|
profitsharing_add_receiver,
|
|
profitsharing_amount_query, profitsharing_bill,
|
|
profitsharing_config_query,
|
|
profitsharing_delete_receiver,
|
|
profitsharing_order, profitsharing_order_query,
|
|
profitsharing_return,
|
|
profitsharing_return_query,
|
|
profitsharing_unfreeze)
|
|
from .smartguide import (guides_assign, guides_query, guides_register,
|
|
guides_update)
|
|
from .transaction import (abnormal_refund, close, codepay_reverse, combine_close,
|
|
combine_pay, combine_query, download_bill,
|
|
fundflow_bill, pay, query, query_refund, refund,
|
|
submch_fundflow_bill, trade_bill)
|
|
from .transfer import (transfer_batch, transfer_bill_receipt,
|
|
transfer_detail_receipt, transfer_query_batchid,
|
|
transfer_query_bill_receipt,
|
|
transfer_query_detail_id,
|
|
transfer_query_out_batch_no,
|
|
transfer_query_out_detail_no,
|
|
transfer_query_receipt)
|
|
from .mchtransfer import (mch_transfer_bills, mch_transfer_bills_cancel,
|
|
mch_transfer_bills_query, mch_transfer_elecsign,
|
|
mch_transfer_elecsign_query)
|