Files
server-core/wechatpayv3/businesscircle.py
T
Pine f1147dced3 feat(pay): 微信支付V3子应用与算力充值
- 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>
2026-08-30 22:29:44 +08:00

123 lines
5.7 KiB
Python

# -*- coding: utf-8 -*-
from .type import RequestType
def points_notify(self, transaction_id, openid, earn_points, increased_points, points_update_time, no_points_remarks=None, total_points=None, appid=None, sub_mchid=None):
"""智慧商圈积分同步
:param transaction_id: 微信订单号,示例值:'1217752501201407033233368018'
:param openid: 用户标识,示例值:'oWmnN4xxxxxxxxxxe92NHIGf1xd8'
:param earn_points: 是否获得积分,示例值:True
:param increased_points: 订单新增积分值,示例值:100
:param points_update_time: 积分更新时间,示例值:'2020-05-20T13:29:35.120+08:00'
:param no_points_remarks: 未获得积分的备注信息,示例值:'商品不参与积分活动'
:param total_points: 顾客积分总额,示例值:888888
:param appid: 应用ID,可不填,默认传入初始化时的appid,示例值:'wx1234567890abcdef'
:param sub_mchid: (服务商模式)子商户的商户号,由微信支付生成并下发。示例值:'1900000109'
"""
params = {}
params.update({'appid': appid or self._appid})
if transaction_id:
params.update({'transaction_id': transaction_id})
else:
raise Exception('transaction_id is not assigned.')
if openid:
params.update({'openid': openid})
else:
raise Exception('openid is not assigned.')
if earn_points:
params.update({'earn_points': earn_points})
else:
raise Exception('earn_points is not assigned.')
if increased_points:
params.update({'increased_points': increased_points})
else:
raise Exception('increased_points is not assigned')
if points_update_time:
params.update({'points_update_time': points_update_time})
else:
raise Exception('points_update_time is not assigned.')
if no_points_remarks:
params.update({'no_points_remarks': no_points_remarks})
if total_points:
params.update({'total_points': total_points})
if self._partner_mode and sub_mchid:
params.update({'sub_mchid': sub_mchid})
path = '/v3/businesscircle/points/notify'
return self._core.request(path, method=RequestType.POST, data=params)
def user_authorization(self, openid, appid=None, sub_mchid=None):
"""智慧商圈积分授权查询
:param openid: 用户标识,示例值:'oWmnN4xxxxxxxxxxe92NHIGf1xd8'
:param appid: 小程序appid,顾客授权积分时使用的小程序的appid,默认传入初始化时的appid,示例值:'wx1234567890abcdef'
:param sub_mchid: (服务商模式)子商户的商户号,由微信支付生成并下发。示例值:'1900000109'
"""
if openid:
if self._partner_mode:
path = '/v3/businesscircle/user-authorizations/%s?appid=%s' % (openid, appid or self._appid)
if sub_mchid:
path = '%s&sub_mchid=%s' % (path, sub_mchid)
else:
path = '/v3/businesscircle/user-authorizations/%s?appid=%s' % (openid, self._appid)
else:
raise Exception('openid is not assigned.')
return self._core.request(path)
def business_parking_sync(self, openid, brandid, plate_number, state, time, appid=None, sub_mchid=None):
"""商圈会员停车状态同步
:param openid: 用户标识,示例值:'oWmnN4xxxxxxxxxxe92NHIGf1xd8'
:param brandid: 品牌ID,示例值:1000
:param plate_number: 车牌号,示例值: '粤B888888'
:param state: 停车状态,IN=入场,用户开车进入商圈,OUT=离场,用户开车离开商圈。示例值:IN
:param time: 时间,示例值:2022-06-01T10:43:39+08:00
:param appid: 小程序appid,顾客授权积分时使用的小程序的appid,默认传入初始化时的appid,示例值:'wx1234567890abcdef'
:param sub_mchid: (服务商模式)子商户的商户号,由微信支付生成并下发。示例值:'1900000109'
"""
params = {}
params.update({'appid': appid or self._appid})
if not openid:
raise Exception('openid is not assigned.')
else:
params.update({'openid': openid})
if not brandid:
raise Exception('brandid is not assigned.')
else:
params.update({'brandid': brandid})
if not plate_number:
raise Exception('plate_number is not assigned.')
else:
params.update({'plate_number': plate_number})
if not state:
raise Exception('state is not assigned.')
else:
params.update({'state': state})
if not time:
raise Exception('time is not assigned.')
else:
params.update({'time': time})
if self._partner_mode:
if not sub_mchid:
raise Exception('sub_mchid is not assigned.')
else:
params.update({'sub_mchid': sub_mchid})
path = 'https://api.mch.weixin.qq.com/v3/businesscircle/parkings'
return self._core.request(path, method=RequestType.POST, date=params)
def business_point_status(self, openid, brandid, appid=None, sub_mchid=None):
"""商圈会员待积分状态查询
:param openid: 用户标识,示例值:'oWmnN4xxxxxxxxxxe92NHIGf1xd8'
:param brandid: 品牌ID,示例值:1000
:param appid: 小程序appid,顾客授权积分时使用的小程序的appid,默认传入初始化时的appid,示例值:'wx1234567890abcdef'
:param sub_mchid: (服务商模式)子商户的商户号,由微信支付生成并下发。示例值:'1900000109'
"""
if not (openid and brandid):
raise Exception('openid and/or brandid is not assigned.')
else:
path = 'https://api.mch.weixin.qq.com/v3/businesscircle/users/%s/points/commit_status?brandid=%s&appid=%s' % (openid, brandid, appid or self._appid)
if sub_mchid:
path += '%s&sub_mchid=%s' % (path, sub_mchid)
return self._core.request(path)