import datetime import jmespath import orjson import requests from django.core.handlers.wsgi import WSGIRequest 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 SimpleRouter from rest_framework.viewsets import ViewSet from wechat_第三方接口.顺丰物流.顺丰参数 import sfToken class SF顺丰业务接口ViewSets(ViewSet): @action(detail=False, methods=["get", "post", "put", "delete"], url_path="order_create") def 快递下订单接口(self, request: WSGIRequest | Request): """ :param request: :return: """ print('============') requestID = f"SF{datetime.date.strftime(datetime.datetime.now(), format="%Y%m%d%H%M%S%f")}" accessToken = sfToken() 沙箱环境 = f"https://sfapi-sbox.sf-express.com/std/service" sftimestamp = str(int(datetime.datetime.now().timestamp())) cargoDetails托寄物信息 = [{"name": "物品", "count": 1}] 寄件人 = { "contactType": 1, "company": "1", "contact": "元宝", "mobile": "13800138000", "country": "CN", "province": "江苏省", "city": "泰州市", "county": "海陵区", "address": "城西街道任景路603号" } 收件人 = { "contactType": 2, "company": "2", "contact": "大帅", "mobile": "13800138001", "country": "CN", "province": "四川省", "city": "成都市", "county": "新都区", "address": "桂湖街道一社16号" } msgData = { # 响应报文的语言,缺省值为zh-CN "language": "zh-CN", "parcelQty": 1, # 客户订单号,重复使用订单号时返回第一次下单成功时的运单信息 "orderId": f"SFOD{datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d%H%M%S%f")}", # 托寄物信息 "cargoDetails": cargoDetails托寄物信息, "contactInfoList": [寄件人, 收件人], "isReturnRoutelabel": 1, "isGenWaybillNo": 1, "payMethod": 1, "isDocall": 0, "monthlyCard": "7551234567" } formData = { "serviceCode": "EXP_RECE_CREATE_ORDER", "accessToken": accessToken, "timestamp": sftimestamp, "partnerID": "MDSKJJ1KDLJN", "requestID": requestID, "msgData": orjson.dumps(msgData).decode(encoding="utf-8") } response_data = requests.post( url=沙箱环境, data=formData, headers={"Content-Type": "application/x-www-form-urlencoded", }, ) apiResultData = jmespath.search(data=response_data.json(), expression="apiResultData") return Response(data=orjson.loads(apiResultData), status=status.HTTP_200_OK) @action(detail=False, methods=["get", "post", "put", "delete"], url_path="order_update") def 订单确认取消接口(self, request: WSGIRequest | Request): """ :param request: :return: """ uri = f"https://sfapi-sbox.sf-express.com/std/service" accessToken = sfToken() sftimestamp = str(int(datetime.datetime.now().timestamp())) requestID = datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d%H%M%S%f") msgData = { "dealType": 1, "orderId": "SFOD20251126214101523682", # "totalHeight": 29.98, # "totalLength": 29.98, # "totalVolume": 26946.035992000005, # "totalWeight": 2.09, # "totalWidth": 29.98, "waybillNoInfoList": [ { "waybillNo": "SF7444700285553", "waybillType": 1 } ] } formData = { "serviceCode": "EXP_RECE_UPDATE_ORDER", "accessToken": accessToken, "timestamp": sftimestamp, "partnerID": "MDSKJJ1KDLJN", "requestID": requestID, "msgData": orjson.dumps(msgData).decode(encoding="utf-8") } response_data = requests.post( url=uri, data=formData, headers={"Content-Type": "application/x-www-form-urlencoded", "charset": "UTF-8"}, ) print(response_data.json(), "=========") res = response_data.json() apiResultData = jmespath.search(data=res, expression="apiResultData") apiResultData = orjson.loads(apiResultData) return Response(data=apiResultData, status=status.HTTP_200_OK) @action(detail=False, methods=["get", "post", "put", "delete"], url_path="order_search_resp") def 订单结果查询接口(self, request: WSGIRequest | Request): """ :param request: :return: """ uri = f"https://sfapi-sbox.sf-express.com/std/service" accessToken = sfToken() sftimestamp = str(int(datetime.datetime.now().timestamp())) requestID = datetime.datetime.strftime(datetime.datetime.now(), "%Y%m%d%H%M%S%f") msgData = { "searchType": "1", "orderId": "SFOD20251126214101523682", "language": "zh-cn" } formData = { "serviceCode": "EXP_RECE_SEARCH_ORDER_RESP", "accessToken": accessToken, "timestamp": sftimestamp, "partnerID": sfID, "requestID": requestID, "msgData": orjson.dumps(msgData).decode(encoding="utf-8") } response_data = requests.post( url=uri, data=formData, headers={"Content-Type": "application/x-www-form-urlencoded", "charset": "UTF-8"}, ) res = response_data.json() apiResultData = jmespath.search(data=res, expression="apiResultData") apiResultData = orjson.loads(apiResultData) return Response(data=apiResultData, status=status.HTTP_200_OK) SF顺丰业务接口ViewSetsRouter = SimpleRouter() SF顺丰业务接口ViewSetsRouter.register(prefix="", viewset=SF顺丰业务接口ViewSets, basename="")