Files
2026-08-06 20:39:45 +08:00

136 lines
8.4 KiB
Python

import emoji
import pydash
import requests
from pydantic import BaseModel
from ulid import ULID
from wechat_微信支付证书.江苏六果科技有限公司支付证书.江苏六果科技有限公司支付参数 import sixpay六果科技公司
from wechat_数据库.支付订单数据库.商品订单数据 import order订单
from wechat_项目工具包.微信支付工具包.微信支付类 import wechatPay
class weiPay电子发票(BaseModel):
# demo_可选: Optional[int] = None # 可选值
# demo_默认值: int = Field(default=100001, description="描述") # 有默认值
# demo_联合类型: Literal["xiao", "zizi"] = Field(..., description="描述")
def model_post_init(self, __context):
print("")
def 配置开发选项(self):
"""配置,小程序用户申请开票时的回调请求地址URL"""
pass
uri = f"https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/merchant/development-config"
http_uri = "https://xiao.sixgou.com/wechat_mini/invoice/callback/"
请求体 = {
"callback_url": http_uri,
"show_fapiao_cell": True
}
header电子发票请求头 = wechatPay(payment=sixpay六果科技公司).构造签名串(uri=uri, body_data=请求体, method="PATCH")
postData = requests.patch(url=uri, json=请求体, headers=header电子发票请求头)
def 获取商户开票基础信息(self):
pass
uri = f"https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/merchant/base-information"
heardes_data = wechatPay(payment=sixpay六果科技公司).构造签名串(uri=uri, method="GET")
getData = requests.get(url=uri, headers=heardes_data)
print(getData)
print(getData.text)
@classmethod
def 查询电子发票的数据(cls, fapiao_apply_id: str):
fapiao_apply_id = "4500000249202608055531280227"
uri = f"https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/fapiao-applications/{fapiao_apply_id}"
headers = wechatPay(payment=sixpay六果科技公司).构造签名串(uri=uri, method="GET")
postData = requests.get(url=uri, headers=headers)
print(postData)
print(postData.json())
@classmethod
def 开具电子发票(cls, fapiao_apply_id, 用户填写的开票):
pass
uri = f"https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/fapiao-applications"
发起开票的数据 = {
"scene": "WITH_WECHATPAY", # 开票场景,固定值 "WITH_WECHATPAY" 表示该开票申请来源于微信支付订单
"fapiao_apply_id": fapiao_apply_id, # 发票申请单号,从"获取用户填写抬头信息"接口返回的 fapiao_apply_id
"fapiao_information": [ # 发票信息列表(本次只开一张票,故只有一个元素)
{
"fapiao_id": "20200701123456", # 商户侧发票单号,由商户自行生成,保证唯一
"total_amount": 1, # 总价税合计,单位为分(整数)
"need_list": False, # 是否需要发票明细清单,false 表示不需要(即只在票面显示总金额)
"remark": "微信电子发票测试备注", # 发票备注(选填)
"items": [ # 发票行项目列表
{
"tax_code": "3010101020203000000", # 税收分类编码(需从"获取商品和服务税收分类对照表"接口获取)
"goods_category": "洗化用品", # 商品类别(选填,用于辅助分类)
"goods_name": "六果洗衣液", # 商品名称(必填,显示在发票明细上)
"goods_id": 1, # 商品编号(商户自定义,选填
"specification": "A4", # 规格型号(选填)
"unit": "根", # 计量单位(选填,如“次”“个”“件”)
"quantity": 1, # 数量(整数,此处数量极大,实际应根据订单合理设置)
"total_amount": 1, # 该行项目的总价税合计,单位为分(应与 total_amount 逻辑一致)
"tax_rate": 1300, # 税率,单位为万分比(如 13% 填 1300)
"tax_prefer_mark": "NO_FAVORABLE", # 税收优惠政策标识:NO_FAVORABLE 表示不享受优惠
"discount": False, # 是否享受折扣,false 表示不折扣
}
]
}
]
}
发起开票的数据.update({"buyer_information": 用户填写的开票})
商家侧生成的发票单号 = f"{ULID()}"
发票对象 = order订单.objects.get(order支付微信官方订单号=fapiao_apply_id)
print(发票对象.order购物车商品总价)
总价税合计 = 发票对象.order购物车商品总价
goods_name = emoji.replace_emoji(pydash.get(obj=pydash.head(发票对象.order购物车商品数据), path="goods_商品标题"))
销售规格 = pydash.get(obj=pydash.head(发票对象.order购物车商品数据), path="销售规格")
单个商品订单数量 = pydash.get(obj=pydash.head(发票对象.order购物车商品数据), path="单个商品订单数量")
fapiao_information = [
{
"fapiao_id": 商家侧生成的发票单号, # 商户侧发票单号,由商户自行生成,保证唯一
"total_amount": 总价税合计, # 总价税合计,单位为分(整数)
"need_list": False, # 是否需要发票明细清单,false 表示不需要(即只在票面显示总金额)
"remark": "微信电子发票", # 发票备注(选填)
"items": [ # 发票行项目列表
{
"tax_code": "3010101020203000000", # 税收分类编码(需从"获取商品和服务税收分类对照表"接口获取)
"goods_category": "洗化用品", # 商品类别(选填,用于辅助分类)
"goods_name": goods_name, # 商品名称(必填,显示在发票明细上)
"goods_id": 1, # 商品编号(商户自定义,选填)
"specification": 销售规格, # 规格型号(选填)
"unit": "根", # 计量单位(选填,如“次”“个”“件”)
"quantity": 单个商品订单数量, # 数量(整数,此处数量极大,实际应根据订单合理设置)
"total_amount": 总价税合计, # 该行项目的总价税合计,单位为分(应与 total_amount 逻辑一致)
"tax_rate": 1300, # 税率,单位为万分比(如 13% 填 1300)
"tax_prefer_mark": "NO_FAVORABLE", # 税收优惠政策标识:NO_FAVORABLE 表示不享受优惠
"discount": False, # 是否享受折扣,false 表示不折扣
}
]
}
]
发起开票的数据.update({"fapiao_information": fapiao_information})
print(发起开票的数据)
headers = wechatPay(payment=sixpay六果科技公司).构造签名串(uri=uri, body_data=发起开票的数据, method="POST")
headers.update({"Wechatpay-Serial": "11D762828E947104028F2D045DE78FA806D0D4F2"})
print("打印一下请求头", headers)
postData = requests.post(url=uri, json=发起开票的数据, headers=headers)
print(postData.text)
@classmethod
def 获取用户填写的开票(cls, fapiao_apply_id):
uri = f"https://api.mch.weixin.qq.com/v3/new-tax-control-fapiao/user-title?fapiao_apply_id={fapiao_apply_id}&scene=WITH_WECHATPAY"
headers = wechatPay(payment=sixpay六果科技公司).构造签名串(uri=uri, method="GET")
postData = requests.get(url=uri, headers=headers)
return postData.json()
if __name__ == "__main__":
pass
用户填写的开票 = weiPay电子发票.获取用户填写的开票(fapiao_apply_id="4500000272202608055614870626")
weiPay电子发票.开具电子发票(fapiao_apply_id="4500000272202608055614870626", 用户填写的开票=用户填写的开票)