import pydash from django.core.handlers.wsgi import WSGIRequest from django.db import models from rest_framework import status from rest_framework.decorators import action from rest_framework.request import Request from rest_framework.response import Response from rest_framework.routers import DefaultRouter from rest_framework.viewsets import ViewSet from sixGuoDjango import BaseResponse, ResData from wechat_数据库.雪花算法.雪花算法工具 import generator from wechat_项目工具包.微信支付工具包.微信支付类 import paymentCategory, wechatPay class six商家转账ViewSets(ViewSet): @action(detail=False, methods=["post"], url_path="transfer") def six发起转账(self, request: Request): """ """ self_mini_openid = request.data.get("self_mini_openid", None) self_mini_unionid = request.data.get("self_mini_unionid", None) 提取积分值 = request.data.get("提取积分值", None) # 逻辑一: 先比较积分值是否超出提现的金额 # 积分值sum = share分享者积分.objects.filter(share分享者unionid=self_mini_unionid).values("share分享者unionid").annotate(xiao_age_sum=models.Sum("share分享积分值"), ) # 只有value(字段1,字段2)二个值完全相同的才会分配为一组 # 添加 order_by # result = 积分值sum.order_by("share分享者unionid").first() # print(result) # xiao_age_sum = pydash.get(obj=result, path="xiao_age_sum") # print(xiao_age_sum) # httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": xiao_age_sum}), ).model_dump() httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": {}}), ).model_dump() return Response(data=httpResData, status=status.HTTP_200_OK) if xiao_age_sum > 0 and xiao_age_sum >= 提取积分值: pass # 说明这里可以提现 # 业务逻辑 第一步.需要判断这个用户是否已经领过 新手红包 如何判断, 查询新手红包数据库,如果对象存在,则直接不能再领取了; out_bill_no = generator.generate_str() transfer_amount = 10 # 必须参数转账的金额 transferAccountsBody = { "appid": paymentCategory.appid, "out_bill_no": out_bill_no, # 必填 integer【商户单号】 # 商户系统内部的商家单号,要求此参数只能由数字、大小写字母组成,在商户系统内部唯一 "transfer_scene_id": "1000", # 必填 integer【转账场景ID】 该笔转账使用的转账场景,可前往“商户平台-产品中心-商家转账”中申请。如:1000(现金营销),1006(企业报销)等 # "openid":"ohQkD7A-N93kljcFmkCyG6e_D9vg", "openid": self_mini_openid, # 必填 integer【收款用户OpenID】 用户在商户appid下的唯一标识。发起转账前需获取到用户的OpenID,获取方式详见参数说明。 # "user_name":"757b340b45ebef5467rter35gf464344v3542sdf4t6re4tb4f54ty45t4yyry45", # 【收款用户姓名】 # 收款方真实姓名。需要加密传入,支持标准RSA算法和国密算法,公钥由微信侧提供。 "transfer_amount": transfer_amount, # 必填 integer【转账金额】 转账金额单位为“分”。 "transfer_remark": "新会员开通有礼", # 必填 string(32)【转账备注】 转账备注,用户收款时可见该备注信息,UTF8编码,最多允许32个字符 "notify_url": "https://xiao.sixgou.com/demopay/transfer_back/", # 选填【通知地址】 异步接收微信支付结果通知的回调地址,通知url必须为公网可访问的URL,必须为HTTPS,不能携带参数。 "user_recv_perception": "现金奖励", # 选填 【用户收款感知】 用户收款时感知到的收款原因将根据转账场景自动展示默认内容。如有其他展示需求, # 必填 array[TransferSceneReportInfo] 【转账场景报备信息】 各转账场景下需报备的内容,商户需要按照所属转账场景规则传参,详见转账场景报备信息字段说明。 "transfer_scene_report_infos": [ { "info_type": "活动名称", # 必填 string(15)【信息类型】 不能超过15个字符,商户所属转账场景下的信息类型,此字段内容为固定值 "info_content": "新会员有礼", # 必填 【信息内容】 不能超过32个字符,商户所属转账场景下的信息内容,商户可按实际业务场景自定义传参 }, { "info_type": "奖励说明", "info_content": "注册会员抽奖一等奖", }, ], } # wechat_data = wechatPay(payment=paymentCategory).transferAccounts商家转账到零钱(transferAccountsBody=transferAccountsBody) # print("返回的数据", wechat_data) # package_info = jmespath.search(data=wechat_data, expression="package_info") # create_time = jmespath.search(data=wechat_data, expression="create_time") # out_bill_no = jmespath.search(data=wechat_data, expression="out_bill_no") # state = jmespath.search(data=wechat_data, expression="state") # transfer_bill_no = jmespath.search(data=wechat_data, expression="transfer_bill_no") # WechatTransferOrder.objects.create( # out_bill_no=out_bill_no, transfer_bill_no=transfer_bill_no, wx_create_time=create_time, # state=state, transfer_amount=transfer_amount, package_info=package_info # ) # 前端调用的数据 = { # "mchId": paymentCategory.mchid, "appId": paymentCategory.appid, "package": package_info, # } # # 操作数据库,减掉提取的积分值 # share分享者积分.objects.create(share分享者unionid=self_mini_unionid, share分享类型="提取积分", share分享积分=-1) httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump() return Response(data=httpResData, status=status.HTTP_200_OK) else: pass httpResData = BaseResponse(resData=ResData(listData=[""], dictData={"demo": "xiaozizi"}), ).model_dump() return Response(data=httpResData, status=status.HTTP_200_OK) # 说明这里不能提现 httpResData = BaseResponse(resData=ResData(listData=[""], dictData={}), ).model_dump() return Response(data=httpResData, status=status.HTTP_200_OK) @action(detail=False, methods=["post"], url_path="transfer_back") def six发起转账回调(self, request: WSGIRequest | Request): pass wechat_data = wechatPay(payment=paymentCategory).callBack回调解密(response_body=request.body, headers=request.headers) print(wechat_data) return Response() six商家转账ViewSetsRouter = DefaultRouter() six商家转账ViewSetsRouter.register(prefix="", viewset=six商家转账ViewSets, basename="")