mirror of
https://github.com/silenceper/wechat.git
synced 2026-02-04 12:52:27 +08:00
Compare commits
2 Commits
9b028e5368
...
f0f35e2f77
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f0f35e2f77 | ||
|
|
eebfb93386 |
618
miniprogram/express/intracity.go
Normal file
618
miniprogram/express/intracity.go
Normal file
@@ -0,0 +1,618 @@
|
|||||||
|
package express
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/silenceper/wechat/v2/util"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 同城配送 API URL
|
||||||
|
// https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/express/business/intracity_service.html
|
||||||
|
const (
|
||||||
|
// 开通门店权限
|
||||||
|
intracityApplyURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/apply?access_token=%s"
|
||||||
|
// 创建门店
|
||||||
|
intracityCreateStoreURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/createstore?access_token=%s"
|
||||||
|
// 查询门店
|
||||||
|
intracityQueryStoreURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/querystore?access_token=%s"
|
||||||
|
// 更新门店
|
||||||
|
intracityUpdateStoreURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/updatestore?access_token=%s"
|
||||||
|
// 门店运费充值
|
||||||
|
intracityStoreChargeURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/storecharge?access_token=%s"
|
||||||
|
// 门店运费退款
|
||||||
|
intracityStoreRefundURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/storerefund?access_token=%s"
|
||||||
|
// 门店运费流水查询
|
||||||
|
intracityQueryFlowURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/queryflow?access_token=%s"
|
||||||
|
// 门店余额查询
|
||||||
|
intracityBalanceQueryURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/balancequery?access_token=%s"
|
||||||
|
// 预下配送单(查询运费)
|
||||||
|
intracityPreAddOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/preaddorder?access_token=%s"
|
||||||
|
// 创建配送单
|
||||||
|
intracityAddOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/addorder?access_token=%s"
|
||||||
|
// 查询配送单
|
||||||
|
intracityQueryOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/queryorder?access_token=%s"
|
||||||
|
// 取消配送单
|
||||||
|
intracityCancelOrderURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/cancelorder?access_token=%s"
|
||||||
|
// 模拟配送回调(仅用于测试)
|
||||||
|
intracityMockNotifyURL = "https://api.weixin.qq.com/cgi-bin/express/intracity/mocknotify?access_token=%s"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PayMode 充值/扣费主体
|
||||||
|
type PayMode string
|
||||||
|
|
||||||
|
const (
|
||||||
|
// PayModeStore 门店
|
||||||
|
PayModeStore PayMode = "PAY_MODE_STORE"
|
||||||
|
// PayModeApp 小程序
|
||||||
|
PayModeApp PayMode = "PAY_MODE_APP"
|
||||||
|
// PayModeComponent 服务商
|
||||||
|
PayModeComponent PayMode = "PAY_MODE_COMPONENT"
|
||||||
|
)
|
||||||
|
|
||||||
|
// OrderPattern 运力偏好
|
||||||
|
type OrderPattern uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// OrderPatternPriceFirst 价格优先
|
||||||
|
OrderPatternPriceFirst OrderPattern = 1
|
||||||
|
// OrderPatternTransFirst 运力优先
|
||||||
|
OrderPatternTransFirst OrderPattern = 2
|
||||||
|
)
|
||||||
|
|
||||||
|
// FlowType 流水类型
|
||||||
|
type FlowType uint32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// FlowTypeCharge 充值流水
|
||||||
|
FlowTypeCharge FlowType = 1
|
||||||
|
// FlowTypeConsume 消费流水
|
||||||
|
FlowTypeConsume FlowType = 2
|
||||||
|
// FlowTypeRefund 退款流水
|
||||||
|
FlowTypeRefund FlowType = 3
|
||||||
|
)
|
||||||
|
|
||||||
|
// IntracityDeliveryStatus 配送单状态
|
||||||
|
type IntracityDeliveryStatus int32
|
||||||
|
|
||||||
|
const (
|
||||||
|
// IntracityDeliveryStatusReady 配送单待接单
|
||||||
|
IntracityDeliveryStatusReady IntracityDeliveryStatus = 100
|
||||||
|
// IntracityDeliveryStatusPickedUp 配送单待取货
|
||||||
|
IntracityDeliveryStatusPickedUp IntracityDeliveryStatus = 101
|
||||||
|
// IntracityDeliveryStatusOngoing 配送单配送中
|
||||||
|
IntracityDeliveryStatusOngoing IntracityDeliveryStatus = 102
|
||||||
|
// IntracityDeliveryStatusFinished 配送单已送达
|
||||||
|
IntracityDeliveryStatusFinished IntracityDeliveryStatus = 200
|
||||||
|
// IntracityDeliveryStatusCancelled 配送单已取消
|
||||||
|
IntracityDeliveryStatusCancelled IntracityDeliveryStatus = 300
|
||||||
|
// IntracityDeliveryStatusAbnormal 配送单异常
|
||||||
|
IntracityDeliveryStatusAbnormal IntracityDeliveryStatus = 400
|
||||||
|
)
|
||||||
|
|
||||||
|
// IntracityAddressInfo 门店地址信息
|
||||||
|
type IntracityAddressInfo struct {
|
||||||
|
Province string `json:"province"` // 省/自治区/直辖市
|
||||||
|
City string `json:"city"` // 地级市
|
||||||
|
Area string `json:"area"` // 县/县级市/区
|
||||||
|
Street string `json:"street"` // 街道
|
||||||
|
House string `json:"house"` // 具体门牌号或详细地址
|
||||||
|
Lat float64 `json:"lat"` // 门店所在地纬度
|
||||||
|
Lng float64 `json:"lng"` // 门店所在地经度
|
||||||
|
Phone string `json:"phone"` // 门店联系电话
|
||||||
|
Name string `json:"name,omitempty"` // 联系人姓名(收货地址时使用)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityStoreInfo 门店信息
|
||||||
|
type IntracityStoreInfo struct {
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
OutStoreID string `json:"out_store_id"` // 自定义门店编号
|
||||||
|
CityID string `json:"city_id"` // 门店所在城市ID
|
||||||
|
StoreName string `json:"store_name"` // 门店名称
|
||||||
|
OrderPattern OrderPattern `json:"order_pattern"` // 运力偏好
|
||||||
|
ServiceTransPrefer string `json:"service_trans_prefer"` // 优先使用的运力ID
|
||||||
|
AddressInfo IntracityAddressInfo `json:"address_info"` // 门店地址信息
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============ 门店管理接口 ============
|
||||||
|
|
||||||
|
// IntracityApply 开通门店权限
|
||||||
|
// https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/industry/express/business/intracity_service.html
|
||||||
|
func (express *Express) IntracityApply(ctx context.Context) error {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityApplyURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, map[string]interface{}{})
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return util.DecodeWithCommonError(response, "IntracityApply")
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateStoreRequest 创建门店请求参数
|
||||||
|
type CreateStoreRequest struct {
|
||||||
|
OutStoreID string `json:"out_store_id"` // 自定义门店编号
|
||||||
|
StoreName string `json:"store_name"` // 门店名称
|
||||||
|
OrderPattern OrderPattern `json:"order_pattern,omitempty"` // 运力偏好:1-价格优先,2-运力优先
|
||||||
|
ServiceTransPrefer string `json:"service_trans_prefer,omitempty"` // 优先使用的运力ID,order_pattern=2时必填
|
||||||
|
AddressInfo IntracityAddressInfo `json:"address_info"` // 门店地址信息
|
||||||
|
}
|
||||||
|
|
||||||
|
// CreateStoreResponse 创建门店返回参数
|
||||||
|
type CreateStoreResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
OutStoreID string `json:"out_store_id"` // 自定义门店ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityCreateStore 创建门店
|
||||||
|
func (express *Express) IntracityCreateStore(ctx context.Context, req *CreateStoreRequest) (res CreateStoreResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityCreateStoreURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityCreateStore")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryStoreRequest 查询门店请求参数
|
||||||
|
type QueryStoreRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
|
||||||
|
OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryStoreResponse 查询门店返回参数
|
||||||
|
type QueryStoreResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
Total uint32 `json:"total"` // 符合条件的门店总数
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
StoreList []IntracityStoreInfo `json:"store_list"` // 门店信息列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityQueryStore 查询门店
|
||||||
|
func (express *Express) IntracityQueryStore(ctx context.Context, req *QueryStoreRequest) (res QueryStoreResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityQueryStoreURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityQueryStore")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStoreKeyInfo 更新门店的key信息
|
||||||
|
type UpdateStoreKeyInfo struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
|
||||||
|
OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号,二选一
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStoreContent 更新门店的内容
|
||||||
|
type UpdateStoreContent struct {
|
||||||
|
StoreName string `json:"store_name,omitempty"` // 门店名称
|
||||||
|
OrderPattern OrderPattern `json:"order_pattern,omitempty"` // 运力偏好
|
||||||
|
ServiceTransPrefer string `json:"service_trans_prefer,omitempty"` // 优先使用的运力ID
|
||||||
|
AddressInfo *IntracityAddressInfo `json:"address_info,omitempty"` // 门店地址信息
|
||||||
|
}
|
||||||
|
|
||||||
|
// UpdateStoreRequest 更新门店请求参数
|
||||||
|
type UpdateStoreRequest struct {
|
||||||
|
Keys UpdateStoreKeyInfo `json:"keys"` // 门店编号
|
||||||
|
Content UpdateStoreContent `json:"content"` // 更新内容
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityUpdateStore 更新门店
|
||||||
|
func (express *Express) IntracityUpdateStore(ctx context.Context, req *UpdateStoreRequest) error {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityUpdateStoreURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return util.DecodeWithCommonError(response, "IntracityUpdateStore")
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============ 充值退款接口 ============
|
||||||
|
|
||||||
|
// StoreChargeRequest 门店运费充值请求参数
|
||||||
|
type StoreChargeRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号,pay_mode=PAY_MODE_STORE时必传
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
Amount uint32 `json:"amount"` // 充值金额,单位:分,50元起充
|
||||||
|
PayMode PayMode `json:"pay_mode,omitempty"` // 充值主体
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreChargeResponse 门店运费充值返回参数
|
||||||
|
type StoreChargeResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
PayURL string `json:"payurl"` // 充值页面地址
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityStoreCharge 门店运费充值
|
||||||
|
func (express *Express) IntracityStoreCharge(ctx context.Context, req *StoreChargeRequest) (res StoreChargeResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityStoreChargeURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityStoreCharge")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreRefundRequest 门店运费退款请求参数
|
||||||
|
type StoreRefundRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
|
||||||
|
PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
}
|
||||||
|
|
||||||
|
// StoreRefundResponse 门店运费退款返回参数
|
||||||
|
type StoreRefundResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
RefundAmount uint32 `json:"refund_amount"` // 退款金额,单位:分
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityStoreRefund 门店运费退款
|
||||||
|
func (express *Express) IntracityStoreRefund(ctx context.Context, req *StoreRefundRequest) (res StoreRefundResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityStoreRefundURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityStoreRefund")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryFlowRequest 门店运费流水查询请求参数
|
||||||
|
type QueryFlowRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
FlowType FlowType `json:"flow_type"` // 流水类型:1-充值,2-消费,3-退款
|
||||||
|
ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID
|
||||||
|
BeginTime uint32 `json:"begin_time,omitempty"` // 开始时间戳
|
||||||
|
EndTime uint32 `json:"end_time,omitempty"` // 结束时间戳
|
||||||
|
PayMode PayMode `json:"pay_mode"` // 扣费主体
|
||||||
|
}
|
||||||
|
|
||||||
|
// FlowRecordInfo 流水记录信息
|
||||||
|
type FlowRecordInfo struct {
|
||||||
|
FlowType FlowType `json:"flow_type"` // 流水类型
|
||||||
|
AppID string `json:"appid"` // appid
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店ID
|
||||||
|
PayOrderID uint64 `json:"pay_order_id,omitempty"` // 充值订单号
|
||||||
|
WxOrderID string `json:"wx_order_id,omitempty"` // 订单ID(消费流水)
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
OpenID string `json:"openid,omitempty"` // 用户openid(消费流水)
|
||||||
|
DeliveryStatus int32 `json:"delivery_status,omitempty"` // 运单状态(消费流水)
|
||||||
|
PayAmount int32 `json:"pay_amount"` // 支付金额,单位:分
|
||||||
|
PayTime uint32 `json:"pay_time,omitempty"` // 支付时间
|
||||||
|
PayStatus string `json:"pay_status,omitempty"` // 支付状态
|
||||||
|
RefundStatus string `json:"refund_status,omitempty"` // 退款状态
|
||||||
|
RefundAmount int32 `json:"refund_amount,omitempty"` // 退款金额
|
||||||
|
RefundTime uint32 `json:"refund_time,omitempty"` // 退款时间
|
||||||
|
DeductAmount int32 `json:"deduct_amount,omitempty"` // 扣除违约金
|
||||||
|
CreateTime uint32 `json:"create_time"` // 创建时间
|
||||||
|
ConsumeDeadline uint32 `json:"consume_deadline,omitempty"` // 有效截止日期
|
||||||
|
BillID string `json:"bill_id,omitempty"` // 运单ID
|
||||||
|
DeliveryFinishedTime uint32 `json:"delivery_finished_time,omitempty"` // 运单完成配送的时间
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryFlowResponse 门店运费流水查询返回参数
|
||||||
|
type QueryFlowResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
Total uint32 `json:"total"` // 总数
|
||||||
|
FlowList []FlowRecordInfo `json:"flow_list"` // 流水数组
|
||||||
|
TotalPayAmt int `json:"total_pay_amt"` // 总支付金额
|
||||||
|
TotalRefundAmt int `json:"total_refund_amt"` // 总退款金额
|
||||||
|
TotalDeductAmt int `json:"total_deduct_amt"` // 总违约金(消费流水返回)
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityQueryFlow 门店运费流水查询
|
||||||
|
func (express *Express) IntracityQueryFlow(ctx context.Context, req *QueryFlowRequest) (res QueryFlowResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityQueryFlowURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityQueryFlow")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// BalanceQueryRequest 门店余额查询请求参数
|
||||||
|
type BalanceQueryRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
|
||||||
|
ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID
|
||||||
|
PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
|
||||||
|
}
|
||||||
|
|
||||||
|
// BalanceInfo 余额信息
|
||||||
|
type BalanceInfo struct {
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
Balance int32 `json:"balance"` // 余额,单位:分
|
||||||
|
}
|
||||||
|
|
||||||
|
// BalanceQueryResponse 门店余额查询返回参数
|
||||||
|
type BalanceQueryResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
BalanceList []BalanceInfo `json:"balance_list"` // 余额列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityBalanceQuery 门店余额查询
|
||||||
|
func (express *Express) IntracityBalanceQuery(ctx context.Context, req *BalanceQueryRequest) (res BalanceQueryResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityBalanceQueryURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityBalanceQuery")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// ============ 配送订单接口 ============
|
||||||
|
|
||||||
|
// CargoInfo 货物信息
|
||||||
|
type CargoInfo struct {
|
||||||
|
Name string `json:"name"` // 货物名称
|
||||||
|
Num uint32 `json:"num,omitempty"` // 货物数量
|
||||||
|
Price uint32 `json:"price,omitempty"` // 货物价格,单位:分
|
||||||
|
Weight uint32 `json:"weight,omitempty"` // 货物重量,单位:克
|
||||||
|
}
|
||||||
|
|
||||||
|
// PreAddOrderRequest 预下配送单请求参数
|
||||||
|
type PreAddOrderRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号,二选一
|
||||||
|
OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号,二选一
|
||||||
|
UserOpenID string `json:"user_openid"` // 用户openid
|
||||||
|
UserPhone string `json:"user_phone,omitempty"` // 用户联系电话
|
||||||
|
UserName string `json:"user_name,omitempty"` // 用户姓名
|
||||||
|
UserLat float64 `json:"user_lat"` // 用户地址纬度
|
||||||
|
UserLng float64 `json:"user_lng"` // 用户地址经度
|
||||||
|
UserAddress string `json:"user_address"` // 用户详细地址
|
||||||
|
ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID,不传则查询所有运力
|
||||||
|
PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
|
||||||
|
CargoInfo *CargoInfo `json:"cargo_info,omitempty"` // 货物信息
|
||||||
|
}
|
||||||
|
|
||||||
|
// TransInfo 运力信息
|
||||||
|
type TransInfo struct {
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
ServiceName string `json:"service_name"` // 运力名称
|
||||||
|
Price uint32 `json:"price"` // 配送费用,单位:分
|
||||||
|
Distance uint32 `json:"distance"` // 配送距离,单位:米
|
||||||
|
Errcode int `json:"errcode"` // 错误码,0表示成功
|
||||||
|
Errmsg string `json:"errmsg"` // 错误信息
|
||||||
|
}
|
||||||
|
|
||||||
|
// PreAddOrderResponse 预下配送单返回参数
|
||||||
|
type PreAddOrderResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
TransList []TransInfo `json:"trans_list"` // 运力列表
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityPreAddOrder 预下配送单(查询运费)
|
||||||
|
func (express *Express) IntracityPreAddOrder(ctx context.Context, req *PreAddOrderRequest) (res PreAddOrderResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityPreAddOrderURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityPreAddOrder")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOrderRequest 创建配送单请求参数
|
||||||
|
type AddOrderRequest struct {
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号,二选一
|
||||||
|
OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号,二选一
|
||||||
|
OutOrderID string `json:"out_order_id"` // 自定义订单号,需唯一
|
||||||
|
ServiceTransID string `json:"service_trans_id,omitempty"` // 运力ID
|
||||||
|
UserOpenID string `json:"user_openid"` // 用户openid
|
||||||
|
UserPhone string `json:"user_phone"` // 用户联系电话
|
||||||
|
UserName string `json:"user_name"` // 用户姓名
|
||||||
|
UserLat float64 `json:"user_lat"` // 用户地址纬度
|
||||||
|
UserLng float64 `json:"user_lng"` // 用户地址经度
|
||||||
|
UserAddress string `json:"user_address"` // 用户详细地址
|
||||||
|
PayMode PayMode `json:"pay_mode,omitempty"` // 充值/扣费主体
|
||||||
|
CargoInfo *CargoInfo `json:"cargo_info,omitempty"` // 货物信息
|
||||||
|
OrderDetailPath string `json:"order_detail_path,omitempty"` // 订单详情页路径
|
||||||
|
CallbackURL string `json:"callback_url,omitempty"` // 配送状态回调URL
|
||||||
|
UseInsurance uint32 `json:"use_insurance,omitempty"` // 是否使用保价:0-不使用,1-使用
|
||||||
|
InsuranceValue uint32 `json:"insurance_value,omitempty"` // 保价金额,单位:分
|
||||||
|
ExpectTime uint32 `json:"expect_time,omitempty"` // 期望送达时间戳
|
||||||
|
Remark string `json:"remark,omitempty"` // 备注
|
||||||
|
}
|
||||||
|
|
||||||
|
// AddOrderResponse 创建配送单返回参数
|
||||||
|
type AddOrderResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
WxOrderID string `json:"wx_order_id"` // 微信订单号
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
OutOrderID string `json:"out_order_id"` // 自定义订单号
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
BillID string `json:"bill_id"` // 运力订单号
|
||||||
|
Price uint32 `json:"price"` // 配送费用,单位:分
|
||||||
|
Distance uint32 `json:"distance"` // 配送距离,单位:米
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityAddOrder 创建配送单
|
||||||
|
func (express *Express) IntracityAddOrder(ctx context.Context, req *AddOrderRequest) (res AddOrderResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityAddOrderURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityAddOrder")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryOrderRequest 查询配送单请求参数
|
||||||
|
type QueryOrderRequest struct {
|
||||||
|
WxOrderID string `json:"wx_order_id,omitempty"` // 微信订单号,二选一
|
||||||
|
OutOrderID string `json:"out_order_id,omitempty"` // 自定义订单号,二选一
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
|
||||||
|
OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号
|
||||||
|
}
|
||||||
|
|
||||||
|
// RiderInfo 骑手信息
|
||||||
|
type RiderInfo struct {
|
||||||
|
Name string `json:"name"` // 骑手姓名
|
||||||
|
Phone string `json:"phone"` // 骑手电话
|
||||||
|
RiderCode string `json:"rider_code"` // 骑手编号
|
||||||
|
RiderImgURL string `json:"rider_img_url"` // 骑手头像URL
|
||||||
|
}
|
||||||
|
|
||||||
|
// QueryOrderResponse 查询配送单返回参数
|
||||||
|
type QueryOrderResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
WxOrderID string `json:"wx_order_id"` // 微信订单号
|
||||||
|
AppID string `json:"appid"` // 小程序appid
|
||||||
|
WxStoreID string `json:"wx_store_id"` // 微信门店编号
|
||||||
|
OutOrderID string `json:"out_order_id"` // 自定义订单号
|
||||||
|
ServiceTransID string `json:"service_trans_id"` // 运力ID
|
||||||
|
BillID string `json:"bill_id"` // 运力订单号
|
||||||
|
DeliveryStatus IntracityDeliveryStatus `json:"delivery_status"` // 配送状态
|
||||||
|
Price uint32 `json:"price"` // 配送费用,单位:分
|
||||||
|
Distance uint32 `json:"distance"` // 配送距离,单位:米
|
||||||
|
CreateTime uint32 `json:"create_time"` // 订单创建时间
|
||||||
|
RiderInfo *RiderInfo `json:"rider_info"` // 骑手信息
|
||||||
|
FinishTime uint32 `json:"finish_time"` // 订单完成时间
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityQueryOrder 查询配送单
|
||||||
|
func (express *Express) IntracityQueryOrder(ctx context.Context, req *QueryOrderRequest) (res QueryOrderResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityQueryOrderURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityQueryOrder")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// CancelOrderRequest 取消配送单请求参数
|
||||||
|
type CancelOrderRequest struct {
|
||||||
|
WxOrderID string `json:"wx_order_id,omitempty"` // 微信订单号,二选一
|
||||||
|
OutOrderID string `json:"out_order_id,omitempty"` // 自定义订单号,二选一
|
||||||
|
WxStoreID string `json:"wx_store_id,omitempty"` // 微信门店编号
|
||||||
|
OutStoreID string `json:"out_store_id,omitempty"` // 自定义门店编号
|
||||||
|
CancelReason string `json:"cancel_reason,omitempty"` // 取消原因
|
||||||
|
}
|
||||||
|
|
||||||
|
// CancelOrderResponse 取消配送单返回参数
|
||||||
|
type CancelOrderResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
WxOrderID string `json:"wx_order_id"` // 微信订单号
|
||||||
|
RefundAmount int32 `json:"refund_amount"` // 退款金额,单位:分
|
||||||
|
DeductAmount int32 `json:"deduct_amount"` // 扣除违约金,单位:分
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityCancelOrder 取消配送单
|
||||||
|
func (express *Express) IntracityCancelOrder(ctx context.Context, req *CancelOrderRequest) (res CancelOrderResponse, err error) {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityCancelOrderURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
err = util.DecodeWithError(response, &res, "IntracityCancelOrder")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// MockNotifyRequest 模拟配送回调请求参数(仅用于测试)
|
||||||
|
type MockNotifyRequest struct {
|
||||||
|
WxOrderID string `json:"wx_order_id"` // 微信订单号
|
||||||
|
DeliveryStatus IntracityDeliveryStatus `json:"delivery_status"` // 配送状态
|
||||||
|
}
|
||||||
|
|
||||||
|
// IntracityMockNotify 模拟配送回调(仅用于测试)
|
||||||
|
func (express *Express) IntracityMockNotify(ctx context.Context, req *MockNotifyRequest) error {
|
||||||
|
accessToken, err := express.GetAccessToken()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
uri := fmt.Sprintf(intracityMockNotifyURL, accessToken)
|
||||||
|
response, err := util.PostJSONContext(ctx, uri, req)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
return util.DecodeWithCommonError(response, "IntracityMockNotify")
|
||||||
|
}
|
||||||
@@ -197,3 +197,8 @@ func (miniProgram *MiniProgram) GetExpress() *express.Express {
|
|||||||
func (miniProgram *MiniProgram) GetOCR() *ocr.OCR {
|
func (miniProgram *MiniProgram) GetOCR() *ocr.OCR {
|
||||||
return ocr.NewOCR(miniProgram.ctx)
|
return ocr.NewOCR(miniProgram.ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetIntracity 同城配送接口
|
||||||
|
func (miniProgram *MiniProgram) GetIntracity() *express.Express {
|
||||||
|
return express.NewExpress(miniProgram.ctx)
|
||||||
|
}
|
||||||
|
|||||||
@@ -32,6 +32,10 @@ const (
|
|||||||
batchInviteURL = "https://qyapi.weixin.qq.com/cgi-bin/batch/invite?access_token=%s"
|
batchInviteURL = "https://qyapi.weixin.qq.com/cgi-bin/batch/invite?access_token=%s"
|
||||||
// getJoinQrcodeURL 获取加入企业二维码
|
// getJoinQrcodeURL 获取加入企业二维码
|
||||||
getJoinQrcodeURL = "https://qyapi.weixin.qq.com/cgi-bin/corp/get_join_qrcode"
|
getJoinQrcodeURL = "https://qyapi.weixin.qq.com/cgi-bin/corp/get_join_qrcode"
|
||||||
|
// getUseridURL 手机号获取userid
|
||||||
|
getUseridURL = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserid?access_token=%s"
|
||||||
|
// getUseridByEmailURL 邮箱获取userid
|
||||||
|
getUseridByEmailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get_userid_by_email?access_token=%s"
|
||||||
)
|
)
|
||||||
|
|
||||||
type (
|
type (
|
||||||
@@ -564,3 +568,58 @@ func (r *Client) GetJoinQrcode(req *GetJoinQrcodeRequest) (*GetJoinQrcodeRespons
|
|||||||
err = util.DecodeWithError(response, result, "GetJoinQrcode")
|
err = util.DecodeWithError(response, result, "GetJoinQrcode")
|
||||||
return result, err
|
return result, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetUseridRequest 手机号获取userid请求
|
||||||
|
type GetUseridRequest struct {
|
||||||
|
Mobile string `json:"mobile"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUseridResponse 获取userid响应
|
||||||
|
type GetUseridResponse struct {
|
||||||
|
util.CommonError
|
||||||
|
Userid string `json:"userid"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUserid 手机号获取userid
|
||||||
|
// see https://developer.work.weixin.qq.com/document/path/95402
|
||||||
|
func (r *Client) GetUserid(req *GetUseridRequest) (*GetUseridResponse, error) {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = r.GetAccessToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.PostJSON(fmt.Sprintf(getUseridURL, accessToken), req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result := &GetUseridResponse{}
|
||||||
|
err = util.DecodeWithError(response, result, "GetUserid")
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUseridByEmailRequest 邮箱获取userid请求
|
||||||
|
type GetUseridByEmailRequest struct {
|
||||||
|
Email string `json:"email"`
|
||||||
|
EmailType int `json:"email_type,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUseridByEmail 邮箱获取userid
|
||||||
|
// see https://developer.work.weixin.qq.com/document/path/95895
|
||||||
|
func (r *Client) GetUseridByEmail(req *GetUseridByEmailRequest) (*GetUseridResponse, error) {
|
||||||
|
var (
|
||||||
|
accessToken string
|
||||||
|
err error
|
||||||
|
)
|
||||||
|
if accessToken, err = r.GetAccessToken(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
var response []byte
|
||||||
|
if response, err = util.PostJSON(fmt.Sprintf(getUseridByEmailURL, accessToken), req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
result := &GetUseridResponse{}
|
||||||
|
err = util.DecodeWithError(response, result, "GetUseridByEmail")
|
||||||
|
return result, err
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user