From bbd1e4dde2c86e2e4ca8f7d21c0a3201b4b71af7 Mon Sep 17 00:00:00 2001 From: Young <605887476@qq.com> Date: Fri, 27 Oct 2023 18:03:38 +0800 Subject: [PATCH] =?UTF-8?q?add:=20=E5=8F=91=E8=B4=A7=E4=BF=A1=E6=81=AF?= =?UTF-8?q?=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 + order/get_order.go | 64 +++++++++++++++++++++++ order/get_order_list.go | 39 ++++++++++++++ order/is_trade_managed.go | 28 ++++++++++ order/notify_confirm_receive.go | 28 ++++++++++ order/order.go | 17 ++++++ order/set_msg_jump_path.go | 23 ++++++++ order/upload_shipping_info.go | 54 +++++++++++++++++++ order_test.go | 93 +++++++++++++++++++++++++++++++++ subscribe_message.go | 6 +-- subscribemessage/send.go | 6 +-- weapp.go | 6 +++ 12 files changed, 359 insertions(+), 6 deletions(-) create mode 100644 .gitignore create mode 100644 order/get_order.go create mode 100644 order/get_order_list.go create mode 100644 order/is_trade_managed.go create mode 100644 order/notify_confirm_receive.go create mode 100644 order/order.go create mode 100644 order/set_msg_jump_path.go create mode 100644 order/upload_shipping_info.go create mode 100644 order_test.go diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..723ef36 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.idea \ No newline at end of file diff --git a/order/get_order.go b/order/get_order.go new file mode 100644 index 0000000..0b17833 --- /dev/null +++ b/order/get_order.go @@ -0,0 +1,64 @@ +package order + +import "github.com/medivhzhan/weapp/v3/request" + +type GetOrderRequest struct { + TransactionId string `json:"transaction_id"` //原支付交易对应的微信订单号。 + MerchantId string `json:"merchant_id"` //支付下单商户的商户号,由微信支付生成并下发。 + SubMerchantId string `json:"sub_merchant_id"` //二级商户号。 + MerchantTradeNo string `json:"merchant_trade_no"` //商户系统内部订单号,只能是数字、大小写字母`_-*`且在同一个商户号下唯一。 +} + +type Shipping struct { + DeliveryMode int `json:"delivery_mode"` //发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY + LogisticsType int `json:"logistics_type"` //物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 + FinishShipping bool `json:"finish_shipping"` //是否已完成全部发货。 + FinishShippingCount int `json:"finish_shipping_count"` //已完成全部发货的次数,未完成时为 0,完成时为 1,重新发货并完成后为 2。 + GoodsDesc string `json:"goods_desc"` //在小程序后台发货信息录入页录入的商品描述。 + ShippingList []struct { + TrackingNo string `json:"tracking_no"` //物流单号,示例值: "323244567777"。 + ExpressCompany string `json:"express_company"` //同城配送公司名或物流公司编码,快递公司ID,参见「查询物流公司编码列表」 示例值: "DHL"。 + GoodsDesc string `json:"goods_desc"` //使用上传物流信息 API 录入的该物流信息的商品描述。 + UploadTime int `json:"upload_time"` //该物流信息的上传时间,时间戳形式。 + Contact struct { + ConsignorContact string `json:"consignor_contact"` //寄件人联系方式。 + ReceiverContact string `json:"receiver_contact"` //收件人联系方式。 + } + } `json:"shipping_list"` //物流信息列表,发货物流单列表,支持统一发货(单个物流单)和分拆发货(多个物流单)两种模式。 +} + +type OrderStruct struct { + TransactionId string `json:"transaction_id"` //原支付交易对应的微信订单号。 + MerchantId string `json:"merchant_id"` //支付下单商户的商户号,由微信支付生成并下发。 + SubMerchantId string `json:"sub_merchant_id"` //二级商户号。 + MerchantTradeNo string `json:"merchant_trade_no"` //商户系统内部订单号,只能是数字、大小写字母`_-*`且在同一个商户号下唯一。 + Description string `json:"description"` //以分号连接的该支付单的所有商品描述,当超过120字时自动截断并以 “...” 结尾。 + PaidAmount int `json:"paid_amount"` //支付单实际支付金额,整型,单位:分钱。 + Openid string `json:"openid"` //支付者openid。 + TradeCreateTime int `json:"trade_create_time"` //交易创建时间,时间戳形式。 + PayTime int `json:"pay_time"` //支付时间,时间戳形式。 + InComplaint bool `json:"in_complaint"` //是否处在交易纠纷中。 + OrderState int `json:"order_state"` //订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款。 + Shipping Shipping `json:"shipping"` //发货信息。 +} + +type GetOrderResponse struct { + request.CommonError + Order *OrderStruct `json:"order"` +} + +// GetOrder 查询订单发货状态 +func (cli *Order) GetOrder(req *GetOrderRequest) (*GetOrderResponse, error) { + + url, err := cli.conbineURI("/wxa/sec/order/get_order", nil, true) + if err != nil { + return nil, err + } + + rsp := new(GetOrderResponse) + if err := cli.request.Post(url, req, rsp); err != nil { + return nil, err + } + + return rsp, nil +} diff --git a/order/get_order_list.go b/order/get_order_list.go new file mode 100644 index 0000000..9a4b470 --- /dev/null +++ b/order/get_order_list.go @@ -0,0 +1,39 @@ +package order + +import "github.com/medivhzhan/weapp/v3/request" + +type GetOrderListPayTimeRange struct { + BeginTime int `json:"begin_time"` //起始时间,时间戳形式,不填则视为从0开始。 + EndTime int `json:"end_time"` //结束时间(含),时间戳形式,不填则视为32位无符号整型的最大值。 +} + +type GetOrderListRequest struct { + PayTimeRange *GetOrderListPayTimeRange `json:"pay_time_range,omitempty"` //支付时间所属范围。 + PageSize int `json:"page_size,omitempty"` //翻页时使用,返回列表的长度,默认为100。 + OrderState int `json:"order_state,omitempty"` //订单状态枚举:(1) 待发货;(2) 已发货;(3) 确认收货;(4) 交易完成;(5) 已退款。 + Openid int `json:"openid,omitempty"` //支付者openid。 + LastIndex int `json:"last_index,omitempty"` //翻页时使用,获取第一页时不用传入,如果查询结果中 has_more 字段为 true,则传入该次查询结果中返回的 last_index 字段可获取下一页。 +} + +type GetOrderListResponse struct { + request.CommonError + LastIndex string `json:"last_index"` //翻页时使用。 + HasMore bool `json:"has_more"` //是否还有更多支付单。 + OrderList []*OrderStruct `json:"order_list"` +} + +// GetOrderList 查询订单列表 +func (cli *Order) GetOrderList(req *GetOrderListRequest) (*GetOrderListResponse, error) { + + url, err := cli.conbineURI("/wxa/sec/order/get_order_list", nil, true) + if err != nil { + return nil, err + } + + rsp := new(GetOrderListResponse) + if err := cli.request.Post(url, req, rsp); err != nil { + return nil, err + } + + return rsp, nil +} diff --git a/order/is_trade_managed.go b/order/is_trade_managed.go new file mode 100644 index 0000000..dfc7763 --- /dev/null +++ b/order/is_trade_managed.go @@ -0,0 +1,28 @@ +package order + +import "github.com/medivhzhan/weapp/v3/request" + +type IsTradeManagedRequest struct { + Appid string `json:"appid"` //待查询小程序的 appid,非服务商调用时仅能查询本账号 +} + +type IsTradeManagedResponse struct { + request.CommonError + IsTradeManaged bool `json:"is_trade_managed"` +} + +// IsTradeManaged 查询小程序是否已开通发货信息管理服务 +func (cli *Order) IsTradeManaged(req *IsTradeManagedRequest) (*IsTradeManagedResponse, error) { + + url, err := cli.conbineURI("/wxa/sec/order/is_trade_managed", nil, true) + if err != nil { + return nil, err + } + + rsp := new(IsTradeManagedResponse) + if err := cli.request.Post(url, req, rsp); err != nil { + return nil, err + } + + return rsp, nil +} diff --git a/order/notify_confirm_receive.go b/order/notify_confirm_receive.go new file mode 100644 index 0000000..c62815a --- /dev/null +++ b/order/notify_confirm_receive.go @@ -0,0 +1,28 @@ +package order + +import "github.com/medivhzhan/weapp/v3/request" + +type NotifyConfirmReceiveRequest struct { + TransactionId string `json:"transaction_id,omitempty"` //原支付交易对应的微信订单号 + MerchantId string `json:"merchant_id,omitempty"` //支付下单商户的商户号,由微信支付生成并下发 + SubMerchantId string `json:"sub_merchant_id,omitempty"` //二级商户号 + MerchantTradeNo string `json:"merchant_trade_no,omitempty"` //商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一 + ReceivedTime int `json:"received_time"` //快递签收时间,时间戳形式。 + +} + +// NotifyConfirmReceive 确认收货提醒接口 +func (cli *Order) NotifyConfirmReceive(req *IsTradeManagedRequest) (*request.CommonError, error) { + + url, err := cli.conbineURI("/wxa/sec/order/notify_confirm_receive", nil, true) + if err != nil { + return nil, err + } + + rsp := new(request.CommonError) + if err := cli.request.Post(url, req, rsp); err != nil { + return nil, err + } + + return rsp, nil +} diff --git a/order/order.go b/order/order.go new file mode 100644 index 0000000..4176f25 --- /dev/null +++ b/order/order.go @@ -0,0 +1,17 @@ +package order + +import "github.com/medivhzhan/weapp/v3/request" + +type Order struct { + request *request.Request + // 组成完整的 URL 地址 + // 默认包含 AccessToken + conbineURI func(url string, req interface{}, withToken bool) (string, error) +} + +func NewOrder(request *request.Request, conbineURI func(url string, req interface{}, withToken bool) (string, error)) *Order { + return &Order{ + request: request, + conbineURI: conbineURI, + } +} diff --git a/order/set_msg_jump_path.go b/order/set_msg_jump_path.go new file mode 100644 index 0000000..175f338 --- /dev/null +++ b/order/set_msg_jump_path.go @@ -0,0 +1,23 @@ +package order + +import "github.com/medivhzhan/weapp/v3/request" + +type SetMsgJumpPathRequest struct { + Path string `json:"path"` //商户自定义跳转路径。 +} + +// SetMsgJumpPath 消息跳转路径设置接口 +func (cli *Order) SetMsgJumpPath(req *SetMsgJumpPathRequest) (*request.CommonError, error) { + + url, err := cli.conbineURI("/wxa/sec/order/set_msg_jump_path", nil, true) + if err != nil { + return nil, err + } + + rsp := new(request.CommonError) + if err := cli.request.Post(url, req, rsp); err != nil { + return nil, err + } + + return rsp, nil +} diff --git a/order/upload_shipping_info.go b/order/upload_shipping_info.go new file mode 100644 index 0000000..5b1afc0 --- /dev/null +++ b/order/upload_shipping_info.go @@ -0,0 +1,54 @@ +package order + +import ( + "github.com/medivhzhan/weapp/v3/request" +) + +type OrderKey struct { + OrderNumberType int `json:"order_number_type"` //订单单号类型,用于确认需要上传详情的订单。枚举值1,使用下单商户号和商户侧单号;枚举值2,使用微信支付单号。 + TransactionId string `json:"transaction_id,omitempty"` //原支付交易对应的微信订单号 + Mchid string `json:"mchid,omitempty"` //支付下单商户的商户号,由微信支付生成并下发。 + OutTradeNo string `json:"out_trade_no,omitempty"` //商户系统内部订单号,只能是数字、大小写字母`_-*`且在同一个商户号下唯一 +} + +type Payer struct { + Openid string `json:"openid"` +} + +type Contact struct { + ConsignorContact string `json:"consignor_contact,omitempty"` //寄件人联系方式,寄件人联系方式,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 + ReceiverContact string `json:"receiver_contact,omitempty"` //收件人联系方式,收件人联系方式为,采用掩码传输,最后4位数字不能打掩码 示例值: `189****1234, 021-****1234, ****1234, 0**2-***1234, 0**2-******23-10, ****123-8008` 值限制: 0 ≤ value ≤ 1024 +} + +type ShippingList struct { + TrackingNo string `json:"tracking_no,omitempty"` //物流单号,物流快递发货时必填,示例值: 323244567777 字符字节限制: [1, 128] + ExpressCompany string `json:"express_company,omitempty"` //物流公司编码,快递公司ID,参见「查询物流公司编码列表」,物流快递发货时必填, 示例值: DHL 字符字节限制: [1, 128] + ItemDesc string `json:"item_desc"` //商品信息,例如:微信红包抱枕*1个,限120个字以内 + Contact *Contact `json:"contact,omitempty"` //联系方式,当发货的物流公司为顺丰时,联系方式为必填,收件人或寄件人联系方式二选一 +} + +type UploadShippingInfoRequest struct { + OrderKey OrderKey `json:"order_key"` //合单订单,需要上传物流详情的合单订单,根据订单类型二选一 + DeliveryMode string `json:"delivery_mode"` //发货模式,发货模式枚举值:1、UNIFIED_DELIVERY(统一发货)2、SPLIT_DELIVERY(分拆发货) 示例值: UNIFIED_DELIVERY + LogisticsType int `json:"logistics_type"` //物流模式,发货方式枚举值:1、实体物流配送采用快递公司进行实体物流配送形式 2、同城配送 3、虚拟商品,虚拟商品,例如话费充值,点卡等,无实体配送形式 4、用户自提 + IsAllDelivered bool `json:"is_all_delivered,omitempty"` //分拆发货模式时必填,用于标识分拆发货模式下是否已全部发货完成,只有全部发货完成的情况下才会向用户推送发货完成通知。示例值: true/false + ShippingList []ShippingList `json:"shipping_list"` //物流信息列表,发货物流单列表,支持统一发货(单个物流单)和分拆发货(多个物流单)两种模式,多重性: [1, 10] + UploadTime string `json:"upload_time"` //上传时间,用于标识请求的先后顺序 示例值: `2022-12-15T13:29:35.120+08:00` RFC 3339 格式 + Payer Payer `json:"payer"` //支付者,支付者信息 +} + +// UploadShippingInfo 发货信息录入接口 +func (cli *Order) UploadShippingInfo(req *UploadShippingInfoRequest) (*request.CommonError, error) { + + url, err := cli.conbineURI("/wxa/sec/order/upload_shipping_info", nil, true) + if err != nil { + return nil, err + } + + rsp := new(request.CommonError) + if err := cli.request.Post(url, req, rsp); err != nil { + return nil, err + } + + return rsp, nil +} diff --git a/order_test.go b/order_test.go new file mode 100644 index 0000000..d54ab0a --- /dev/null +++ b/order_test.go @@ -0,0 +1,93 @@ +package weapp + +import ( + "github.com/medivhzhan/weapp/v3/order" + "testing" + "time" +) + +var appid = "wx0417444aae7355f7" +var accessToken = "74_7-AVnmRJZz5MpDoeaygGfuSZL5TbSjJQmJJ0lXSJhuH0z0IHCGNe3-Uw_VE42xCiJAVgj29fidOITvQvXwu1luKhIm0fbXZvqTWzBGVo98vYJff-DjSDtocqrFy8dYUoCV8sJCTzPtiKJV20CZFeADDGDJ" + +func getClient() *Client { + tokenGetter := func(appid, secret string) (token string, expireIn uint) { + return accessToken, 10 + } + + sdk := NewClient( + appid, + "", + WithAccessTokenSetter(tokenGetter), + ) + + return sdk +} + +func TestClient_NewOrderIsTradeManaged(t *testing.T) { + orderServe := getClient().NewOrder() + isTradeManaged, err := orderServe.IsTradeManaged(&order.IsTradeManagedRequest{ + Appid: "wx0417444aae7355f7", + }) + if err != nil { + t.Errorf("isTradeManaged err: %+v", err) + return + } + + t.Logf("isTradeManaged: %#v", isTradeManaged) +} + +func TestClient_NewOrderUploadShippingInfo(t *testing.T) { + orderServe := getClient().NewOrder() + isTradeManaged, err := orderServe.UploadShippingInfo(&order.UploadShippingInfoRequest{ + OrderKey: order.OrderKey{ + OrderNumberType: 2, + TransactionId: "4200002027202310272131934449", + Mchid: "", + OutTradeNo: "", + }, + DeliveryMode: "UNIFIED_DELIVERY", + LogisticsType: 4, + IsAllDelivered: false, + ShippingList: []order.ShippingList{ + { + ItemDesc: "这是一个商品", + }, + }, + UploadTime: time.Now().Format(time.RFC3339), + Payer: order.Payer{ + Openid: "omlPt4v2t9G40JnX4uXjlA9vsfK0", + }, + }) + if err != nil { + t.Errorf("UploadShippingInfo err: %+v", err) + return + } + + t.Logf("UploadShippingInfo: %#v", isTradeManaged) +} + +func TestClient_NewOrderGetOrder(t *testing.T) { + orderServe := getClient().NewOrder() + resp, err := orderServe.GetOrder(&order.GetOrderRequest{ + TransactionId: "4200002027202310272131934449", + }) + if err != nil { + t.Errorf("GetOrder err: %+v", err) + return + } + + t.Logf("GetOrder: %#v", resp.Order) +} + +func TestClient_NewOrderGetOrderList(t *testing.T) { + orderServe := getClient().NewOrder() + resp, err := orderServe.GetOrderList(&order.GetOrderListRequest{}) + if err != nil { + t.Errorf("GetOrder err: %+v", err) + return + } + + for _, orderStruct := range resp.OrderList { + t.Logf("GetOrder: %#v", orderStruct) + } +} diff --git a/subscribe_message.go b/subscribe_message.go index 2b29f28..630915c 100644 --- a/subscribe_message.go +++ b/subscribe_message.go @@ -276,9 +276,9 @@ type MiniprogramState = string // developer为开发版;trial为体验版;formal为正式版;默认为正式版 const ( - MiniprogramStateDeveloper = "developer" - MiniprogramStateTrial = "trial" - MiniprogramStateFormal = "formal" + MiniprogramStateDeveloper MiniprogramState = "developer" + MiniprogramStateTrial MiniprogramState = "trial" + MiniprogramStateFormal MiniprogramState = "formal" ) // Send 发送订阅消息 diff --git a/subscribemessage/send.go b/subscribemessage/send.go index cc86f95..64f3b2d 100644 --- a/subscribemessage/send.go +++ b/subscribemessage/send.go @@ -28,9 +28,9 @@ type MiniprogramState = string // developer为开发版;trial为体验版;formal为正式版;默认为正式版 const ( - MiniprogramStateDeveloper = "developer" - MiniprogramStateTrial = "trial" - MiniprogramStateFormal = "formal" + MiniprogramStateDeveloper MiniprogramState = "developer" + MiniprogramStateTrial MiniprogramState = "trial" + MiniprogramStateFormal MiniprogramState = "formal" ) // 发送订阅消息 diff --git a/weapp.go b/weapp.go index d33b3c5..4c94f40 100644 --- a/weapp.go +++ b/weapp.go @@ -1,6 +1,7 @@ package weapp import ( + "github.com/medivhzhan/weapp/v3/order" "log" "net/http" "os" @@ -257,3 +258,8 @@ func (cli *Client) NewSecurity() *security.Security { func (cli *Client) NewPhonenumber() *phonenumber.Phonenumber { return phonenumber.NewPhonenumber(cli.request, cli.conbineURI) } + +// NewOrder 发货内容管理 +func (cli *Client) NewOrder() *order.Order { + return order.NewOrder(cli.request, cli.conbineURI) +}