fix: 支付 openid 按俱乐部隔离,禁止跨小程序回落 legacy 字段

appid 已正确读 club 表,但 openid 在无 xq 绑定时会错误回落 UserName/OpenID(可能是星之界 openid),导致 appid 与 openid 不匹配。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
XingQue
2026-07-10 20:47:35 +08:00
parent df416b8284
commit f601541eb0
6 changed files with 64 additions and 19 deletions

View File

@@ -176,10 +176,14 @@ class ShangjiaChongzhi(APIView):
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
else:
try:
pay_openid, _ = get_payment_openid(request)
pay_club = resolve_club_id_for_write(request, request.user)
pay_openid, _ = get_payment_openid(request, club_id=pay_club)
if not pay_openid:
chongzhi_jilu.delete()
return Response({'code': 400, 'message': '用户openid不存在'}, status=status.HTTP_400_BAD_REQUEST)
return Response({
'code': 400,
'message': '当前小程序未绑定微信openid请退出后重新登录再支付',
}, status=status.HTTP_400_BAD_REQUEST)
pay_params = self.generate_wechat_pay_params(
dingdanid=dingdanid,
jine=jine,

View File

@@ -187,7 +187,7 @@ class HuiyuanGoumai(APIView):
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
else:
try:
pay_openid, _ = get_payment_openid(request)
pay_openid, pay_club = get_payment_openid(request, club_id=club_id)
if not pay_openid:
from jituan.services.member_recharge import MEMBER_CANCELLED_STATUS
chongzhi_jilu.zhuangtai = MEMBER_CANCELLED_STATUS
@@ -195,14 +195,15 @@ class HuiyuanGoumai(APIView):
chongzhi_jilu.save(update_fields=['zhuangtai', 'shuoming'])
return Response({
'code': 400,
'message': '用户openid不存在',
'message': '当前小程序未绑定微信openid请退出后重新登录再支付',
'dingdanid': dingdanid,
}, status=status.HTTP_400_BAD_REQUEST)
pay_params = self.generate_wechat_pay_params(
dingdanid=dingdanid,
jine=jine,
openid=pay_openid,
pay_type='huiyuan'
pay_type='huiyuan',
club_id=pay_club,
)
except Exception as e:
from jituan.services.member_recharge import MEMBER_CANCELLED_STATUS
@@ -234,13 +235,17 @@ class HuiyuanGoumai(APIView):
'message': '服务器内部错误,请稍后重试'
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def generate_wechat_pay_params(self, dingdanid, jine, openid, pay_type):
def generate_wechat_pay_params(self, dingdanid, jine, openid, pay_type, club_id=None):
"""生成微信支付参数(完整版,无省略)"""
# 微信支付配置 - 从settings中获取
from jituan.services.club_write import resolve_club_id_for_write
from jituan.services.wechat_pay import get_wechat_v2_config, log_wechat_v2_pay_diag, parse_wechat_v2_unifiedorder_response
pay_cfg = get_wechat_v2_config(resolve_club_id_for_write(self.request, self.request.user))
log_wechat_v2_pay_diag(pay_cfg, scene='huiyuan', openid=openid, order_hint=dingdanid)
pay_club = club_id or resolve_club_id_for_write(self.request, self.request.user)
pay_cfg = get_wechat_v2_config(pay_club)
uid = getattr(self.request.user, 'UserUID', '')
log_wechat_v2_pay_diag(
pay_cfg, scene='huiyuan', openid=openid, order_hint=f'{dingdanid} uid={uid}',
)
APPID = pay_cfg['appid']
MCHID = pay_cfg['mch_id']
KEY = pay_cfg['key']

View File

@@ -152,10 +152,14 @@ class JifenBuchong(APIView):
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
else:
try:
pay_openid, _ = get_payment_openid(request)
pay_club = resolve_club_id_for_write(request, request.user)
pay_openid, _ = get_payment_openid(request, club_id=pay_club)
if not pay_openid:
chongzhi_jilu.delete()
return Response({'code': 400, 'message': '用户openid不存在'}, status=status.HTTP_400_BAD_REQUEST)
return Response({
'code': 400,
'message': '当前小程序未绑定微信openid请退出后重新登录再支付',
}, status=status.HTTP_400_BAD_REQUEST)
pay_params = self.generate_wechat_pay_params(
dingdanid=dingdanid,
jine=jine,

View File

@@ -166,10 +166,14 @@ class YajinGoumai(APIView):
}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
else:
try:
pay_openid, _ = get_payment_openid(request)
pay_club = resolve_club_id_for_write(request, request.user)
pay_openid, _ = get_payment_openid(request, club_id=pay_club)
if not pay_openid:
chongzhi_jilu.delete()
return Response({'code': 400, 'message': '用户openid不存在'}, status=status.HTTP_400_BAD_REQUEST)
return Response({
'code': 400,
'message': '当前小程序未绑定微信openid请退出后重新登录再支付',
}, status=status.HTTP_400_BAD_REQUEST)
pay_params = self.generate_wechat_pay_params(
dingdanid=dingdanid,
jine=jine,