diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaExpressService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaExpressService.java new file mode 100644 index 000000000..b6f5e2d68 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaExpressService.java @@ -0,0 +1,203 @@ +package cn.binarywang.wx.miniapp.api; + +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressAccount; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressDelivery; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressPath; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressPrinter; +import cn.binarywang.wx.miniapp.bean.express.request.*; +import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult; +import me.chanjar.weixin.common.error.WxErrorException; + +import java.util.List; + +/** + * 小程序物流助手 + * @author xiaoyu + * @since 2019-11-26 + */ +public interface WxMaExpressService { + /** + * 获取支持的快递公司列表 + */ + String ALL_DELIVERY_URL = "https://api.weixin.qq.com/cgi-bin/express/business/delivery/getall"; + + /** + * 获取所有绑定的物流账号 + */ + String ALL_ACCOUNT_URL = "https://api.weixin.qq.com/cgi-bin/express/business/account/getall"; + + /** + * 绑定、解绑物流账号 + */ + String BIND_ACCOUNT_URL = "https://api.weixin.qq.com/cgi-bin/express/business/account/bind"; + + /** + * 获取电子面单余额 + */ + String GET_QUOTA_URL = "https://api.weixin.qq.com/cgi-bin/express/business/quota/get"; + + /** + * 配置面单打印员 + */ + String UPDATE_PRINTER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/printer/update"; + + /** + * 获取打印员 + */ + String GET_PRINTER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/printer/getall"; + + /** + * 生成运单 + */ + String ADD_ORDER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/order/add"; + + /** + * 批量获取运单数据 + */ + String BATCH_GET_ORDER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/order/batchget"; + + /** + * 取消运单 + */ + String CANCEL_ORDER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/order/cancel"; + + /** + * 获取运单数据 + */ + String GET_ORDER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/order/get"; + + /** + * 查询运单轨迹 + */ + String GET_PATH_URL = "https://api.weixin.qq.com/cgi-bin/express/business/path/get"; + + /** + * 模拟快递公司更新订单状态 + */ + String TEST_UPDATE_ORDER_URL = "https://api.weixin.qq.com/cgi-bin/express/business/test_update_order"; + + /** + * 获取支持的快递公司列表 + * @return 快递公司列表 + * @throws WxErrorException 获取失败时返回 + *
+   *   查看文档
+   * 
+ */ + List getAllDelivery() throws WxErrorException; + + /** + * 获取所有绑定的物流账号 + * @return 物流账号list + * @throws WxErrorException 获取失败时返回 + *
+   *   查看文档
+   * 
+ */ + List getAllAccount() throws WxErrorException; + + /** + * 绑定、解绑物流账号 + * @param wxMaExpressBindAccountRequest 物流账号对象 + * @throws WxErrorException 请求失败时返回 + *
+   *   查看文档
+   * 
+ */ + void bindAccount(WxMaExpressBindAccountRequest wxMaExpressBindAccountRequest) throws WxErrorException; + + /** + * 获取电子面单余额。仅在使用加盟类快递公司时,才可以调用。 + * @param wxMaExpressBindAccountRequest 物流账号对象 + * @return 电子面单余额 + * @throws WxErrorException 获取失败时返回 + *
+   *   查看文档
+   * 
+ */ + Integer getQuota(WxMaExpressBindAccountRequest wxMaExpressBindAccountRequest) throws WxErrorException; + + /** + * 配置面单打印员,可以设置多个,若需要使用微信打单 PC 软件,才需要调用。 + * @param wxMaExpressPrinterUpdateRequest 面单打印员对象 + * @throws WxErrorException 请求失败时返回 + *
+   *   查看文档
+   * 
+ */ + void updatePrinter(WxMaExpressPrinterUpdateRequest wxMaExpressPrinterUpdateRequest) throws WxErrorException; + + /** + * 获取打印员。若需要使用微信打单 PC 软件,才需要调用 + * @return 打印员 + * @throws WxErrorException 获取失败时返回 + *
+   *   查看文档
+   * 
+ */ + WxMaExpressPrinter getPrinter() throws WxErrorException; + + /** + * 生成运单 + * @param wxMaExpressAddOrderRequest 生成运单请求对象 + * @return 生成运单结果 + * @throws WxErrorException 请求失败时返回 + *
+   *   查看文档
+   * 
+ */ + WxMaExpressOrderInfoResult addOrder(WxMaExpressAddOrderRequest wxMaExpressAddOrderRequest) throws WxErrorException; + + /** + * 批量获取运单数据 + * @param requests 获取运单请求对象集合,最多不能超过1000个 + * @return 运单信息集合 + * @throws WxErrorException 获取失败时返回 + *
+   *   查看文档
+   * 
+ */ + List batchGetOrder(List requests) throws WxErrorException; + + /** + * 取消运单 + * @param wxMaExpressGetOrderRequest 运单信息请求对象 + * @throws WxErrorException 取消失败时返回 + *
+   *   查看文档
+   * 
+ */ + void cancelOrder(WxMaExpressGetOrderRequest wxMaExpressGetOrderRequest) throws WxErrorException; + + /** + * 获取运单数据 + * @param wxMaExpressGetOrderRequest 运单信息请求对象 + * @return 运单信息 + * @throws WxErrorException 获取失败时返回 + *
+   *   查看文档
+   * 
+ */ + WxMaExpressOrderInfoResult getOrder(WxMaExpressGetOrderRequest wxMaExpressGetOrderRequest) throws WxErrorException; + + /** + * 查询运单轨迹 + * @param wxMaExpressGetOrderRequest 运单信息请求对象 + * @return 运单轨迹对象 + * @throws WxErrorException 查询失败时返回 + *
+   *   查看文档
+   * 
+ */ + WxMaExpressPath getPath(WxMaExpressGetOrderRequest wxMaExpressGetOrderRequest) throws WxErrorException; + + /** + * 模拟快递公司更新订单状态, 该接口只能用户测试 + * @param wxMaExpressTestUpdateOrderRequest 模拟快递公司更新订单状态请求对象 + * @throws WxErrorException 模拟更新订单状态失败时返回 + *
+   *   查看文档
+   * 
+ */ + void testUpdateOrder(WxMaExpressTestUpdateOrderRequest wxMaExpressTestUpdateOrderRequest) throws WxErrorException; +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java index 52988f36e..695590a6b 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java @@ -224,5 +224,9 @@ public interface WxMaService { */ RequestHttp getRequestHttp(); - + /** + * 获取物流助手接口服务对象 + * @return + */ + WxMaExpressService getExpressService(); } diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java new file mode 100644 index 000000000..21d0bfe0b --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImpl.java @@ -0,0 +1,98 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaExpressService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressAccount; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressDelivery; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressPath; +import cn.binarywang.wx.miniapp.bean.express.WxMaExpressPrinter; +import cn.binarywang.wx.miniapp.bean.express.request.*; +import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult; +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import lombok.AllArgsConstructor; +import me.chanjar.weixin.common.error.WxErrorException; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author xiaoyu + * @since 2019-11-26 + */ +@AllArgsConstructor +public class WxMaExpressServiceImpl implements WxMaExpressService { + + private WxMaService wxMaService; + + @Override + public List getAllDelivery() throws WxErrorException { + String responseContent = this.wxMaService.get(ALL_DELIVERY_URL, null); + return WxMaExpressDelivery.fromJson(responseContent); + } + + @Override + public List getAllAccount() throws WxErrorException { + String responseContent = this.wxMaService.get(ALL_ACCOUNT_URL, null); + return WxMaExpressAccount.fromJsonList(responseContent); + } + + @Override + public void bindAccount(WxMaExpressBindAccountRequest wxMaExpressBindAccountRequest) throws WxErrorException { + this.wxMaService.post(BIND_ACCOUNT_URL,wxMaExpressBindAccountRequest.toJson()); + } + + @Override + public Integer getQuota(WxMaExpressBindAccountRequest wxMaExpressBindAccountRequest) throws WxErrorException { + String responseContent = this.wxMaService.post(GET_QUOTA_URL,wxMaExpressBindAccountRequest.toJson()); + WxMaExpressAccount account = WxMaExpressAccount.fromJson(responseContent); + return account.getQuotaNum(); + } + + @Override + public void updatePrinter(WxMaExpressPrinterUpdateRequest wxMaExpressPrinterUpdateRequest) throws WxErrorException { + this.wxMaService.post(UPDATE_PRINTER_URL,wxMaExpressPrinterUpdateRequest.toJson()); + } + + @Override + public WxMaExpressPrinter getPrinter() throws WxErrorException { + String responseContent = this.wxMaService.get(GET_PRINTER_URL, null); + return WxMaExpressPrinter.fromJson(responseContent); + } + + @Override + public WxMaExpressOrderInfoResult addOrder(WxMaExpressAddOrderRequest wxMaExpressAddOrderRequest) throws WxErrorException { + String responseContent = this.wxMaService.post(ADD_ORDER_URL,wxMaExpressAddOrderRequest.toJson()); + return WxMaExpressOrderInfoResult.fromJson(responseContent); + } + + @Override + public List batchGetOrder(List requests) throws WxErrorException { + Map param = new HashMap<>(1); + param.put("order_list", requests); + String responseContent = this.wxMaService.post(BATCH_GET_ORDER_URL, WxMaGsonBuilder.create().toJson(param)); + return WxMaExpressOrderInfoResult.toList(responseContent); + } + + @Override + public void cancelOrder(WxMaExpressGetOrderRequest wxMaExpressGetOrderRequest) throws WxErrorException { + this.wxMaService.post(CANCEL_ORDER_URL,wxMaExpressGetOrderRequest.toJson()); + } + + @Override + public WxMaExpressOrderInfoResult getOrder(WxMaExpressGetOrderRequest wxMaExpressGetOrderRequest) throws WxErrorException { + String responseContent = this.wxMaService.post(GET_ORDER_URL,wxMaExpressGetOrderRequest.toJson()); + return WxMaExpressOrderInfoResult.fromJson(responseContent); + } + + @Override + public WxMaExpressPath getPath(WxMaExpressGetOrderRequest wxMaExpressGetOrderRequest) throws WxErrorException { + String responseContent = this.wxMaService.post(GET_PATH_URL,wxMaExpressGetOrderRequest.toJson()); + return WxMaExpressPath.fromJson(responseContent); + } + + @Override + public void testUpdateOrder(WxMaExpressTestUpdateOrderRequest wxMaExpressTestUpdateOrderRequest) throws WxErrorException { + this.wxMaService.post(TEST_UPDATE_ORDER_URL,wxMaExpressTestUpdateOrderRequest.toJson()); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java index 44ba6258d..0a6da8614 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java @@ -54,6 +54,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp + * 物流账号对象 + * + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressAccount implements Serializable { + + private static final JsonParser JSON_PARSER = new JsonParser(); + private static final long serialVersionUID = -4991983596742569736L; + + /** + * 快递公司客户编码 + */ + @SerializedName("biz_id") + private String bizId; + + /** + * 快递公司ID + */ + @SerializedName("delivery_id") + private String deliveryId; + + /** + * 账号绑定时间 + */ + @SerializedName("create_time") + private Long createTime; + + /** + * 账号更新时间 + */ + @SerializedName("update_time") + private Long updateTime; + + /** + * 绑定状态 + * status_code 的合法值 : 0-绑定成功;1-审核中;2-绑定失败 + */ + @SerializedName("status_code") + private Integer statusCode; + + /** + * 账号别名 + */ + @SerializedName("alias") + private String alias; + + /** + * 账号绑定失败的错误信息(EMS审核结果) + */ + @SerializedName("remark_wrong_msg") + private String remarkWrongMsg; + + /** + * 账号绑定时的备注内容(提交EMS审核需要) + */ + @SerializedName("remark_content") + private String remarkContent; + + /** + * 电子面单余额 + */ + @SerializedName("quota_num") + private Integer quotaNum; + + /** + * 电子面单余额更新时间 + */ + @SerializedName("quota_update_time") + private Integer quotaUpdateTime; + + /** + * 支持的服务类型 + */ + @SerializedName("service_type") + private List serviceType; + + public static List fromJsonList(String json) { + JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject(); + return WxMaGsonBuilder.create().fromJson(jsonObject.get("list").toString(), + new TypeToken>() { + }.getType()); + } + + public static WxMaExpressAccount fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaExpressAccount.class); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java new file mode 100644 index 000000000..1127479b4 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressDelivery.java @@ -0,0 +1,83 @@ +package cn.binarywang.wx.miniapp.bean.express; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *
+ * 快递公司对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressDelivery implements Serializable { + private static final JsonParser JSON_PARSER = new JsonParser(); + private static final long serialVersionUID = -8394544895730223810L; + + /** + * 快递公司 ID + */ + @SerializedName("delivery_id") + private String deliveryId; + + /** + * 快递公司名称 + */ + @SerializedName("delivery_name") + private String deliveryName; + + /** + * 是否支持散单, 1表示支持 + */ + @SerializedName("can_use_cash") + private Integer canUseCash; + + /** + * 是否支持查询面单余额, 1表示支持 + */ + @SerializedName("can_get_quota") + private Integer canGetQuota; + + /** + * 散单对应的bizid,当can_use_cash=1时有效 + */ + @SerializedName("cash_biz_id") + private String cashBizId; + + /** + * 支持的服务类型 + */ + @SerializedName("service_type") + private List serviceType; + + public static List fromJson(String json) { + JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject(); + return WxMaGsonBuilder.create().fromJson(jsonObject.get("data").toString(), + new TypeToken>() { + }.getType()); + } + + @Data + public static class ServiceType{ + + /** + * 服务类型ID + */ + @SerializedName("service_type") + private Integer serviceType; + + /** + * 服务类型名称 + */ + @SerializedName("service_name") + private String serviceName; + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java new file mode 100644 index 000000000..ba5a903f4 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPath.java @@ -0,0 +1,75 @@ +package cn.binarywang.wx.miniapp.bean.express; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 运单轨迹对象 + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressPath implements Serializable { + + private static final long serialVersionUID = 5643624677715536605L; + + /** + * 用户openid + */ + private String openid; + + /** + * 快递公司 ID + */ + @SerializedName("delivery_id") + private String deliveryId; + + /** + * 运单 ID + */ + @SerializedName("waybill_id") + private String waybillId; + + /** + * 轨迹节点数量 + */ + @SerializedName("path_item_num") + private Integer pathItemNum; + + /** + * 轨迹节点列表 + */ + @SerializedName("path_item_list") + private List pathItemList; + + public static WxMaExpressPath fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaExpressPath.class); + } + + @Data + private static class PathItem{ + + /** + * 轨迹节点 Unix 时间戳 + */ + @SerializedName("action_time") + private Long actionTime; + + /** + * 轨迹节点类型 + */ + @SerializedName("action_type") + private Integer actionType; + + /** + * 轨迹节点详情 + */ + @SerializedName("action_msg") + private String actionMsg; + + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java new file mode 100644 index 000000000..832fa2e37 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/WxMaExpressPrinter.java @@ -0,0 +1,44 @@ +package cn.binarywang.wx.miniapp.bean.express; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.JsonParser; +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + *
+ * 面单打印员对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressPrinter implements Serializable { + + private static final JsonParser JSON_PARSER = new JsonParser(); + private static final long serialVersionUID = 7164449984700322531L; + + /** + * 数量 + */ + private Integer count; + + /** + * 打印员openid + */ + private List openid; + + /** + * 打印员面单打印权限 + */ + @SerializedName("tagid_list") + private List tagidList; + + + public static WxMaExpressPrinter fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaExpressPrinter.class); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java new file mode 100644 index 000000000..4b404e332 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressAddOrderRequest.java @@ -0,0 +1,169 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + + +import cn.binarywang.wx.miniapp.bean.express.*; +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * 生成运单请求对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +@Builder +public class WxMaExpressAddOrderRequest implements Serializable { + + private static final long serialVersionUID = -7538739003766268386L; + + + /** + * 订单来源 + *
+   * 是否必填: 是
+   * 描述: 0为小程序订单,2为App或H5订单,填2则不发送物流服务通知
+   * 
+ */ + @SerializedName("add_source") + private Integer addSource; + + /** + * App或H5的appid + *
+   * 是否必填: 否
+   * 描述: add_source=2时必填,需和开通了物流助手的小程序绑定同一open帐号
+   * 
+ */ + @SerializedName("wx_appid") + private String wxAppid; + + /** + * 订单ID + *
+   * 是否必填: 是
+   * 描述: 须保证全局唯一,不超过512字节
+   * 
+ */ + @SerializedName("order_id") + private String orderId; + + /** + * 用户openid + *
+   * 是否必填: 否
+   * 描述: 当add_source=2时无需填写(不发送物流服务通知)
+   * 
+ */ + @SerializedName("openid") + private String openid; + + /** + * 快递公司ID + *
+   * 是否必填: 是
+   * 描述: 可通过getAllDelivery查询
+   * 
+ */ + @SerializedName("delivery_id") + private String deliveryId; + + /** + * 快递客户编码或者现付编码 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("biz_id") + private String bizId; + + /** + * 快递备注信息 + *
+   * 是否必填: 否
+   * 描述: 比如"易碎物品",不超过1024字节
+   * 
+ */ + @SerializedName("custom_remark") + private String customRemark; + + /** + * 订单标签id + *
+   * 是否必填: 否
+   * 描述: 用于平台型小程序区分平台上的入驻方,tagid须与入驻方账号一一对应,非平台型小程序无需填写该字段
+   * 
+ */ + @SerializedName("tagid") + private Integer tagid; + + /** + * 预期的上门揽件时间 + *
+   * 是否必填: 否
+   * 描述: 顺丰必须传,0表示已事先约定取件时间;否则请传预期揽件时间戳,需大于当前时间,收件员会在预期时间附近上门。例如expect_time为“1557989929”,表示希望收件员将在2019年05月16日14:58:49-15:58:49内上门取货。说明:若选择 了预期揽件时间,请不要自己打单,由上门揽件的时候打印。
+   * 
+ */ + @SerializedName("expect_time") + private Long expectTime; + + /** + * 发件人信息 + *
+   * 是否必填: 是
+   * 
+ */ + private WxMaExpressOrderPerson sender; + + /** + * 收件人信息 + *
+   * 是否必填: 是
+   * 
+ */ + private WxMaExpressOrderPerson receiver; + + /** + * 包裹信息 + *
+   * 是否必填: 是
+   * 描述: 将传递给快递公司
+   * 
+ */ + private WxMaExpressOrderCargo cargo; + + /** + * 商品信息 + *
+   * 是否必填: 否
+   * 描述: 会展示到物流服务通知和电子面单中
+   * 
+ */ + private WxMaExpressOrderShop shop; + + /** + * 保价信息 + *
+   * 是否必填: 是
+   * 
+ */ + private WxMaExpressOrderInsured insured; + + /** + * 服务类型 + *
+   * 是否必填: 是
+   * 
+ */ + private WxMaExpressDelivery.ServiceType service; + + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java new file mode 100644 index 000000000..fe6877fa9 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressBindAccountRequest.java @@ -0,0 +1,73 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * 绑定、解绑物流账号请求对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +@Builder +public class WxMaExpressBindAccountRequest implements Serializable { + + private static final long serialVersionUID = 3868003945297939946L; + + /** + * 类型 + *
+   * 是否必填: 是
+   * 描述: bind表示绑定,unbind表示解除绑定
+   * 
+ */ + @SerializedName("type") + private String type; + + /** + * 快递公司客户编码 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("biz_id") + private String bizId; + + /** + * 快递公司ID + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("delivery_id") + private String deliveryId; + + /** + * 快递公司客户密码 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("password") + private String password; + + /** + * 备注内容(提交EMS审核需要) + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("remark_content") + private String remarkContent; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java new file mode 100644 index 000000000..b21de172e --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressGetOrderRequest.java @@ -0,0 +1,63 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * 获取运单请求对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +@Builder +public class WxMaExpressGetOrderRequest implements Serializable { + + private static final long serialVersionUID = 8239315305577639778L; + + /** + * 订单ID + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("order_id") + private String orderId; + + /** + * 用户openid + *
+   * 是否必填: 否
+   * 描述: 当add_source=2时无需填写(不发送物流服务通知)
+   * 
+ */ + private String openid; + + /** + * 快递公司ID + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("delivery_id") + private String deliveryId; + + /** + * 运单ID + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("waybill_id") + private String waybillId; + + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderCargo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderCargo.java new file mode 100644 index 000000000..ec2c39709 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderCargo.java @@ -0,0 +1,74 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; + +/** + * 包裹信息对象 + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressOrderCargo implements Serializable { + + private static final long serialVersionUID = 6642536671375396150L; + + /** + * 包裹数量 + *
+   * 是否必填: 是
+   * 描述: 需要和detail_list size保持一致
+   * 
+ */ + private Integer count; + /** + * 包裹总重量 + *
+   * 是否必填: 是
+   * 描述: 单位是千克(kg)
+   * 
+ */ + private Integer weight; + + /** + * 包裹长度 + *
+   * 是否必填: 是
+   * 描述: 单位是厘米(cm)
+   * 
+ */ + @SerializedName("space_x") + private Integer spaceLength; + + /** + * 包裹宽度 + *
+   * 是否必填: 是
+   * 描述: 单位是厘米(cm)
+   * 
+ */ + @SerializedName("space_y") + private Integer spaceWidth; + + /** + * 包裹高度 + *
+   * 是否必填: 是
+   * 描述: 单位是厘米(cm)
+   * 
+ */ + @SerializedName("space_z") + private Integer spaceHeight; + + /** + * 包裹中商品详情列表 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("detail_list") + private List detailList; +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderCargoDetail.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderCargoDetail.java new file mode 100644 index 000000000..1e61bba89 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderCargoDetail.java @@ -0,0 +1,33 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import lombok.Data; + +import java.io.Serializable; + +/** + * 包裹商品详情对象 + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressOrderCargoDetail implements Serializable { + + private static final long serialVersionUID = 5988620921216969796L; + + /** + * 商品名 + *
+   * 是否必填: 是
+   * 描述: 不超过128字节
+   * 
+ */ + private String name; + + /** + * 商品数量 + *
+   * 是否必填: 是
+   * 
+ */ + private Integer count; +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderInsured.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderInsured.java new file mode 100644 index 000000000..7a30dacad --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderInsured.java @@ -0,0 +1,43 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + + +import cn.binarywang.wx.miniapp.constant.WxMaConstants; +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + * 保价信息对象 + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +@Builder +public class WxMaExpressOrderInsured implements Serializable { + + private static final long serialVersionUID = -8636857630937445422L; + + /** + * 是否保价 + *
+   * 是否必填: 是
+   * 描述: 0 表示不保价,1 表示保价
+   * 
+ */ + @SerializedName("use_insured") + private final Integer useInsured = WxMaConstants.OrderAddInsured.INSURED_PROGRAM; + + /** + * 保价金额 + *
+   * 是否必填: 是
+   * 描述: 单位是分,比如: 10000 表示 100 元
+   * 
+ */ + @SerializedName("insured_value") + @Builder.Default + private final Integer insuredValue = WxMaConstants.OrderAddInsured.DEFAULT_INSURED_VALUE; + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderPerson.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderPerson.java new file mode 100644 index 000000000..989380fb4 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderPerson.java @@ -0,0 +1,110 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 发件人/收件人信息对象 + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressOrderPerson implements Serializable { + + private static final long serialVersionUID = -7816060207882761506L; + + /** + * 发件人/收件人姓名 + *
+   * 是否必填: 是
+   * 描述: 不超过64字节
+   * 
+ */ + private String name; + + /** + * 发件人/收件人座机号码 + *
+   * 是否必填: 否
+   * 描述: 若不填写则必须填写 mobile,不超过32字节
+   * 
+ */ + private String tel; + + /** + * 发件人/收件人手机号码 + *
+   * 是否必填: 否
+   * 描述: 若不填写则必须填写 tel,不超过32字节
+   * 
+ */ + private String mobile; + + /** + * 发件人/收件人公司名 + *
+   * 是否必填: 否
+   * 描述: 不超过64字节
+   * 
+ */ + private String company; + + /** + * 发件人/收件人邮编 + *
+   * 是否必填: 否
+   * 描述: 不超过10字节
+   * 
+ */ + @SerializedName("post_code") + private String postCode; + + /** + * 发件人/收件人所在国家 + *
+   * 是否必填: 否
+   * 描述: 不超过64字节
+   * 
+ */ + private String country; + + /** + * 发件人/收件人省份 + *
+   * 是否必填: 是
+   * 描述: 比如:"广东省",不超过64字节
+   * 
+ */ + private String province; + + /** + * 发件人/收件人地区或市 + *
+   * 是否必填: 是
+   * 描述: 比如:"广州市",不超过64字节
+   * 
+ */ + private String city; + + /** + * 发件人/收件人区或县 + *
+   * 是否必填: 是
+   * 描述: 比如:"天河区",不超过64字节
+   * 
+ */ + private String area; + + /** + * 发件人/收件人详细地址 + *
+   * 是否必填: 是
+   * 描述: 比如:"XX路XX号XX大厦XX",不超过512字节
+   * 
+ */ + private String address; + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderShop.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderShop.java new file mode 100644 index 000000000..9b1e3d884 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressOrderShop.java @@ -0,0 +1,55 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; + +/** + * 商品信息对象 + * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressOrderShop implements Serializable { + + private static final long serialVersionUID = 7256509453502211830L; + + /** + * 商家小程序的路径 + *
+   * 是否必填: 是
+   * 描述: 建议为订单页面
+   * 
+ */ + @SerializedName("wxa_path") + private String wxaPath; + + /** + * 商品缩略图url + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("img_url") + private String imgUrl; + + /** + * 商品名称 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("goods_name") + private String goodsName; + + /** + * 商品数量 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("goods_count") + private Integer goodsCount; + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java new file mode 100644 index 000000000..a5f9f50db --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressPrinterUpdateRequest.java @@ -0,0 +1,54 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * 配置面单打印员请求对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +@Builder +public class WxMaExpressPrinterUpdateRequest implements Serializable { + + private static final long serialVersionUID = 9119040050963924127L; + + /** + * 打印员 openid + *
+   * 是否必填: 是
+   * 
+ */ + private String openid; + + /** + * 更新类型 + *
+   * 是否必填: 是
+   * 描述: bind表示绑定,unbind表示解除绑定
+   * 
+ */ + @SerializedName("update_type") + private String updateType; + + /** + * 打印员面单打印权限 + *
+   * 是否必填: 否
+   * 描述: 用于平台型小程序设置入驻方的打印员面单打印权限,同一打印员最多支持10个tagid,使用逗号分隔,如填写123,456,表示该打印员可以拉取到tagid为123和456的下的单,非平台型小程序无需填写该字段
+   * 
+ */ + @SerializedName("tagid_list") + private String tagidList; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java new file mode 100644 index 000000000..e5d4cb448 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/request/WxMaExpressTestUpdateOrderRequest.java @@ -0,0 +1,94 @@ +package cn.binarywang.wx.miniapp.bean.express.request; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.annotations.SerializedName; +import lombok.Builder; +import lombok.Data; + +import java.io.Serializable; + +/** + *
+ * 模拟快递公司更新订单状态请求对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +@Builder +public class WxMaExpressTestUpdateOrderRequest implements Serializable { + + private static final long serialVersionUID = -3701602332580704140L; + + /** + * 商户id + *
+   * 是否必填: 是
+   * 描述: 需填test_biz_id,默认值已设置
+   * 
+ */ + @SerializedName("biz_id") + @Builder.Default + private final String bizId = "test_biz_id"; + + /** + * 快递公司id + *
+   * 是否必填: 是
+   * 描述: 需填TEST,默认值已设置
+   * 
+ */ + @SerializedName("delivery_id") + @Builder.Default + private final String deliveryId = "TEST"; + + /** + * 订单号 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("order_id") + private String orderId; + + /** + * 运单号 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("waybill_id") + private String waybillId; + + /** + * 轨迹变化 Unix 时间戳 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("action_time") + private Long actionTime; + + /** + * 轨迹变化类型 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("action_type") + private Integer actionType; + + /** + * 轨迹变化具体信息说明,使用UTF-8编码 + *
+   * 是否必填: 是
+   * 
+ */ + @SerializedName("action_msg") + private String actionMsg; + + public String toJson() { + return WxMaGsonBuilder.create().toJson(this); + } + +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java new file mode 100644 index 000000000..01f274fb9 --- /dev/null +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/express/result/WxMaExpressOrderInfoResult.java @@ -0,0 +1,70 @@ +package cn.binarywang.wx.miniapp.bean.express.result; + +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.google.gson.annotations.SerializedName; +import com.google.gson.reflect.TypeToken; +import lombok.Data; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + *
+ * 运单信息返回结果对象
+ * 
+ * @author xiaoyu + * @since 2019-11-26 + */ +@Data +public class WxMaExpressOrderInfoResult implements Serializable { + private static final JsonParser JSON_PARSER = new JsonParser(); + private static final long serialVersionUID = -9166603059965942285L; + + /** + * 错误码 + */ + private Integer errcode; + + /** + * 错误信息 + */ + private String errmsg; + /** + * 订单ID + */ + @SerializedName("order_id") + private String orderId; + + /** + * 运单ID + */ + @SerializedName("waybill_id") + private String waybillId; + + /** + * 运单 html 的 BASE64 结果 + */ + @SerializedName("print_html") + private String printHtml; + + /** + * 运单信息 + */ + @SerializedName("waybill_data") + private List> waybillData; + + + public static WxMaExpressOrderInfoResult fromJson(String json) { + return WxMaGsonBuilder.create().fromJson(json, WxMaExpressOrderInfoResult.class); + } + + public static List toList(String json) { + JsonObject jsonObject = JSON_PARSER.parse(json).getAsJsonObject(); + return WxMaGsonBuilder.create().fromJson(jsonObject.get("order_list").toString(), + new TypeToken>() { + }.getType()); + } +} diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java index efd2b2291..2c89b8a02 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaConstants.java @@ -85,4 +85,56 @@ public class WxMaConstants { */ public static final int IMAGE = 2; } + + /** + * 快递账号绑定类型 + */ + public static final class BindAccountType{ + + /** + * 绑定 + */ + public static final String BIND = "bind"; + + /** + * 解绑 + */ + public static final String UNBIND = "unbind"; + } + + /** + * 快递下单订单来源 + */ + public static final class OrderAddSource{ + + /** + * 小程序 + */ + public static final int MINI_PROGRAM = 0; + + /** + * APP或H5 + */ + public static final int APP_OR_H5 = 2; + } + + /** + * 快递下单保价 + */ + public static final class OrderAddInsured{ + /** + * 不保价 + */ + public static final int INSURED_PROGRAM = 0; + + /** + * 保价 + */ + public static final int USE_INSURED = 1; + + /** + * 默认保价金额 + */ + public static final int DEFAULT_INSURED_VALUE = 0; + } } diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java new file mode 100644 index 000000000..6991ad9c2 --- /dev/null +++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaExpressServiceImplTest.java @@ -0,0 +1,231 @@ +package cn.binarywang.wx.miniapp.api.impl; + +import cn.binarywang.wx.miniapp.api.WxMaExpressService; +import cn.binarywang.wx.miniapp.api.WxMaService; +import cn.binarywang.wx.miniapp.bean.express.*; +import cn.binarywang.wx.miniapp.bean.express.request.*; +import cn.binarywang.wx.miniapp.bean.express.result.WxMaExpressOrderInfoResult; +import cn.binarywang.wx.miniapp.constant.WxMaConstants; +import cn.binarywang.wx.miniapp.test.ApiTestModule; +import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; +import com.google.inject.Inject; +import me.chanjar.weixin.common.error.WxErrorException; +import org.apache.commons.lang3.StringUtils; +import org.testng.annotations.Guice; +import org.testng.annotations.Test; + +import java.util.ArrayList; +import java.util.List; + + +@Guice(modules = ApiTestModule.class) +public class WxMaExpressServiceImplTest { + + @Inject + private WxMaService wxMaService; + + @Test + public void testGetAllDelivery() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + List list = service.getAllDelivery(); + System.out.println(WxMaGsonBuilder.create().toJson(list)); + } + + @Test + public void testGetAllAccount() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + List list = service.getAllAccount(); + System.out.println(WxMaGsonBuilder.create().toJson(list)); + } + + @Test + public void testBindAccount() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressBindAccountRequest request = WxMaExpressBindAccountRequest.builder() + .deliveryId("YUNDA") + .bizId("******") + .password("*********") + .remarkContent("####") + .type(WxMaConstants.BindAccountType.BIND) + .build(); + service.bindAccount(request); + } + + @Test + public void testGetQuota() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressBindAccountRequest request = WxMaExpressBindAccountRequest.builder() + .deliveryId("YUNDA") + .bizId("******") + .build(); + Integer quotaNum = service.getQuota(request); + System.out.println(quotaNum); + } + + + + @Test + public void testUpdatePrinter() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressPrinterUpdateRequest request = WxMaExpressPrinterUpdateRequest.builder() + .openid("*************") + .updateType(WxMaConstants.BindAccountType.UNBIND) + .build(); + service.updatePrinter(request); + } + + @Test + public void testGetPrinter() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressPrinter printer = service.getPrinter(); + System.out.println(WxMaGsonBuilder.create().toJson(printer)); + } + + @Test + public void testAddOrder() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + + WxMaExpressOrderPerson sender = new WxMaExpressOrderPerson(); + sender.setName("张三"); + sender.setMobile("177****9809"); + sender.setProvince("北京市"); + sender.setCity("朝阳区"); + sender.setArea("朝阳区"); + sender.setAddress("西坝河****C-102"); + + WxMaExpressOrderPerson receiver = new WxMaExpressOrderPerson(); + receiver.setName("李四"); + receiver.setMobile("180****8772"); + receiver.setProvince("北京市"); + receiver.setCity("朝阳区"); + receiver.setArea("朝阳区"); + receiver.setAddress("西坝河北里****101"); + + + WxMaExpressOrderCargo cargo = new WxMaExpressOrderCargo(); + List detailList = new ArrayList<>(); + List shopNames = new ArrayList<>(); + Integer goodsCount = 0; + for (int i = 0; i < 4; i++) { + WxMaExpressOrderCargoDetail detail = new WxMaExpressOrderCargoDetail(); + String shopName = "商品_"+i; + detail.setName(shopName); + detail.setCount(1); + detailList.add(detail); + shopNames.add(shopName); + goodsCount ++; + } + cargo.setCount(detailList.size()); + cargo.setWeight(5); + cargo.setSpaceHeight(10); + cargo.setSpaceLength(10); + cargo.setSpaceWidth(10); + cargo.setDetailList(detailList); + + + WxMaExpressOrderShop shop = new WxMaExpressOrderShop(); + shop.setWxaPath("/index/index?from=waybill&id=01234567890123456789"); + shop.setGoodsName(StringUtils.join(shopNames,"&")); + shop.setGoodsCount(goodsCount); + shop.setImgUrl("https://mmbiz.qpic.cn/mmbiz_png/OiaFLUqewuIDNQnTiaCInIG8ibdosYHhQHPbXJUrqYSNIcBL60vo4LIjlcoNG1QPkeH5GWWEB41Ny895CokeAah8A/640"); + + WxMaExpressDelivery.ServiceType serviceType = new WxMaExpressDelivery.ServiceType(); + serviceType.setServiceName("test_service_name"); + serviceType.setServiceType(1); + + WxMaExpressAddOrderRequest request = WxMaExpressAddOrderRequest.builder() + .addSource(WxMaConstants.OrderAddSource.MINI_PROGRAM) + .orderId("test201911271429004") + .openid("oAg_-0PDUPuLbQw9V9kXE9OkU-Vo") + .deliveryId("TEST") + .bizId("test_biz_id") + .customRemark("") + .expectTime(0L) + .sender(sender) + .receiver(receiver) + .cargo(cargo) + .shop(shop) + .insured(WxMaExpressOrderInsured.builder().build()) + .service(serviceType) + .build(); + + WxMaExpressOrderInfoResult result = service.addOrder(request); + System.out.println(WxMaGsonBuilder.create().toJson(result)); + } + + @Test + public void testBatchGetOrder() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + List requests = new ArrayList<>(); + + List orderIds = new ArrayList<>(); + orderIds.add("test201911271429000"); + + List waybillIds = new ArrayList<>(); + waybillIds.add("test201911271429000_1574836404_waybill_id"); + for (int i = 0; i < orderIds.size(); i++) { + WxMaExpressGetOrderRequest request = WxMaExpressGetOrderRequest.builder() + .orderId(orderIds.get(i)) + .deliveryId("TEST") + .waybillId(waybillIds.get(i)) + .build(); + requests.add(request); + } + + List results = service.batchGetOrder(requests); + System.out.println(WxMaGsonBuilder.create().toJson(results)); + } + + @Test + public void testCancelOrder() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressGetOrderRequest request = WxMaExpressGetOrderRequest.builder() + .orderId("test201911271429000") + .deliveryId("TEST") + .waybillId("test201911271429000_1574836404_waybill_id") + .openid("oAg_-0PDUPuLbQw9V9kXE9OkU-Vo") + .build(); + service.cancelOrder(request); + } + + + @Test + public void testGetOrder() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressGetOrderRequest request = WxMaExpressGetOrderRequest.builder() + .orderId("test201911271429000") + .deliveryId("TEST") + .waybillId("test201911271429000_1574836404_waybill_id") + .openid("oAg_-0PDUPuLbQw9V9kXE9OkU-Vo") + .build(); + WxMaExpressOrderInfoResult result = service.getOrder(request); + System.out.println(WxMaGsonBuilder.create().toJson(result)); + } + + + @Test + public void testGetPath() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressGetOrderRequest request = WxMaExpressGetOrderRequest.builder() + .orderId("test201911271429000") + .deliveryId("TEST") + .waybillId("test201911271429000_1574836404_waybill_id") + .openid("oAg_-0PDUPuLbQw9V9kXE9OkU-Vo") + .build(); + WxMaExpressPath path = service.getPath(request); + System.out.println(WxMaGsonBuilder.create().toJson(path)); + } + + @Test + public void testTestUpdateOrder() throws WxErrorException { + final WxMaExpressService service = wxMaService.getExpressService(); + WxMaExpressTestUpdateOrderRequest request = WxMaExpressTestUpdateOrderRequest.builder() + .orderId("test201911271429000") + .waybillId("test201911271429000_1574836404_waybill_id") + .actionTime(1574850455L) + .actionType(300002) + .actionMsg("开始派送") + .build(); + service.testUpdateOrder(request); + } +}