From 24bde9298c9c5d4bffe31ef5133df0b9ad4952f8 Mon Sep 17 00:00:00 2001
From: akingzwk <57396633+akingzwk@users.noreply.github.com>
Date: Wed, 11 Aug 2021 09:47:34 +0800
Subject: [PATCH 0001/1263] =?UTF-8?q?:bug:=20=20#2253=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E5=A4=8D=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=95=86=E6=A8=A1=E5=BC=8F=E9=80=9A=E8=BF=87=E6=8E=88?=
=?UTF-8?q?=E6=9D=83=E7=A0=81=E8=8E=B7=E5=8F=96=E7=99=BB=E5=BD=95=E7=94=A8?=
=?UTF-8?q?=E6=88=B7=E7=9A=84=E4=BF=A1=E6=81=AF=E8=BF=94=E5=9B=9E=E2=80=9D?=
=?UTF-8?q?=E4=B8=8D=E5=90=88=E6=B3=95=E7=9A=84=E7=9A=84suite=5Fticket?=
=?UTF-8?q?=E5=8F=82=E6=95=B0=E2=80=9C=E7=9A=84=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
index 89903d6f00..03316b9ae2 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java
@@ -461,7 +461,7 @@ public WxTpLoginInfo getLoginInfo(String authCode) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("auth_code", authCode);
String access_token = getWxCpProviderToken();
- String responseText = post(configStorage.getApiUrl(GET_LOGIN_INFO) + "?access_token=" + access_token, jsonObject.toString());
+ String responseText = post(configStorage.getApiUrl(GET_LOGIN_INFO) + "?access_token=" + access_token, jsonObject.toString(), true);
return WxTpLoginInfo.fromJson(responseText);
}
From e9c1cda3563e94a57563611326a7068923aeac5e Mon Sep 17 00:00:00 2001
From: liming1019
+ * ext_json补充说明 + * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/commit.html + * 为了便于第三方平台使用同一个小程序模板为不同的小程序提供服务,第三方可以将自定义信息放置在 ext_json 中,在模板小程序中,可以使用 wx.getExtConfigSync 接口获取自定义信息,从而区分不同的小程序。详见:小程序模板开发 + * ext_json 中的参数可选,参数详见小程序配置;但是,如果是模板id为标准模板库的模板id,则ext_json可支持的参数为:{"extAppid":'', "ext": {}, "window": {}} + * ext_json 中有限支持 pages,支持配置模板页面的子集(ext_json 中不可新增页面)。 + * ext_json 中有限支持 subPackages,支持配置模板分包及其页面的子集(ext_json 中配置的分包必须已声明于模板中,且不可新增分包页面)。 + * ext_json支持plugins配置,该配置会覆盖模板中的app.json中的plugins配置。关于plugin的使用详情请参考使用插件。 + * 如果代码中已经有配置,则配置的合并规则为: + * ext整体替换 + * pages整体替换 + * extPages中找到对应页面,同级覆盖page.json + * window同级覆盖 + * extAppid直接加到app.json + * networkTimeout同级覆盖 + * customOpen整体替换 + * tabbar同级覆盖 + * functionPages整体替换 + * subPackages整体替换 + * navigateToMiniProgaramAppIdList:整体替换 + * plugins整体替换 + *
+ * * @author yqx * @date 2018/9/13 */ diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java new file mode 100644 index 0000000000..2d4b713919 --- /dev/null +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/bean/ma/WxMaOpenCommitStandardExt.java @@ -0,0 +1,56 @@ +package me.chanjar.weixin.open.bean.ma; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.io.Serializable; +import java.util.Map; + +/** + * 微信第三方平台上传代码到小程序代码标准模板时的参数 + * ext_json补充说明 + * 文档地址:https://developers.weixin.qq.com/doc/oplatform/Third-party_Platforms/2.0/api/code/commit.html + * 为了便于第三方平台使用同一个小程序模板为不同的小程序提供服务,第三方可以将自定义信息放置在 ext_json 中,在模板小程序中,可以使用 wx.getExtConfigSync 接口获取自定义信息,从而区分不同的小程序。详见:小程序模板开发 + * ext_json 中的参数可选,参数详见小程序配置;但是,如果是模板id为标准模板库的模板id,则ext_json可支持的参数为:{"extAppid":'', "ext": {}, "window": {}} + * ext_json 中有限支持 pages,支持配置模板页面的子集(ext_json 中不可新增页面)。 + * ext_json 中有限支持 subPackages,支持配置模板分包及其页面的子集(ext_json 中配置的分包必须已声明于模板中,且不可新增分包页面)。 + * ext_json支持plugins配置,该配置会覆盖模板中的app.json中的plugins配置。关于plugin的使用详情请参考使用插件。 + * 如果代码中已经有配置,则配置的合并规则为: + * ext整体替换 + * pages整体替换 + * extPages中找到对应页面,同级覆盖page.json + * window同级覆盖 + * extAppid直接加到app.json + * networkTimeout同级覆盖 + * customOpen整体替换 + * tabbar同级覆盖 + * functionPages整体替换 + * subPackages整体替换 + * navigateToMiniProgaramAppIdList:整体替换 + * plugins整体替换 + * + * + * @author 广州跨界 + * @since 2021/08/12 + */ +@Data +public class WxMaOpenCommitStandardExt implements Serializable { + + private static final long serialVersionUID = 4595618023108631477L; + + /** + * 授权小程序Appid,可填入商户小程序AppID,以区分不同商户 + */ + @SerializedName("create_time") + private String extAppId; + + /** + * 开发自定义的数据字段 + */ + private Map+ * 微信h5纯签约入参 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxH5EntrustRequest extends BaseWxPayRequest { + + /** + *
+ * 协议模板ID + * plan_id + * 是 + * String(28) + * 12535 + * 协议模板ID,分为首次签约,支付中签约,重新签约 + *+ */ + @Required + @XStreamAlias("plan_id") + private String planId; + + /** + *
+ * 签约协议号 + * contract_code + * 是 + * String(32) + * 100000 + * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成 + *+ */ + @Required + @XStreamAlias("contract_code") + private String contractCode; + + /** + *
+ * 请求序列号 + * request_serial + * 是 + * int(64) + * 1000 + * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字 + *+ */ + @Required + @XStreamAlias("request_serial") + private Long requestSerial; + + /** + *
+ * 用户账户展示名称 + * contract_display_account + * 是 + * string(32) + * 微信代扣 + * 签约用户的名称,用户页面展示,不支持符号表情 + *+ */ + @Required + @XStreamAlias("contract_display_account") + private String contractDisplayAccount; + + /** + *
+ * 回调通知URL + * notify_url + * 是 + * string(256) + * https://weixin.qq.com + * 用于接收签约成功消息的回调通知地址 + *+ */ + @Required + @XStreamAlias("notify_url") + private String notifyUrl; + + /** + *
+ * 版本号 + * sign + * 是 + * string(8) + * 1.0 + * 固定值1.0 + *+ */ + @Required + @XStreamAlias("version") + private String version; + + /** + *
+ * 时间戳 + * timestamp + * 是 + * string(10) + * 1414488825 + * 系统当前时间,10位 + *+ */ + @Required + @XStreamAlias("timestamp") + private String timestamp; + + /** + *
+ * 客户端IP + * clientip + * 是 + * string(32) + * 127.0.0.1 + * 用户客户端的IP地址 + *+ */ + @Required + @XStreamAlias("clientip") + private String clientIp; + + /** + *
+ * 回调应用appid + * return_appid + * 否 + * string(32) + * wxcbda96de0b16 + * 用来控制签约页面结束后的返回路径, + * 当指定该字段是,签约成功将返回return_appid指定的APP应用,如果不填且签约发起的浏览器ua可被微信识别, + * 则挑战到浏览器,否则留在微信 + *+ */ + @XStreamAlias("return_appid") + private String returnAppid; + + /** + *
+ * 商户测用户标识 + * outerid + * 否 + * string(32) + * 陈*(10000001) + * 用于多账号签约,值与contract_display_account一样就行 + *+ */ + @XStreamAlias("outerid") + private String outerId; + + + /** + * 是否需要nonce_str + */ + @Override + protected boolean needNonceStr() { + return false; + } + + @Override + protected void checkConstraints() throws WxPayException { + + } + + @Override + protected void storeMap(Map
+ * 小程序纯签约入参 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxMaEntrustRequest extends BaseWxPayRequest { + /** + *
+ * 协议模板ID + * plan_id + * 是 + * String(28) + * 12535 + * 协议模板ID,分为首次签约,支付中签约,重新签约 + *+ */ + @Required + @SerializedName(value = "plan_id") + @XStreamAlias("plan_id") + private String planId; + + /** + *
+ * 签约协议号 + * contract_code + * 是 + * String(32) + * 100000 + * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成 + *+ */ + @Required + @SerializedName(value = "contract_code") + @XStreamAlias("contract_code") + private String contractCode; + + /** + *
+ * 请求序列号 + * request_serial + * 是 + * int(64) + * 1000 + * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字 + *+ */ + @Required + @SerializedName(value = "request_serial") + @XStreamAlias("request_serial") + private Long requestSerial; + + /** + *
+ * 用户账户展示名称 + * contract_display_account + * 是 + * string(32) + * 微信代扣 + * 签约用户的名称,用户页面展示,不支持符号表情 + *+ */ + @Required + @SerializedName(value = "contract_display_account") + @XStreamAlias("contract_display_account") + private String contractDisplayAccount; + + /** + *
+ * 回调通知URL + * notify_url + * 是 + * string(256) + * https://weixin.qq.com + * 用于接收签约成功消息的回调通知地址 + *+ */ + @Required + @SerializedName(value = "notify_url") + @XStreamAlias("notify_url") + private String notifyUrl; + + /** + *
+ * 版本号 + * sign + * 是 + * string(8) + * 1.0 + * 固定值1.0 + *+ */ + @Required + @XStreamAlias("version") + private String version; + + + /** + *
+ * 时间戳 + * timestamp + * 是 + * string(10) + * 1414488825 + * 系统当前时间,10位 + *+ */ + @Required + @XStreamAlias("timestamp") + private String timestamp; + + /** + *
+ * 商户侧用户标识 + * outerId + * 否 + * String + * 陈*(141448825) + * 用户在商户侧的标识 + *+ */ + @XStreamAlias("outerid") + private String outerId; + + @Override + protected void checkConstraints() throws WxPayException { + + } + + /** + * 是否需要nonce_str + */ + @Override + protected boolean needNonceStr() { + return false; + } + + @Override + protected void storeMap(Map
+ * 公众号纯签约入参 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxMpEntrustRequest extends BaseWxPayRequest { + + /** + *
+ * 协议模板ID + * plan_id + * 是 + * String(28) + * 12535 + * 协议模板ID,分为首次签约,支付中签约,重新签约 + *+ */ + @Required + @XStreamAlias("plan_id") + private String planId; + + /** + *
+ * 签约协议号 + * contract_code + * 是 + * String(32) + * 100000 + * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成 + *+ */ + @Required + @XStreamAlias("contract_code") + private String contractCode; + + /** + *
+ * 请求序列号 + * request_serial + * 是 + * int(64) + * 1000 + * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字 + *+ */ + @Required + @XStreamAlias("request_serial") + private Long requestSerial; + + /** + *
+ * 用户账户展示名称 + * contract_display_account + * 是 + * string(32) + * 微信代扣 + * 签约用户的名称,用户页面展示,不支持符号表情 + *+ */ + @Required + @XStreamAlias("contract_display_account") + private String contractDisplayAccount; + + /** + *
+ * 回调通知URL + * notify_url + * 是 + * string(256) + * https://weixin.qq.com + * 用于接收签约成功消息的回调通知地址 + *+ */ + @Required + @XStreamAlias("notify_url") + private String notifyUrl; + + /** + *
+ * 版本号 + * sign + * 是 + * string(8) + * 1.0 + * 固定值1.0 + *+ */ + @Required + @XStreamAlias("version") + private String version; + + /** + *
+ * 时间戳 + * timestamp + * 是 + * string(10) + * 1414488825 + * 系统当前时间,10位 + *+ */ + @Required + @XStreamAlias("timestamp") + private String timestamp; + + /** + *
+ * 返回web + * return_web + * 否 + * int + * 1 + * 用来控制签约页面结束后的返回路径(不传签约后留在微信内),1 表示返回签约页面的referrer url, + * 不填或获取不到referrer则不返回,跳转referrer url 时会自动带上from_wxpay=1 + *+ */ + @XStreamAlias("return_web") + private Integer returnWeb; + + /** + *
+ * 商户测的用户标识 + * outerid + * 否 + * String() + * 陈*(101000203) + * 用于多账户签约,同一个模板下要保持一致,取值和contractDisplayAccount取一样就行 + *+ */ + @XStreamAlias("outerid") + private String outerId; + + @Override + protected void checkConstraints() throws WxPayException { + + } + + /** + * 是否需要nonce_str + */ + @Override + protected boolean needNonceStr() { + return false; + } + + @Override + protected void storeMap(Map
+ * 支付中签约入参 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxPayEntrustRequest extends BaseWxPayRequest { + + /** + *
+ * 签约商户号 + * contract_mchid + * 是 + * String(32) + * 1200009811 + * 签约商户号,必须与mch_id一致 + *+ */ + @Required + @XStreamAlias("contract_mchid") + private String contractMchId; + + /** + *
+ * 签约APPID + * contract_appid + * 是 + * String(32) + * wxcbda96de0b165486 + * 签约公众号,必须与APPID一致 + *+ */ + @Required + @XStreamAlias("contract_appid") + private String contractAppId; + + /** + *
+ * 商户订单号 + * out_trade_no + * 是 + * String(32) + * 123456 + * 商户系统内部的订单号,32字符内,可包含字母 + *+ */ + @Required + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
+ * 设备号 + * device_info + * 否 + * String(32) + * 013467007045764 + * 终端设备号,若为PC网页或公众号内则传WEB + *+ */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + *
+ * 商品描述 + * body + * 是 + * String(128) + * ipad mini 16G 白色 + * 商品支付单简要描述 + *+ */ + @Required + @XStreamAlias("body") + private String body; + + /** + *
+ * 商品详情 + * detail + * 否 + * String(8192) + * ipad mini 16G 白色 + * 商品名称明细列表 + *+ */ + @XStreamAlias("detail") + private String detail; + + /** + *
+ * 附加数据 + * attach + * 否 + * String(127) + * online/dev/dev1 + * 商家数据包 + *+ */ + @XStreamAlias("attach") + private String attach; + + /** + *
+ * 回调通知url + * notify_url + * 是 + * String(256) + * https://weixin.qq.com + * 回调通知地址 + *+ */ + @Required + @XStreamAlias("notify_url") + private String notifyUrl; + + /** + *
+ * 总金额 + * total_fee + * 是 + * int + * 888 + * 订单总金额,单位分 + *+ */ + @Required + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
+ * 终端ip + * spbill_create_ip + * 是 + * String(16) + * 127.0.0.1 + * 用户的客户端IP + *+ */ + @Required + @XStreamAlias("spbill_create_ip") + private String spbillCreateIp; + + /** + *
+ * 交易起始时间 + * time_start + * 否 + * String(14) + * 20201025171529 + * 订单生成时间,格式yyyyMMddHHmmss + *+ */ + @XStreamAlias("time_start") + private String timeStart; + + /** + *
+ * 交易结束时间 + * time_expire + * 否 + * String(14) + * 20201025171529 + * 订单失效时间,格式yyyyMMddHHmmss + *+ */ + @XStreamAlias("time_expire") + private String timeExpire; + + /** + *
+ * 商品标记 + * goods_tag + * 否 + * String(32) + * wxg + * 商品标记,代金券或立减优惠功能参数 + *+ */ + @XStreamAlias("goods_tag") + private String goodsTag; + + /** + *
+ * 交易类型 + * trade_type + * 是 + * String(16) + * JSAPI + * JSAPI,MWEB + *+ */ + @Required + @XStreamAlias("trade_type") + private String tradeType; + + /** + *
+ * 商品ID + * product_id + * 否 + * String(32) + * 12234355463434643 + * 二维码支付必传,二维码中包含商品ID + *+ */ + @XStreamAlias("product_id") + private String productId; + + /** + *
+ * 指定支付方式 + * limit_pay + * 否 + * String(32) + * no_credit + * no_credit--指定不能使用信用卡支付 + *+ */ + @XStreamAlias("limit_pay") + private String limitPay; + + /** + *
+ * 用户表示 + * openid + * 否 + * String(128) + * oUpF4sdsidj3Jds89 + * tradetype=JSAPI 则必传 + *+ */ + @XStreamAlias("openid") + private String openId; + + /** + *
+ * 协议模板ID + * plan_id + * 是 + * String(28) + * 12535 + * 协议模板ID,分为首次签约,支付中签约,重新签约 + *+ */ + @Required + @XStreamAlias("plan_id") + private String planId; + + /** + *
+ * 签约协议号 + * contract_code + * 是 + * String(32) + * 100000 + * 商户侧签约协议号,由商户生成,只能是数字,大小写字母组成 + *+ */ + @Required + @XStreamAlias("contract_code") + private String contractCode; + + /** + *
+ * 请求序列号 + * request_serial + * 是 + * int(64) + * 1000 + * 商户请求签约时的序列号,要求唯一性,禁止使用0开头的,用户排序,纯数字 + *+ */ + @Required + @XStreamAlias("request_serial") + private Long requestSerial; + + /** + *
+ * 用户账户展示名称 + * contract_display_account + * 是 + * string(32) + * 微信代扣 + * 签约用户的名称,用户页面展示,不支持符号表情 + *+ */ + @Required + @XStreamAlias("contract_display_account") + private String contractDisplayAccount; + + /** + *
+ * 签约信息通知URL + * contract_notify_url + * 是 + * string(32) + * https://yoursite.com + * 签约信息回调通知URL + *+ */ + @Required + @XStreamAlias("contract_notify_url") + private String contractNotifyUrl; + + /** + *
+ * 商户测的用户标识 + * contract_outerid + * 否 + * string(32) + * 陈*(12000002) + * 用于多账户签约,值与contract_display_account相同即可,同一模板下唯一 + *+ */ + @XStreamAlias("contract_outerid") + private String contractOuterId; + + @Override + protected void checkConstraints() throws WxPayException { + + } + + @Override + protected void storeMap(Map
+ * 微信预扣款请求参数 + *+ */ +@Data +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +public class WxPreWithholdRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 委托代扣协议ID + */ + @SerializedName(value = "contract_id") + private String contractId; + + /** + * 直连商户号 + */ + @SerializedName(value = "mchid") + private String mchId; + + /** + * 公众号ID + */ + @SerializedName(value = "appid") + private String appId; + + /** + * 预计扣款的金额信息 + */ + @SerializedName(value = "estimated_amount") + private EstimateAmount estimateAmount; + + + @Data + public static class EstimateAmount implements Serializable { + /** + * 预计扣费金额 + */ + private Integer amount; + + /** + * 人民币:CNY + * 非必填 + */ + private String currency; + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java new file mode 100644 index 0000000000..3ecee3fe81 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxSignQueryRequest.java @@ -0,0 +1,105 @@ +package com.github.binarywang.wxpay.bean.request; + +import com.github.binarywang.wxpay.exception.WxPayException; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.*; +import me.chanjar.weixin.common.annotation.Required; +import org.apache.commons.lang3.StringUtils; + +import java.util.Map; +import java.util.Objects; + +/** + * @author chenliang + * @date 2021-08-02 5:23 下午 + *
+ * 微信签约状态查询入参 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxSignQueryRequest extends BaseWxPayRequest { + + //方式1. 使用contract_id查 + /** + *
+ * 字段名:委托代扣协议ID. + * 变量名:contract_id + * 是否必填:二选一 + * 类型:String(32) + * 示例值:1000005698 + * 签约成功后由微信返回 + *+ */ + @XStreamAlias("contract_id") + private String contractId; + + /** + *
+ * 字段名:接口版本号. + * 变量名:version + * 是否必填:是 + * 类型:String(8) + * 示例值:1.0 + * 固定填写1.0, + *+ */ + @Required + @XStreamAlias("version") + private String version; + + //方式2. 使用plan_id和contract_code查 + /** + *
+ * 字段名:模板ID. + * 变量名:plan_id + * 是否必填:二选一 + * 类型:int + * 示例值:123 + * 代扣模板ID + *+ */ + @XStreamAlias("plan_id") + private Integer planId; + + /** + *
+ * 字段名:签约协议号. + * 变量名:contract_code + * 是否必填:二选一 + * 类型:String(32) + * 示例值:12332343 + * 商户侧唯一 + *+ */ + @XStreamAlias("contract_code") + private String contractCode; + + + @Override + protected boolean needNonceStr() { + return false; + } + + @Override + protected void checkConstraints() throws WxPayException { + if (StringUtils.isNotBlank(contractId) && + (Objects.nonNull(planId) || StringUtils.isNotBlank(contractCode))) { + throw new WxPayException("contractId 和 planId&contractCode 不能同时存在或同时为空,必须二选一"); + } + } + + @Override + protected void storeMap(Map
+ * 微信api申请解约 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxTerminatedContractRequest extends BaseWxPayRequest { + //方式1. 使用contract_id查 + /** + *
+ * 字段名:委托代扣协议ID. + * 变量名:contract_id + * 是否必填:二选一 + * 类型:String(32) + * 示例值:1000005698 + * 签约成功后由微信返回 + *+ */ + @XStreamAlias("contract_id") + private String contractId; + + /** + *
+ * 字段名:解约备注. + * 变量名:contract_termination_remark + * 是否必填:是 + * 类型:String(256) + * 示例值:解约原因 + * 例如:签约信息有误,须重新签约 + *+ */ + @Required + @XStreamAlias("contract_termination_remark") + private String contractTerminationRemark; + + /** + *
+ * 字段名:接口版本号. + * 变量名:version + * 是否必填:是 + * 类型:String(8) + * 示例值:1.0 + * 固定填写1.0, + *+ */ + @Required + @XStreamAlias("version") + private String version; + + //方式2. 使用plan_id和contract_code查 + + /** + *
+ * 字段名:模板ID. + * 变量名:plan_id + * 是否必填:二选一 + * 类型:int + * 示例值:123 + * 代扣模板ID + *+ */ + @XStreamAlias("plan_id") + private Integer planId; + + /** + *
+ * 字段名:签约协议号. + * 变量名:contract_code + * 是否必填:二选一 + * 类型:String(32) + * 示例值:12332343 + * 商户侧唯一 + *+ */ + @XStreamAlias("contract_code") + private String contractCode; + + + @Override + protected void checkConstraints() throws WxPayException { + if (StringUtils.isNotBlank(contractId) && + (Objects.nonNull(planId) || StringUtils.isNotBlank(contractCode))) { + throw new WxPayException("contractId 和 planId&contractCode 不能同时存在或同时为空,必须二选一"); + } + } + + @Override + protected boolean needNonceStr() { + return false; + } + + + @Override + protected void storeMap(Map
代扣订单查询参数+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxWithholdOrderQueryRequest extends BaseWxPayRequest { + /** + *
+ * 字段名:微信订单号. + * 变量名:transaction_id + * 是否必填:二选一 + * 类型:String(32) + * 示例值:1000005698 + * 微信生成的单号,支付通知中返回 + *+ */ + @XStreamAlias("transaction_id") + private String transactionId; + + /** + *
+ * 字段名:商户订单号. + * 变量名:out_trade_no + * 是否必填:二选一 + * 类型:String(32) + * 示例值:1000005698 + * 商户系统内部订单号 + *+ */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + + @Override + protected void checkConstraints() throws WxPayException { + if (StringUtils.isNotBlank(transactionId) && StringUtils.isNotBlank(outTradeNo)) { + throw new WxPayException("transactionId 和 outTradeNo 不能同时存在或同时为空,必须二选一"); + } + } + + @Override + protected void storeMap(Map
+ * 发起微信委托代扣参数 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@Builder(builderMethodName = "newBuilder") +@NoArgsConstructor +@AllArgsConstructor +@XStreamAlias("xml") +public class WxWithholdRequest extends BaseWxPayRequest { + + /** + *
+ * 商品描述 + * body + * 是 + * String(128) + * ipad mini 16G 白色 + * 商品支付单简要描述 + *+ */ + @Required + @XStreamAlias("body") + private String body; + + /** + *
+ * 商品详情 + * detail + * 否 + * String(8192) + * ipad mini 16G 白色 + * 商品名称明细列表 + *+ */ + @XStreamAlias("detail") + private String detail; + + /** + *
+ * 附加数据 + * attach + * 否 + * String(127) + * online/dev/dev1 + * 商家数据包 + *+ */ + @XStreamAlias("attach") + private String attach; + + /** + *
+ * 商户订单号 + * out_trade_no + * 是 + * String(32) + * 123456 + * 商户系统内部的订单号,32字符内,可包含字母 + *+ */ + @Required + @XStreamAlias("out_trade_no") + private String outTradeNo; + + /** + *
+ * 总金额 + * total_fee + * 是 + * int + * 888 + * 订单总金额,单位分 + *+ */ + @Required + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + *
+ * 货币类型 + * fee_type + * 否 + * String(16) + * CNY + * 默认人民币:CNY + *+ */ + @XStreamAlias("fee_type") + private String feeType; + + /** + *
+ * 终端ip + * spbill_create_ip + * 否 + * String(16) + * 127.0.0.1 + * 用户的客户端IP + *+ */ + @XStreamAlias("spbill_create_ip") + private String spbillCreateIp; + + /** + *
+ * 商品标记 + * goods_tag + * 否 + * String(32) + * wxg + * 商品标记,代金券或立减优惠功能参数 + *+ */ + @XStreamAlias("goods_tag") + private String goodsTag; + + /** + *
+ * 回调通知url + * notify_url + * 是 + * String(256) + * https://weixin.qq.com + * 回调通知地址 + *+ */ + @Required + @XStreamAlias("notify_url") + private String notifyUrl; + + /** + *
+ * 交易类型 + * trade_type + * 是 + * String(16) + * JSAPI + * JSAPI,MWEB + *+ */ + @Required + @XStreamAlias("trade_type") + private String tradeType; + + /** + *
+ * 委托代扣协议ID + * contract_id + * 是 + * String(32) + * Wx234324808503234483920 + * 签约成功后微信返回的委托代扣协议ID + *+ */ + @Required + @XStreamAlias("contract_id") + private String contractId; + + @Override + protected void checkConstraints() throws WxPayException { + + } + + @Override + protected void storeMap(Map
+ * h5纯签约后结果 + *+ */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WxH5EntrustResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 业务结果描述 + */ + @XStreamAlias("result_msg") + private String resultMsg; + + /** + * 跳转url + */ + @XStreamAlias("redirect_url") + private String redirectUrl; + + @Override + protected void loadXml(Document d) { + resultMsg = readXmlString(d, "result_msg"); + redirectUrl = readXmlString(d, "redirect_url"); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java new file mode 100644 index 0000000000..4dc6f19ae4 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayEntrustResult.java @@ -0,0 +1,190 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.util.SignUtils; +import com.google.common.collect.Lists; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import org.apache.commons.lang3.StringUtils; +import org.w3c.dom.Document; + +import java.io.Serializable; +import java.util.List; +import java.util.Map; + +/** + * @author chenliang + * @date 2021-08-02 5:38 下午 + * + *
+ * 支付中签约返回结果 + *+ */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WxPayEntrustResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 预签约结果 + */ + @XStreamAlias("contract_result_code") + private String contractResultCode; + + /** + * 预约签约错误码 + */ + @XStreamAlias("contract_err_code") + private String contractErrCode; + + /** + * 预签约错误描述 + */ + @XStreamAlias("contract_err_code_des") + private String contractErrCodeDes; + + /** + * 预支付ID + */ + @XStreamAlias("prepay_id") + private String prepayId; + + /** + * 交易类型 + */ + @XStreamAlias("trade_type") + private String tradeType; + + /** + * 二维码链接 + * 非必传 + */ + @XStreamAlias("code_url") + private String codeUrl; + + /** + * 模板ID + * 非必传 + */ + @XStreamAlias("plan_id") + private Integer planId; + + /** + * 请求序列号 + * 非必传 + */ + @XStreamAlias("request_serial") + private Integer requestSerial; + + /** + * 签约协议号 + * 非必传 + */ + @XStreamAlias("contract_code") + private String contractCode; + + /** + * 用户账户展示名称 + * 非必传 + */ + @XStreamAlias("contract_display_account") + private String contractDisplayAccount; + + /** + * 支付跳转链接 + * 非必传 + */ + @XStreamAlias("mweb_url") + private String mwebUrl; + + /** + * 商户订单号 + */ + @XStreamAlias("out_trade_no") + private String outTradeNo; + + + @Override + protected void loadXml(Document d) { + contractResultCode = readXmlString(d, "contract_result_code"); + contractErrCode = readXmlString(d, "contract_err_code"); + contractErrCodeDes = readXmlString(d, "contract_err_code_des"); + prepayId = readXmlString(d, "prepay_id"); + tradeType = readXmlString(d, "trade_type"); + codeUrl = readXmlString(d, "code_url"); + planId = readXmlInteger(d, "plan_id"); + requestSerial = readXmlInteger(d, "request_serial"); + contractCode = readXmlString(d, "contract_code"); + contractDisplayAccount = readXmlString(d, "contract_display_account"); + mwebUrl = readXmlString(d, "mweb_url"); + outTradeNo = readXmlString(d, "out_trade_no"); + } + + /** + * 校验返回结果签名. + * + * @param wxPayService the wx pay service + * @param signType 签名类型 + * @param checkSuccess 是否同时检查结果是否成功 + * @throws WxPayException the wx pay exception + */ + + @Override + public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException { + //校验返回结果签名 + Map
+ * 微信签约查询返回结果 + *+ */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WxSignQueryResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 委托代扣协议ID + */ + @XStreamAlias("contractId") + private String contractId; + + /** + * 模板ID + */ + @XStreamAlias("plan_id") + private String planId; + + /** + * 请求序列号 + */ + @XStreamAlias("request_serial") + private Integer requestSerial; + + /** + * 签约协议号 + */ + @XStreamAlias("contract_code") + private String contractCode; + + /** + * 用户账户展示名称 + */ + @XStreamAlias("contract_display_account") + private String contractDisplayAccount; + + /** + * 协议状态 + */ + @XStreamAlias("contract_state") + private Integer contractState; + + /** + * 协议签署时间 + */ + @XStreamAlias("contract_signed_time") + private String contractSignedTime; + + /** + * 协议到期时间 + */ + @XStreamAlias("contract_expired_time") + private String contractExpiredTime; + + /** + * 协议解约时间 + * 非必传 + */ + @XStreamAlias("contract_terminated_time") + private String contractTerminatedTime; + + /** + * 协议解约方式 + * 非必传 + */ + @XStreamAlias("contract_terminated_mode") + private Integer contractTerminatedMode; + + /** + * 解约备注 + * 非必传 + */ + @XStreamAlias("contract_termination_remark") + private String contractTerminationRemark; + + /** + * 用户表示 + */ + @XStreamAlias("openid") + private String openId; + + + @Override + protected void loadXml(Document d) { + contractId = readXmlString(d, "contract_id"); + planId = readXmlString(d, "plan_id"); + requestSerial = readXmlInteger(d, "request_serial"); + contractCode = readXmlString(d, "contract_code"); + contractDisplayAccount = readXmlString(d, "contract_display_account"); + contractState = readXmlInteger(d, "contract_state"); + contractSignedTime = readXmlString(d, "contract_signed_time"); + contractExpiredTime = readXmlString(d, "contrace_Expired_time"); + contractTerminatedTime = readXmlString(d, "contract_terminated_time"); + contractTerminatedMode = readXmlInteger(d, "contract_terminate_mode"); + contractTerminationRemark = readXmlString(d, "contract_termination_remark"); + openId = readXmlString(d, "openid"); + } + + @Override + public String toString() { + return WxGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java new file mode 100644 index 0000000000..f55b576e36 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxSignStatusNotifyResult.java @@ -0,0 +1,127 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.common.util.xml.XStreamInitializer; +import org.w3c.dom.Document; + +/** + * @author chenliang + * @date 2021-08-02 4:59 下午 + *
+ * 微信签约/解约 回调结果 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class WxSignStatusNotifyResult extends BaseWxPayResult { + + private static final long serialVersionUID = 1L; + + /** + * 签约协议号 + */ + @XStreamAlias("contract_code") + private String contractCode; + + /** + * 模板ID + */ + @XStreamAlias("plan_id") + private String planId; + + /** + * 用户表示 + */ + @XStreamAlias("openid") + private String openId; + + /** + * 变更类型, ADD:签约,DELETE:解约 + */ + @XStreamAlias("change_type") + private String changeType; + + /** + * 操作时间 + */ + @XStreamAlias("operate_time") + private String operateTime; + + /** + * 委托代扣协议ID + */ + @XStreamAlias("contract_id") + private String contractId; + + /** + * 协议到期时间,ADD会有,长期有效,忽略 + * 非必传 + */ + @XStreamAlias("contract_expired_time") + private String contractExpiredTime; + + /** + * DELETE时返回,0: 未解约,1:有效期过期自动解约,2:用户主动解约,3:商户api解约,4:商户平台解约,5:用户账号注销 + * 非必传 + */ + @XStreamAlias("contract_termination_mode") + private Integer contractTerminationMode; + + /** + * 请求序列号 + */ + @XStreamAlias("request_serial") + private Integer requestSerial; + + @Override + public void checkResult(WxPayService wxPayService, String signType, boolean checkSuccess) throws WxPayException { + //防止伪造成功通知 + if (WxPayConstants.ResultCode.SUCCESS.equals(getReturnCode()) && getSign() == null) { + throw new WxPayException("伪造的通知!"); + } + + super.checkResult(wxPayService, signType, checkSuccess); + } + + /** + * From xml wx sign notify result. + * + * @param xmlString the xml string + * @return the wx sign result + */ + public static WxSignStatusNotifyResult fromXML(String xmlString) { + XStream xstream = XStreamInitializer.getInstance(); + xstream.processAnnotations(WxSignStatusNotifyResult.class); + WxSignStatusNotifyResult result = (WxSignStatusNotifyResult) xstream.fromXML(xmlString); + result.setXmlString(xmlString); + return result; + } + + @Override + protected void loadXml(Document d) { + contractCode = readXmlString(d, "contract_code"); + planId = readXmlString(d, "plan_id"); + openId = readXmlString(d, "openid"); + changeType = readXmlString(d, "change_type"); + operateTime = readXmlString(d, "operate_time"); + contractId = readXmlString(d, "contract_id"); + contractExpiredTime = readXmlString(d, "contract_expired_time"); + contractTerminationMode = readXmlInteger(d, "contract_termination_mode"); + requestSerial = readXmlInteger(d, "request_serial"); + } + + @Override + public String toString() { + return WxGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java new file mode 100644 index 0000000000..77067d0213 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxTerminationContractResult.java @@ -0,0 +1,57 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import org.w3c.dom.Document; + +import java.io.Serializable; + +/** + * @author chenliang + * @date 2021-08-02 5:41 下午 + * + *
+ * 主动解约返回值 + *+ */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WxTerminationContractResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 委托代扣协议ID + */ + @XStreamAlias("contractId") + private String contractId; + + /** + * 模板ID + */ + @XStreamAlias("plan_id") + private String planId; + + /** + * 签约协议号 + */ + @XStreamAlias("contract_code") + private String contractCode; + + + @Override + protected void loadXml(Document d) { + contractId = readXmlString(d, "contract_id"); + planId = readXmlString(d, "plan_id"); + contractCode = readXmlString(d, "contract_code"); + } + + @Override + public String toString() { + return WxGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java new file mode 100644 index 0000000000..87cbfd1b71 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxWithholdNotifyResult.java @@ -0,0 +1,234 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyCoupon; +import com.github.binarywang.wxpay.constant.WxPayConstants; +import com.github.binarywang.wxpay.converter.WxPayOrderNotifyResultConverter; +import com.github.binarywang.wxpay.exception.WxPayException; +import com.github.binarywang.wxpay.service.WxPayService; +import com.github.binarywang.wxpay.util.SignUtils; +import com.thoughtworks.xstream.XStream; +import com.thoughtworks.xstream.annotations.XStreamAlias; +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; +import me.chanjar.weixin.common.util.json.WxGsonBuilder; +import me.chanjar.weixin.common.util.xml.XStreamInitializer; +import org.w3c.dom.Document; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +/** + * @author chenliang + * @date 2021-08-02 5:09 下午 + * + *
+ * 微信代扣扣款回调结果 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class WxWithholdNotifyResult extends BaseWxPayResult { + + private static final long serialVersionUID = 1L; + + /** + * 设备号 + * 非必传 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + * 用户标识 + */ + @XStreamAlias("openid") + private String openId; + + /** + * 用户子标识 + * 非必传 + */ + @XStreamAlias("sub_openid") + private String subOpenId; + + /** + * 是否关注公众号 + * 非必传 + */ + @XStreamAlias("is_subscribe") + private String isSubscribe; + + /** + * 付款银行 + */ + @XStreamAlias("bank_type") + private String bankType; + + /** + * 总金额 + */ + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + * 货币类型 + * 非必传 + */ + @XStreamAlias("fee_type") + private String feeType; + + /** + * 现金支付金额 + */ + @XStreamAlias("cash_fee") + private Integer cashFee; + + /** + * 现金支付货币类型 + * 非必传 + */ + @XStreamAlias("cash_fee_type") + private String cashFeeType; + + /** + * 交易状态 + * SUCCESS : 支付成功,REFUND:转入退款,NOTPAY:未支付,CLOSED:已关闭,ACCEPT:已接收,PAY_FAIL:支付失败 + */ + @XStreamAlias("trade_state") + private String tradeState; + + /** + * 代金券或立减优惠金额 + * 非必传 + */ + @XStreamAlias("coupon_fee") + private Integer couponFee; + + /** + * 代金券或立减优惠使用数量 + */ + @XStreamAlias("coupon_count") + private Integer couponCount; + + private List
+ * 代扣订单查询结果 + *+ */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +@XStreamAlias("xml") +public class WxWithholdOrderQueryResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 设备号 + * 非必传 + */ + @XStreamAlias("device_info") + private String deviceInfo; + + /** + * 用户标识 + */ + @XStreamAlias("openid") + private String openId; + + /** + * 是否关注公众号 + * 非必传 + */ + @XStreamAlias("is_subscribe") + private String isSubscribe; + + /** + * 交易类型 + */ + @XStreamAlias("trade_type") + private String tradeType; + + /** + * 交易状态 + * SUCCESS : 支付成功,REFUND:转入退款,NOTPAY:未支付,CLOSED:已关闭,ACCEPT:已接收,PAY_FAIL:支付失败 + */ + @XStreamAlias("trade_state") + private String tradeState; + + /** + * 付款银行 + */ + @XStreamAlias("bank_type") + private String bankType; + + /** + * 总金额 + */ + @XStreamAlias("total_fee") + private Integer totalFee; + + /** + * 货币类型 + * 非必传 + */ + @XStreamAlias("fee_type") + private String feeType; + + /** + * 现金支付金额 + */ + @XStreamAlias("cash_fee") + private Integer cashFee; + + /** + * 现金支付货币类型 + * 非必传 + */ + @XStreamAlias("cash_fee_type") + private String cashFeeType; + + /** + * 代金券或立减优惠金额 + * 非必传 + */ + @XStreamAlias("coupon_fee") + private Integer couponFee; + + /** + * 代金券或立减优惠使用数量 + */ + @XStreamAlias("coupon_count") + private Integer couponCount; + + private List
+ * 委托扣款返回值 + *+ */ +@Data +@AllArgsConstructor +@NoArgsConstructor +public class WxWithholdResult extends BaseWxPayResult implements Serializable { + + private static final long serialVersionUID = 1L; + + + /** + * 临时字段 + */ + @XStreamAlias("temp") + private String temp; + + + @Override + protected void loadXml(Document d) { + temp = readXmlString(d, "temp"); + } + + @Override + public String toString() { + return WxGsonBuilder.create().toJson(this); + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java new file mode 100644 index 0000000000..be76b34c47 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxEntrustPapService.java @@ -0,0 +1,157 @@ +package com.github.binarywang.wxpay.service; + +import com.github.binarywang.wxpay.bean.request.*; +import com.github.binarywang.wxpay.bean.result.*; +import com.github.binarywang.wxpay.exception.WxPayException; + +/** + *
+ * 微信签约代扣相关接口. + * https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter2_8.shtml + *+ * + * @author chenliang + * @date 2021-08-02 4:50 下午 + */ +public interface WxEntrustPapService { + + /** + * + *
+ * 获取公众号纯签约链接, + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_1.shtml + * 该接口返回一个签约链接,该链接只能在微信内打开 + *+ * + * @param wxMpEntrustRequest + * @return + * @throws WxPayException + */ + String mpSign(WxMpEntrustRequest wxMpEntrustRequest) throws WxPayException; + + /** + * + *
+ * 获取小程序纯签约参数json + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_3.shtml + * 返回一个json 前端用来拉起一个新的签约小程序进行签约 + *+ * + * + * @param wxMaEntrustRequest + * @return + * @throws WxPayException + */ + String maSign(WxMaEntrustRequest wxMaEntrustRequest) throws WxPayException; + + /** + * + *
+ * 获取h5纯签约支付跳转链接 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_4.shtml + * 返回一个签约链接 在浏览器请求链接拉起微信 + *+ * + * @param wxH5EntrustRequest + * @return + * @throws WxPayException + */ + WxH5EntrustResult h5Sign(WxH5EntrustRequest wxH5EntrustRequest) throws WxPayException; + + /** + * + *
+ * 支付中签约 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_5.shtml + * 请求微信 若微信内请求 需要构造json返回, + * 若h5请求 直接使用mweb_url 链接即可拉起微信 + *+ * + * @param wxPayEntrustRequest + * @return + * @throws WxPayException + */ + WxPayEntrustResult paySign(WxPayEntrustRequest wxPayEntrustRequest) throws WxPayException; + + /** + * 申请扣款 + *
+ * 申请扣款 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_8.shtml + * 请求微信发起委托扣款,扣款额度和次数由使用的签约模板限制, + * 该扣款接口是立即扣款 无延时 扣款前无消息通知。 + * + * • 特殊情况:周期扣费为通知后24小时扣费方式情况下,如果用户为首次签约(包含解约后重新签约), + * 从用户签约成功时间开始算,商户在12小时内发起的扣款,会被立即执行,无延迟。商户超过12小时以后发起的扣款,都按24小时扣费规则执行 + *+ * + * @param wxWithholdRequest + * @return + * @throws WxPayException + */ + WxWithholdResult withhold(WxWithholdRequest wxWithholdRequest) throws WxPayException; + + /** + * 预扣费通知 + *
+ * 预扣费接口 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_10.shtml + * 商户进行委托代扣扣费前需要在可通知时间段内调用「预扣费通知」的接口为用户发送扣费提醒, + * 并设定扣费持续天数和预计扣费金额,经过扣费等待期后,在可扣费期内可发起扣费,扣款金额不能高于预计扣费金额, + * 扣费失败可主动发起重试扣费(重试次数由其他规则限制),直到扣费成功,或者可扣费期结束。 + * 商户只能在北京时间每天 6:00~22:00调用「预扣费通知」 + *+ * + * @param wxPreWithholdRequest + * @return + * @throws WxPayException + */ + String preWithhold(WxPreWithholdRequest wxPreWithholdRequest) throws WxPayException; + + /** + * 签约状态查询 + *
+ * 签约状态查询 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_7.shtml + * 查询签约关系接口提供单笔签约关系查询。 + *+ * + * @param wxSignQueryRequest + * @return + * @throws WxPayException + */ + WxSignQueryResult querySign(WxSignQueryRequest wxSignQueryRequest) throws WxPayException; + + + /** + * 申请解约 + *
+ * 申请解约 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter3_9.shtml + * 商户与用户的签约关系有误或者商户主动要求与用户解除之前的签约协议时可调用此接口完成解约。 + * 商户可以在商户后台(pay.weixin.qq.com)设置解约回调地址,当发生解约关系的时候,微信服务器会向此地址通知解约信息,内容与签约返回一致 + *+ * + * @param wxTerminatedContractRequest + * @return + * @throws WxPayException + */ + WxTerminationContractResult terminationContract(WxTerminatedContractRequest wxTerminatedContractRequest) throws WxPayException; + + /** + * + *
+ * 查询代扣订单 + * 详见:https://pay.weixin.qq.com/wiki/doc/api/wxpay_v2/papay/chapter4_5.shtml + * 该接口仅提供微信扣款服务申请扣款接口创建的订单进行查询,商户可以通过该接口主动查询微信代扣订单状态,完成下一步的业务逻辑。 + * ACCEPT等待扣款:为24小时延时扣费场景下独有的,当没有达到24小时前一直是这种状态; + * NOTPAY未支付:系统已经启动扣款流程,这个状态只是瞬间状态,很快会进入终态(SUCCESS、PAY_FAIL) + * + *+ * + * @param wxWithholdOrderQueryRequest + * @return + * @throws WxPayException + */ + WxWithholdOrderQueryResult papOrderQuery(WxWithholdOrderQueryRequest wxWithholdOrderQueryRequest) throws WxPayException; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index e11f65c139..9b42bd75be 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -173,6 +173,12 @@ public interface WxPayService { */ InputStream downloadV3(String url) throws WxPayException; + /** + * 获取微信签约代扣服务类 + * @return entrust service + */ + WxEntrustPapService getWxEntrustPapService(); + /** * 获取企业付款服务类. * diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 95919ed254..a80a7f4527 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -74,6 +74,8 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { private final MarketingMediaService marketingMediaService = new MarketingMediaServiceImpl(this); private final MarketingFavorService marketingFavorService = new MarketingFavorServiceImpl(this); private final MarketingBusiFavorService marketingBusiFavorService = new MarketingBusiFavorServiceImpl(this); + private final WxEntrustPapService wxEntrustPapService = new WxEntrustPapServiceImpl(this); + protected Map
* 字段名:是否指定分账
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java
index f8d13db88d..1b929ed96f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/CombineTransactionsResult.java
@@ -99,7 +99,7 @@ public class CombineTransactionsResult implements Serializable {
@Data
@NoArgsConstructor
- public static class SubOrders implements Serializable {
+ public static class SubOrders implements Serializable {
/**
*
* 字段名:子单商户号
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java
index 1b09ba6ffc..0ab6b526e7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FinishOrderRequest.java
@@ -10,8 +10,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_5.shtml
*
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java
index e53b480c3f..af1d77ad75 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBalanceResult.java
@@ -5,8 +5,8 @@
import lombok.NoArgsConstructor;
/**
- * @author: f00lish
- * @date: 2020/09/12
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
index 9ed6b20cfa..c47a9a045f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillRequest.java
@@ -8,8 +8,8 @@
/**
* 资金账单请求
*
- * @author: f00lish
- * @date: 2020/09/28
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
index b4a3ea45f6..54ab3a1653 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/FundBillResult.java
@@ -8,8 +8,8 @@
/**
* 资金账单结果
*
- * @author: f00lish
- * @date: 2020/09/28
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java
index a98d0c69e7..0222e7145a 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/PartnerTransactionsCloseRequest.java
@@ -8,8 +8,9 @@
/**
* 关闭普通订单请求
- * @author: f00lish
- * @date: 2020/12/09
+ *
+ * @author f00lish
+ * @date 2020/12/09
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java
index ab83cab033..1ae90c6b80 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingRequest.java
@@ -13,8 +13,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_1.shtml
*
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java
index 37ff86c25a..09cc3e843c 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ProfitSharingResult.java
@@ -9,8 +9,9 @@
/**
* 请求分账 结果响应
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java
index 68dfd3e004..3666b43195 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsRequest.java
@@ -1,10 +1,5 @@
package com.github.binarywang.wxpay.bean.ecommerce;
-/**
- * @author: f00lish
- * @date: 2020/09/17
- */
-
import com.google.gson.annotations.SerializedName;
import lombok.*;
@@ -12,11 +7,12 @@
/**
* 退款申请
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_1.shtml
* *
- * @author: f00lish
- * @date: 2020/09/14
+ *
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@Builder
@@ -156,7 +152,6 @@ public class RefundsRequest implements Serializable {
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public static class Amount implements Serializable {
-
private static final long serialVersionUID = 7383027142329410399L;
/**
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java
index 52eef53bfd..c83fdf4a5a 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/RefundsResult.java
@@ -1,8 +1,8 @@
package com.github.binarywang.wxpay.bean.ecommerce;
/**
- * @author: f00lish
- * @date: 2020/09/17
+ * @author f00lish
+ * @date 2020/09/17
*/
import com.google.gson.annotations.SerializedName;
@@ -14,11 +14,12 @@
/**
* 退款结果
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/refunds/chapter3_1.shtml
* *
- * @author: f00lish
- * @date: 2020/09/14
+ *
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java
index 1b6aeee801..6eec6d8f2f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersQueryRequest.java
@@ -7,17 +7,20 @@
/**
* 查询分账回退结果请求
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
* *
- * @author: wangrui
- * @date: 2021/02/20
+ *
+ * @author wangrui
+ * @date 2021/02/20
*/
@Data
@Builder
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class ReturnOrdersQueryRequest implements Serializable {
+ private static final long serialVersionUID = 4250796057341297359L;
+
/**
*
* 字段名:二级商户号
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java
index 957b1a8d63..6c0197b722 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersRequest.java
@@ -7,11 +7,12 @@
/**
* 请求分账回退
- * *
+ * *
* * 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/profitsharing/chapter3_3.shtml
* *
- * @author: f00lish
- * @date: 2020/09/14
+ *
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java
index f2110cc5d8..5655139d0f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/ReturnOrdersResult.java
@@ -8,8 +8,8 @@
/**
- * @author: f00lish
- * @date: 2020/09/14
+ * @author f00lish
+ * @date 2020/09/14
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java
index d4c02443aa..1165722bf9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SpWithdrawStatusResult.java
@@ -11,8 +11,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_6.shtml
*
- * @author: f00lish
- * @date: 2020/10/27
+ *
+ * @author f00lish
+ * @date 2020/10/27
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java
index 27d624872b..d76d4a5124 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/SubWithdrawStatusResult.java
@@ -11,8 +11,9 @@
*
* 文档地址:https://pay.weixin.qq.com/wiki/doc/apiv3/wxpay/ecommerce/fund/chapter3_3.shtml
*
- * @author: f00lish
- * @date: 2020/10/27
+ *
+ * @author f00lish
+ * @date 2020/10/27
*/
@Data
@NoArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
index 0a19894ed8..477c83aa38 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TradeBillResult.java
@@ -8,8 +8,8 @@
/**
* 交易账单结果
*
- * @author: f00lish
- * @date: 2020/09/28
+ * @author f00lish
+ * @date 2020/09/28
*/
@Data
@Builder
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java
index 12a22ead74..6bb04f9a63 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/TransactionsResult.java
@@ -69,7 +69,7 @@ public static class JsapiResult implements Serializable {
private String signType;
private String paySign;
- private String getSignStr(){
+ private String getSignStr() {
return String.format("%s\n%s\n%s\n%s\n", appId, timeStamp, nonceStr, packageValue);
}
}
@@ -86,10 +86,10 @@ public static class AppResult implements Serializable {
}
- public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, PrivateKey privateKey){
+ public T getPayInfo(TradeTypeEnum tradeType, String appId, String mchId, PrivateKey privateKey) {
String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
String nonceStr = SignUtils.genRandomStr();
- switch (tradeType){
+ switch (tradeType) {
case JSAPI:
JsapiResult jsapiResult = new JsapiResult();
jsapiResult.setAppId(appId).setTimeStamp(timestamp)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
index 72aff3a02b..a5058e2ba7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/FundBillTypeEnum.java
@@ -5,8 +5,9 @@
/**
* 账单类型
- * @author: f00lish
- * @date: 2020/09/28
+ *
+ * @author f00lish
+ * @date 2020/09/28
*/
@Getter
@AllArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java
index 2d7067804e..aa53db6c39 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/ecommerce/enums/SpAccountTypeEnum.java
@@ -5,8 +5,9 @@
/**
* 服务商账户类型
- * @author: f00lish
- * @date: 2020/09/12
+ *
+ * @author f00lish
+ * @date 2020/09/12
*/
@Getter
@AllArgsConstructor
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java
index 37c0d038dd..193c5293f7 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/entwxpay/EntWxEmpPayRequest.java
@@ -20,6 +20,7 @@
@AllArgsConstructor
@XStreamAlias("xml")
public class EntWxEmpPayRequest extends BaseWxPayRequest {
+ private static final long serialVersionUID = -3677217123742740648L;
/**
*
From 614a1c923ecc9a318a035003c420562a41c3789f Mon Sep 17 00:00:00 2001
From: liming1019
Date: Wed, 18 Aug 2021 10:52:16 +0800
Subject: [PATCH 0014/1263] =?UTF-8?q?:new:=20#2261=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E5=86=85=E5=AE=B9?=
=?UTF-8?q?=E5=AE=89=E5=85=A8=E6=8E=A5=E5=8F=A3=EF=BC=88=E5=85=BC=E5=AE=B9?=
=?UTF-8?q?2.0=E7=89=88=E6=9C=AC=EF=BC=89?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../WxMinishopImageUploadCustomizeResult.java | 5 +-
...inishopUploadRequestCustomizeExecutor.java | 12 ++--
...opMediaUploadRequestCustomizeExecutor.java | 5 +-
...opMediaUploadRequestCustomizeExecutor.java | 4 +-
...opMediaUploadRequestCustomizeExecutor.java | 4 +-
.../wx/miniapp/api/WxMaSecCheckService.java | 13 ++++
.../wx/miniapp/api/WxMaShopImgService.java | 11 +++
.../api/impl/WxMaSecCheckServiceImpl.java | 16 +++++
.../api/impl/WxMaShopImgServiceImpl.java | 9 ++-
.../wx/miniapp/bean/WxMaBaseResponse.java | 32 +++++++++
.../security/WxMaMsgSecCheckCheckRequest.java | 37 ++++++++++
.../WxMaMsgSecCheckCheckResponse.java | 72 +++++++++++++++++++
.../api/impl/WxMaSecCheckServiceImplTest.java | 14 ++++
.../api/impl/WxMaShopImgServiceImplTest.java | 7 ++
14 files changed, 227 insertions(+), 14 deletions(-)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
index e3077fd00a..515189e469 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/bean/result/WxMinishopImageUploadCustomizeResult.java
@@ -21,12 +21,13 @@ public static WxMinishopImageUploadCustomizeResult fromJson(String json) {
if (result.getErrcode().equals("0")) {
WxMinishopPicFileCustomizeResult picFileResult = new WxMinishopPicFileCustomizeResult();
JsonObject picObject = jsonObject.get("img_info").getAsJsonObject();
- picFileResult.setMediaId(picObject.get("media_id").getAsString());
+ if (picObject.has("media_id")) {
+ picFileResult.setMediaId(picObject.get("media_id").getAsString());
+ }
if (picObject.has("temp_img_url")) {
picFileResult.setTempImgUrl(picObject.get("temp_img_url").getAsString());
}
result.setImgInfo(picFileResult);
-
}
return result;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
index d782466c3b..23309202d7 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/MinishopUploadRequestCustomizeExecutor.java
@@ -12,9 +12,11 @@
public abstract class MinishopUploadRequestCustomizeExecutor implements RequestExecutor {
protected RequestHttp requestHttp;
+ protected String respType;
- public MinishopUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
+ public MinishopUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
this.requestHttp = requestHttp;
+ this.respType = respType;
}
@Override
@@ -22,14 +24,14 @@ public void execute(String uri, File data, ResponseHandler create(RequestHttp requestHttp) {
+ public static RequestExecutor create(RequestHttp requestHttp, String respType) {
switch (requestHttp.getRequestType()) {
case APACHE_HTTP:
- return new ApacheMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ return new ApacheMinishopMediaUploadRequestCustomizeExecutor(requestHttp, respType);
case JODD_HTTP:
- return new JoddHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ return new JoddHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp, respType);
case OK_HTTP:
- return new OkHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp);
+ return new OkHttpMinishopMediaUploadRequestCustomizeExecutor(requestHttp, respType);
default:
return null;
}
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
index dc38fbae5a..64888c08d6 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheMinishopMediaUploadRequestCustomizeExecutor.java
@@ -24,8 +24,8 @@
*/
@Slf4j
public class ApacheMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
- public ApacheMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
- super(requestHttp);
+ public ApacheMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
+ super(requestHttp, respType);
}
@Override
@@ -39,6 +39,7 @@ public WxMinishopImageUploadCustomizeResult execute(String uri, File file, WxTyp
HttpEntity entity = MultipartEntityBuilder
.create()
.addBinaryBody("media", file)
+ .addTextBody("resp_type", this.respType)
.setMode(HttpMultipartMode.RFC6532)
.build();
httpPost.setEntity(entity);
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
index 8fa1de4279..a79eb8eda5 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/jodd/JoddHttpMinishopMediaUploadRequestCustomizeExecutor.java
@@ -22,8 +22,8 @@
*/
@Slf4j
public class JoddHttpMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
- public JoddHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
- super(requestHttp);
+ public JoddHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
+ super(requestHttp, respType);
}
@Override
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
index 8b2cdc7b6c..45d112cd6c 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/okhttp/OkHttpMinishopMediaUploadRequestCustomizeExecutor.java
@@ -18,8 +18,8 @@
*/
@Slf4j
public class OkHttpMinishopMediaUploadRequestCustomizeExecutor extends MinishopUploadRequestCustomizeExecutor {
- public OkHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp) {
- super(requestHttp);
+ public OkHttpMinishopMediaUploadRequestCustomizeExecutor(RequestHttp requestHttp, String respType) {
+ super(requestHttp, respType);
}
@Override
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
index 50e03b30d6..8b135adcdf 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaSecCheckService.java
@@ -1,6 +1,8 @@
package cn.binarywang.wx.miniapp.api;
import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse;
import me.chanjar.weixin.common.error.WxErrorException;
import java.io.File;
@@ -55,6 +57,17 @@ public interface WxMaSecCheckService {
boolean checkMessage(String msgString) throws WxErrorException;
+ /**
+ *
+ * 检查一段文本是否含有违法违规内容(新版本接口,主要是request和response做了参数优化)
+ * 详情请见: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/sec-check/security.msgSecCheck.html
+ *
+ * @param msgRequest
+ * @return WxMaMsgSecCheckCheckResponse
+ * @throws WxErrorException
+ */
+ WxMaMsgSecCheckCheckResponse checkMessage(WxMaMsgSecCheckCheckRequest msgRequest) throws WxErrorException;
+
/**
*
* 异步校验图片/音频是否含有违法违规内容。
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
index c44bc7df35..2cb9334fc2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopImgService.java
@@ -14,8 +14,19 @@ public interface WxMaShopImgService {
/**
* 上传图片
*
+ * @param file
* @return WxMinishopImageUploadCustomizeResult
* @throws WxErrorException
*/
WxMinishopImageUploadCustomizeResult uploadImg(File file) throws WxErrorException;
+
+ /**
+ * 上传图片,带respType参数
+ *
+ * @param file
+ * @param respType
+ * @return WxMinishopImageUploadCustomizeResult
+ * @throws WxErrorException
+ */
+ WxMinishopImageUploadCustomizeResult uploadImg(File file, String respType) throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
index fbff2f3203..332a47ad7a 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImpl.java
@@ -3,12 +3,17 @@
import cn.binarywang.wx.miniapp.api.WxMaSecCheckService;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaMediaAsyncCheckResult;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
import com.google.gson.JsonObject;
import lombok.RequiredArgsConstructor;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
+import me.chanjar.weixin.common.enums.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
+import me.chanjar.weixin.common.util.json.GsonParser;
import org.apache.commons.io.FileUtils;
import java.io.File;
@@ -16,6 +21,7 @@
import java.net.URL;
import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.SecCheck.*;
+import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ERRCODE;
/**
*
@@ -59,6 +65,16 @@ public boolean checkMessage(String msgString) throws WxErrorException {
return true;
}
+ @Override
+ public WxMaMsgSecCheckCheckResponse checkMessage(WxMaMsgSecCheckCheckRequest msgRequest) throws WxErrorException {
+ String response = this.service.post(MSG_SEC_CHECK_URL, msgRequest);
+ JsonObject jsonObject = GsonParser.parse(response);
+ if (jsonObject.get(ERRCODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(response, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(response, WxMaMsgSecCheckCheckResponse.class);
+ }
+
@Override
public WxMaMediaAsyncCheckResult mediaCheckAsync(String mediaUrl, int mediaType)
throws WxErrorException {
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
index f253bca280..1c69f8dc80 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImpl.java
@@ -23,7 +23,14 @@ public class WxMaShopImgServiceImpl implements WxMaShopImgService {
@Override
public WxMinishopImageUploadCustomizeResult uploadImg(File file) throws WxErrorException {
WxMinishopImageUploadCustomizeResult result = this.service.execute(
- MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp()), IMG_UPLOAD, file);
+ MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp(), "0"), IMG_UPLOAD, file);
+ return result;
+ }
+
+ @Override
+ public WxMinishopImageUploadCustomizeResult uploadImg(File file, String respType) throws WxErrorException {
+ WxMinishopImageUploadCustomizeResult result = this.service.execute(
+ MinishopUploadRequestCustomizeExecutor.create(this.service.getRequestHttp(), respType), IMG_UPLOAD, file);
return result;
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java
new file mode 100644
index 0000000000..a0f524d324
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/WxMaBaseResponse.java
@@ -0,0 +1,32 @@
+package cn.binarywang.wx.miniapp.bean;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ * @date 2021/8/17
+ */
+@Data
+public class WxMaBaseResponse implements Serializable {
+ private static final long serialVersionUID = 3932406255203539965L;
+ /**
+ * 错误码
+ *
+ * 是否必填:
+ *
+ */
+ @SerializedName("errcode")
+ private Integer errcode;
+
+ /**
+ * 错误信息
+ *
+ * 是否必填:
+ *
+ */
+ @SerializedName("errmsg")
+ private String errmsg;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java
new file mode 100644
index 0000000000..2379f14b3c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckRequest.java
@@ -0,0 +1,37 @@
+package cn.binarywang.wx.miniapp.bean.security;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author liming1019
+ */
+@Data
+@Builder
+public class WxMaMsgSecCheckCheckRequest implements Serializable {
+ private static final long serialVersionUID = 3233176903681625506L;
+
+ @SerializedName("version")
+ private String version;
+
+ @SerializedName("openid")
+ private String openid;
+
+ @SerializedName("scene")
+ private Integer scene;
+
+ @SerializedName("content")
+ private String content;
+
+ @SerializedName("nickname")
+ private String nickname;
+
+ @SerializedName("title")
+ private String title;
+
+ @SerializedName("signature")
+ private String signature;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java
new file mode 100644
index 0000000000..6e6a93afe3
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/security/WxMaMsgSecCheckCheckResponse.java
@@ -0,0 +1,72 @@
+package cn.binarywang.wx.miniapp.bean.security;
+
+import cn.binarywang.wx.miniapp.bean.WxMaBaseResponse;
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author liming1019
+ */
+@Data
+@Builder
+public class WxMaMsgSecCheckCheckResponse extends WxMaBaseResponse implements Serializable {
+ private static final long serialVersionUID = 1903247824980080974L;
+ /**
+ * result : {"suggest":"risky","label":20001}
+ * detail : [{"strategy":"content_model","errcode":0,"suggest":"risky","label":20006,"prob":90},{"strategy":"keyword","errcode":0,"suggest":"pass","label":20006,"level":20,"keyword":"命中的关键词1"},{"strategy":"keyword","errcode":0,"suggest":"risky","label":20006,"level":90,"keyword":"命中的关键词2"}]
+ * trace_id : 60ae120f-371d5872-7941a05b
+ */
+ @SerializedName("result")
+ private ResultBean result;
+ @SerializedName("trace_id")
+ private String traceId;
+ @SerializedName("detail")
+ private List detail;
+
+ @Data
+ @Builder
+ public static class ResultBean implements Serializable {
+ /**
+ * suggest : risky
+ * label : 20001
+ */
+
+ @SerializedName("suggest")
+ private String suggest;
+ @SerializedName("label")
+ private String label;
+ }
+
+ @Data
+ @Builder
+ public static class DetailBean implements Serializable {
+ /**
+ * strategy : content_model
+ * errcode : 0
+ * suggest : risky
+ * label : 20006
+ * prob : 90
+ * level : 20
+ * keyword : 命中的关键词1
+ */
+
+ @SerializedName("strategy")
+ private String strategy;
+ @SerializedName("errcode")
+ private Integer errcode;
+ @SerializedName("suggest")
+ private String suggest;
+ @SerializedName("label")
+ private String label;
+ @SerializedName("prob")
+ private Integer prob;
+ @SerializedName("level")
+ private String level;
+ @SerializedName("keyword")
+ private String keyword;
+ }
+}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
index 19bca1ca4f..f55ce9c487 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaSecCheckServiceImplTest.java
@@ -2,6 +2,8 @@
import java.io.File;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckRequest;
+import cn.binarywang.wx.miniapp.bean.security.WxMaMsgSecCheckCheckResponse;
import org.testng.annotations.*;
import cn.binarywang.wx.miniapp.api.WxMaService;
@@ -49,4 +51,16 @@ public void testCheckMessage(String msg, boolean result) throws WxErrorException
.checkMessage(msg))
.isEqualTo(result);
}
+
+ @Test(dataProvider = "secData")
+ public void testCheckMessage2(String msg, boolean result) throws WxErrorException {
+ WxMaMsgSecCheckCheckRequest request = WxMaMsgSecCheckCheckRequest.builder()
+ .content(msg)
+ .scene(1)
+ .version("2")
+ .openid("xxx")
+ .build();
+ WxMaMsgSecCheckCheckResponse response = this.wxService.getSecCheckService().checkMessage(request);
+ assertThat(response).isNotNull();
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
index 191b429630..060896ab09 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopImgServiceImplTest.java
@@ -28,4 +28,11 @@ public void testUploadImg() throws WxErrorException {
WxMinishopImageUploadCustomizeResult result = wxService.getShopImgService().uploadImg(file);
assertThat(result).isNotNull();
}
+
+ @Test
+ public void testUploadImg2() throws WxErrorException {
+ File file = new File("/Users/liming/Desktop/test.jpeg");
+ WxMinishopImageUploadCustomizeResult result = wxService.getShopImgService().uploadImg(file, "1");
+ assertThat(result).isNotNull();
+ }
}
From 28b2ca93fb4c3f6db581d3195d0a25683ef53d3f Mon Sep 17 00:00:00 2001
From: ShienPro <19704239+ShienPro@users.noreply.github.com>
Date: Thu, 19 Aug 2021 10:56:34 +0800
Subject: [PATCH 0015/1263] =?UTF-8?q?:new:=20#2260=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E8=87=AA=E5=AE=9A?=
=?UTF-8?q?=E4=B9=89=E7=BB=84=E4=BB=B6=E4=B9=8B=E6=92=A4=E9=94=80=E5=95=86?=
=?UTF-8?q?=E5=93=81=E5=AE=A1=E6=A0=B8=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaShopSpuService.java | 3 +++
.../api/impl/WxMaShopSpuServiceImpl.java | 24 ++++++++++++-------
.../miniapp/constant/WxMaApiUrlConstants.java | 1 +
3 files changed, 19 insertions(+), 9 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java
index 183d239670..c896f7eaf5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShopSpuService.java
@@ -35,4 +35,7 @@ WxMaShopBaseResponse listingSpu(Integer productId, String outProductId)
WxMaShopBaseResponse delistingSpu(Integer productId, String outProductId)
throws WxErrorException;
+
+ WxMaShopBaseResponse deleteAudit(Integer productId, String outProductId)
+ throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java
index 4be695a075..94b779c6c9 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopSpuServiceImpl.java
@@ -1,14 +1,5 @@
package cn.binarywang.wx.miniapp.api.impl;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_ADD_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_DELISTING_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_DEL_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_GET_LIST_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_GET_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_LISTING_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_UPDATE_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.SPU_UPDATE_WITHOUT_URL;
-
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.api.WxMaShopSpuService;
import cn.binarywang.wx.miniapp.bean.shop.WxMaShopSpuInfo;
@@ -28,6 +19,8 @@
import me.chanjar.weixin.common.util.json.GsonHelper;
import me.chanjar.weixin.common.util.json.GsonParser;
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Shop.Spu.*;
+
/**
* @author boris
*/
@@ -131,4 +124,17 @@ public WxMaShopBaseResponse delistingSpu(Integer productId, String outProductId)
}
return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
}
+
+ @Override
+ public WxMaShopBaseResponse deleteAudit(Integer productId, String outProductId)
+ throws WxErrorException {
+ String responseContent = this.wxMaService
+ .post(DEL_AUDIT_URL, GsonHelper.buildJsonObject("product_id", productId,
+ "out_product_id", outProductId));
+ JsonObject jsonObject = GsonParser.parse(responseContent);
+ if (jsonObject.get(ERR_CODE).getAsInt() != 0) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return WxMaGsonBuilder.create().fromJson(responseContent, WxMaShopBaseResponse.class);
+ }
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 28a38a1f20..f65fceaaa8 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -311,6 +311,7 @@ interface Spu {
String SPU_UPDATE_WITHOUT_URL = "https://api.weixin.qq.com/shop/spu/update_without_audit";
String SPU_LISTING_URL = "https://api.weixin.qq.com/shop/spu/listing";
String SPU_DELISTING_URL = "https://api.weixin.qq.com/shop/spu/delisting";
+ String DEL_AUDIT_URL = "https://api.weixin.qq.com/shop/spu/del_audit";
}
interface Order {
From 9531df80679724d82d45f66fde37ee73ac8c1dc4 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Thu, 19 Aug 2021 16:51:40 +0800
Subject: [PATCH 0016/1263] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 2386cce594..8f0a4f95b6 100644
--- a/README.md
+++ b/README.md
@@ -126,6 +126,7 @@
- 未来信封
- 5G惠享
- 生菜wordpress转小程序
+- 丽日购
#### 公众号:
- 中国电信上海网厅(sh_189)
From 373aa777c7ad546ac65d10f861839ef6a87eed9f Mon Sep 17 00:00:00 2001
From: ifhelen <34478773+ifhelen@users.noreply.github.com>
Date: Mon, 23 Aug 2021 22:12:11 +0800
Subject: [PATCH 0017/1263] =?UTF-8?q?:art:=20#2271=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=BA=94=E7=94=A8=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E5=8F=91=E9=80=81=E6=8E=A5=E5=8F=A3=E8=BF=94=E5=9B=9E?=
=?UTF-8?q?=E7=B1=BB=E5=A2=9E=E5=8A=A0=E6=B6=88=E6=81=AFid=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5=EF=BC=8C=E7=94=A8=E4=BA=8E=E6=92=A4=E5=9B=9E=E5=BA=94?=
=?UTF-8?q?=E7=94=A8=E6=B6=88=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java
index fa1db1065e..4c41d631b4 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessageSendResult.java
@@ -44,7 +44,9 @@ public static WxCpMessageSendResult fromJson(String json) {
@SerializedName("invalidtag")
private String invalidTag;
-
+
+ @SerializedName("msgid")
+ private String msgId;
public List getInvalidUserList() {
return this.content2List(this.invalidUser);
From 226c2af5a17735477a1468701e980e1047a16017 Mon Sep 17 00:00:00 2001
From: huangxm129 <40385667+huangxm129@users.noreply.github.com>
Date: Mon, 23 Aug 2021 22:16:46 +0800
Subject: [PATCH 0018/1263] =?UTF-8?q?:art:=E3=80=90=E4=BC=81=E4=B8=9A?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E6=94=B9=E6=9F=A5=E8=AF=A2?=
=?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=8E=A5=E6=9B=BF=E7=8A=B6=E6=80=81=E6=9C=AA?=
=?UTF-8?q?=E6=8E=A5=E5=8F=97customer=E6=95=B0=E6=8D=AE=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/bean/external/WxCpUserTransferResultResp.java | 3 +++
1 file changed, 3 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
index 064c6c3851..53380b55a3 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/WxCpUserTransferResultResp.java
@@ -7,6 +7,7 @@
import me.chanjar.weixin.cp.util.json.WxCpGsonBuilder;
import java.io.Serializable;
+import java.util.List;
/**
* 在职成员的客户转接情况
@@ -21,6 +22,8 @@ public class WxCpUserTransferResultResp extends WxCpBaseResp {
@SerializedName("next_cursor")
private String nextCursor;
+ private List customer;
+
public static WxCpUserTransferResultResp fromJson(String json) {
return WxCpGsonBuilder.create().fromJson(json, WxCpUserTransferResultResp.class);
}
From b65783bd726f469955db99df08cf8ee510d1d4d7 Mon Sep 17 00:00:00 2001
From: liming1019
Date: Mon, 23 Aug 2021 22:18:25 +0800
Subject: [PATCH 0019/1263] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=AE=A2?=
=?UTF-8?q?=E6=88=B7=E7=AB=AF=E5=9C=A8=E4=BD=BF=E7=94=A8Request=E5=AF=B9?=
=?UTF-8?q?=E8=B1=A1=E6=97=B6=E7=94=B1lombok=E6=B3=A8=E8=A7=A3=E5=BC=95?=
=?UTF-8?q?=E5=8F=91=E7=9A=84=E9=94=99=E8=AF=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../request/WxMaShopAfterSaleAddRequest.java | 6 ++++++
.../request/WxMaShopAfterSaleGetRequest.java | 4 ++++
.../request/WxMaShopAfterSaleUpdateRequest.java | 4 ++++
.../shop/request/WxMaShopAuditBrandRequest.java | 8 ++++++++
.../request/WxMaShopAuditCategoryRequest.java | 6 ++++++
.../request/WxMaShopDeliveryRecieveRequest.java | 4 ++++
.../request/WxMaShopDeliverySendRequest.java | 6 ++++++
.../impl/WxMaShopAfterSaleServiceImplTest.java | 16 ++++++++--------
.../impl/WxMaShopDeliveryServiceImplTest.java | 11 +++++------
9 files changed, 51 insertions(+), 14 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
index 9f9c13e988..47c33f1ae7 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleAddRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAfterSaleAddRequest implements Serializable {
private static final long serialVersionUID = 6652525413062887786L;
@@ -52,6 +56,8 @@ public class WxMaShopAfterSaleAddRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class ProductInfosBean implements Serializable {
/**
* out_product_id : 234245
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
index 31afee26ce..fdad13ebb0 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleGetRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -12,6 +14,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAfterSaleGetRequest implements Serializable {
private static final long serialVersionUID = -1275475147400719521L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
index 8bbeadb1af..d208b239e2 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAfterSaleUpdateRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -12,6 +14,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAfterSaleUpdateRequest implements Serializable {
private static final long serialVersionUID = 2712027510252221370L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
index fec5e3ee57..f589f503f5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditBrandRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAuditBrandRequest implements Serializable {
private static final long serialVersionUID = -969331692973992066L;
@@ -25,6 +29,8 @@ public class WxMaShopAuditBrandRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class AuditReqBean implements Serializable {
/**
* license : ["https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg"]
@@ -38,6 +44,8 @@ public static class AuditReqBean implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class BrandInfoBean implements Serializable {
/**
* brand_audit_type : 1
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
index 8fe40176c4..300c77db78 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopAuditCategoryRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopAuditCategoryRequest implements Serializable {
private static final long serialVersionUID = -6730876344556487071L;
@@ -25,6 +29,8 @@ public class WxMaShopAuditCategoryRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class AuditReqBean implements Serializable {
/**
* license : ["www.xxxxx.com"]
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
index 50ef7a63ef..bbf896626d 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliveryRecieveRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
@@ -12,6 +14,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopDeliveryRecieveRequest implements Serializable {
private static final long serialVersionUID = 1540854758624081221L;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
index 6636b64055..bf8acced5e 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/request/WxMaShopDeliverySendRequest.java
@@ -1,8 +1,10 @@
package cn.binarywang.wx.miniapp.bean.shop.request;
import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
+import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.util.List;
@@ -13,6 +15,8 @@
*/
@Data
@Builder
+@NoArgsConstructor
+@AllArgsConstructor
public class WxMaShopDeliverySendRequest implements Serializable {
private static final long serialVersionUID = -4034672301224469057L;
@@ -37,6 +41,8 @@ public class WxMaShopDeliverySendRequest implements Serializable {
@Data
@Builder
+ @NoArgsConstructor
+ @AllArgsConstructor
public static class DeliveryListBean implements Serializable {
/**
* delivery_id : SF
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
index 3d38d82e01..75538a1510 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAfterSaleServiceImplTest.java
@@ -29,19 +29,19 @@ public class WxMaShopAfterSaleServiceImplTest {
@Test
public void testAdd() throws WxErrorException {
WxMaShopAfterSaleAddRequest.ProductInfosBean productInfosBean = WxMaShopAfterSaleAddRequest.ProductInfosBean.builder()
- .outProductId("234245")
- .outSkuId("23424")
- .productCnt(5)
+ .outProductId("19030")
+ .outSkuId("123266")
+ .productCnt(1)
.build();
WxMaShopAfterSaleAddRequest request = WxMaShopAfterSaleAddRequest.builder()
- .outOrderId("xxxxx")
- .outAftersaleId("xxxxxx")
- .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
+ .outOrderId("318070290792415232X")
+ .outAftersaleId("318092069606883328X")
+ .openid("odIi15CuQ0IQviqsnUMy6CKNetrMX")
.type(1)
- .createTime("2020-12-01 00:00:00")
+ .createTime("2021-08-20 00:00:00")
.status(1)
.finishAllAftersale(0)
- .path("/pages/aftersale.html?out_aftersale_id=xxxxx")
+ .path("/pages/aftersale.html?out_aftersale_id=318092069606883328X")
.refund(100L)
.productInfos(new ArrayList<>(Arrays.asList(productInfosBean)))
.build();
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
index e19a9c0862..ab27cbdeb7 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopDeliveryServiceImplTest.java
@@ -34,14 +34,13 @@ public void testGetCompanyList() throws WxErrorException {
@Test
public void testSend() throws WxErrorException {
WxMaShopDeliverySendRequest.DeliveryListBean deliveryListBean = WxMaShopDeliverySendRequest.DeliveryListBean.builder()
- .deliveryId("SF")
- .waybillId("23424324253")
+ .deliveryId("ZTO")
+ .waybillId("73164691843558")
.build();
WxMaShopDeliverySendRequest request = WxMaShopDeliverySendRequest.builder()
- .orderId(123456L)
- .outOrderId("xxxxx")
- .openid("oTVP50O53a7jgmawAmxKukNlq3XI")
- .finishAllDelivery(0)
+ .outOrderId("318070290792415232")
+ .openid("odIi15CuQ0IQviqsnUMy6CKNetrM")
+ .finishAllDelivery(1)
.deliveryList(new ArrayList<>(Arrays.asList(deliveryListBean)))
.build();
WxMaShopBaseResponse response = wxService.getShopDeliveryService().send(request);
From 28156fcb3a2501d2f4912348e5c53e9b337dee86 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 23 Aug 2021 22:34:33 +0800
Subject: [PATCH 0020/1263] =?UTF-8?q?:art:=20#2272=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=8F=91=E9=80=81=E6=96=B0?=
=?UTF-8?q?=E5=AE=A2=E6=88=B7=E6=AC=A2=E8=BF=8E=E8=AF=AD=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=AF=B9file=E6=96=87=E4=BB=B6=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/bean/external/msg/Attachment.java | 52 ++++++-------------
.../weixin/cp/bean/external/msg/File.java | 18 +++++++
.../weixin/cp/constant/WxCpConsts.java | 5 ++
3 files changed, 38 insertions(+), 37 deletions(-)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
index 0c64b9bf63..7dce73ad03 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/Attachment.java
@@ -1,10 +1,15 @@
package me.chanjar.weixin.cp.bean.external.msg;
import com.google.gson.annotations.SerializedName;
+import lombok.Data;
import me.chanjar.weixin.cp.constant.WxCpConsts;
import java.io.Serializable;
+/**
+ * @author chutian0124
+ */
+@Data
public class Attachment implements Serializable {
private static final long serialVersionUID = -8078748379570640198L;
@@ -15,62 +20,35 @@ public class Attachment implements Serializable {
private Link link;
- private MiniProgram miniprogram;
+ @SerializedName("miniprogram")
+ private MiniProgram miniProgram;
private Video video;
- @Override
- public String toString() {
- return "Attachment{" +
- "msgType='" + msgType + '\'' +
- ", image=" + image +
- ", link=" + link +
- ", miniprogram=" + miniprogram +
- ", video=" + video +
- '}';
- }
-
- private String getMsgType() {
- return msgType;
- }
-
- private void setMsgType(String msgType) {
- this.msgType = msgType;
- }
-
- public Image getImage() {
- return image;
- }
+ private File file;
public void setImage(Image image) {
this.image = image;
this.msgType = WxCpConsts.WelcomeMsgType.IMAGE;
}
- public Link getLink() {
- return link;
- }
-
public void setLink(Link link) {
this.link = link;
this.msgType = WxCpConsts.WelcomeMsgType.LINK;
}
- public MiniProgram getMiniprogram() {
- return miniprogram;
- }
-
- public void setMiniprogram(MiniProgram miniprogram) {
- this.miniprogram = miniprogram;
+ public void setMiniProgram(MiniProgram miniProgram) {
+ this.miniProgram = miniProgram;
this.msgType = WxCpConsts.WelcomeMsgType.MINIPROGRAM;
}
- public Video getVideo() {
- return video;
- }
-
public void setVideo(Video video) {
this.video = video;
this.msgType = WxCpConsts.WelcomeMsgType.VIDEO;
}
+
+ public void setFile(File file ) {
+ this.file = file;
+ this.msgType = WxCpConsts.WelcomeMsgType.FILE;
+ }
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java
new file mode 100644
index 0000000000..a9726322e6
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/external/msg/File.java
@@ -0,0 +1,18 @@
+package me.chanjar.weixin.cp.bean.external.msg;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @author Binary Wang
+ * @date 2021-08-23
+ */
+@Data
+public class File implements Serializable {
+ private static final long serialVersionUID = 2794189478198329090L;
+
+ @SerializedName("media_id")
+ private String mediaId;
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
index 69db78efbe..601c7dbb30 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpConsts.java
@@ -353,5 +353,10 @@ public static class WelcomeMsgType {
* 小程序消息.
*/
public static final String MINIPROGRAM = "miniprogram";
+
+ /**
+ * 文件消息.
+ */
+ public static final String FILE = "file";
}
}
From af212bd68fefdb8f41d86d60be33e5ee68056cc1 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 23 Aug 2021 23:11:53 +0800
Subject: [PATCH 0021/1263] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.7.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index fb5ad2f91b..7acba77d54 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 3209761d7e..ce755fd86c 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 5905faf7ca..522dd844be 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 14706dc8f3..7e47cbe62d 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 2bd024114e..1a1e8a67e2 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 501594d231..391f2d48de 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 1cd2e60f68..08d82ac1f8 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index e22af0eba2..5fa142ec70 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index e9ecbcb0cd..f197d9efe5 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 45477235b7..c836d6d2e0 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 51f89785f4..2edd2fce79 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 92494bb955..6c93330117 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index 68e94348dd..c76fd9136d 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index b7b2247bfe..ceb69a1ba3 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 2be86f12b6..c39fa67ddf 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.6.B
+ 4.1.7.B
weixin-java-qidian
From 159471c9cb8c1e6b6613b1dc666c82a2f2dce531 Mon Sep 17 00:00:00 2001
From: 721806280 <33091348+721806280@users.noreply.github.com>
Date: Wed, 25 Aug 2021 15:13:21 +0800
Subject: [PATCH 0022/1263] :art: Update pom.xml
---
pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/pom.xml b/pom.xml
index 7acba77d54..73dfc916ab 100644
--- a/pom.xml
+++ b/pom.xml
@@ -175,7 +175,7 @@
com.thoughtworks.xstream
xstream
- 1.4.17
+ 1.4.18
com.google.guava
From 2a36ebf45fc332fee57a314140927da3b0d4f181 Mon Sep 17 00:00:00 2001
From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com>
Date: Mon, 30 Aug 2021 16:49:29 +0800
Subject: [PATCH 0023/1263] :arrow_up: Bump xstream in /others/weixin-java-osgi
(#2280)
Bumps [xstream](https://github.com/x-stream/xstream) from 1.4.17 to 1.4.18.
- [Release notes](https://github.com/x-stream/xstream/releases)
- [Commits](https://github.com/x-stream/xstream/commits)
---
updated-dependencies:
- dependency-name: com.thoughtworks.xstream:xstream
dependency-type: direct:production
...
Signed-off-by: dependabot[bot]
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
---
others/weixin-java-osgi/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/others/weixin-java-osgi/pom.xml b/others/weixin-java-osgi/pom.xml
index 28826b5df3..7207e9b99d 100644
--- a/others/weixin-java-osgi/pom.xml
+++ b/others/weixin-java-osgi/pom.xml
@@ -28,7 +28,7 @@
com.thoughtworks.xstream
xstream
- 1.4.17
+ 1.4.18
provided
From 59a1456799d0c3aff5b3ab136f648ac0a96b944e Mon Sep 17 00:00:00 2001
From: ArBing
Date: Sun, 5 Sep 2021 16:03:37 +0800
Subject: [PATCH 0024/1263] =?UTF-8?q?:new:=20#2298=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E6=9C=8D?=
=?UTF-8?q?=E5=8A=A1=E5=95=86=E6=A8=A1=E5=BC=8F=E5=A4=96=E9=83=A8=E8=81=94?=
=?UTF-8?q?=E7=B3=BB=E4=BA=BAunionid=E8=BD=AC=E6=8D=A2=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 23 +++++++++++++++++++
.../impl/WxCpExternalContactServiceImpl.java | 10 ++++++++
.../weixin/cp/constant/WxCpApiPathConsts.java | 1 +
3 files changed, 34 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index 0f06a9adba..c7507d656d 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -159,6 +159,29 @@ public interface WxCpExternalContactService {
*/
String convertToOpenid(String externalUserid) throws WxErrorException;
+ /**
+ * 服务商为企业代开发微信小程序的场景,服务商可通过此接口,将微信客户的unionid转为external_userid。
+ *
+ *
+ * 文档地址:https://work.weixin.qq.com/api/doc/90001/90143/93274
+ *
+ * 服务商代开发小程序指企业使用的小程序为企业主体的,非服务商主体的小程序。
+ * 场景:企业客户在微信端从企业主体的小程序(非服务商应用)登录,同时企业在企业微信安装了服务商的第三方应用,服务商可以调用该接口将登录用户的unionid转换为服务商全局唯一的外部联系人id
+ *
+ * 权限说明:
+ *
+ * 仅认证企业可调用
+ * unionid必须是企业主体下的unionid。即unionid的主体(为绑定了该小程序的微信开放平台账号主体)需与当前企业的主体一致。
+ * unionid的主体(即微信开放平台账号主体)需认证
+ * 该客户的跟进人必须在应用的可见范围之内
+ *
+ *
+ * @param unionid 微信客户的unionid
+ * @return 该企业的外部联系人ID
+ * @throws WxErrorException .
+ */
+ String unionidToExternalUserid(String unionid) throws WxErrorException;
+
/**
* 批量获取客户详情.
*
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 60c7c068ba..29d70a2595 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -137,6 +137,16 @@ public String convertToOpenid(@NotNull String externalUserId) throws WxErrorExce
return tmpJson.get("openid").getAsString();
}
+ @Override
+ public String unionidToExternalUserid(@NotNull String unionid) throws WxErrorException {
+ JsonObject json = new JsonObject();
+ json.addProperty("unionid", unionid);
+ final String url = this.mainService.getWxCpConfigStorage().getApiUrl(UNIONID_TO_EXTERNAL_USERID);
+ String responseContent = this.mainService.post(url, json.toString());
+ JsonObject tmpJson = GsonParser.parse(responseContent);
+ return tmpJson.get("external_userid").getAsString();
+ }
+
@Override
public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
String cursor,
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
index 98bd7425c5..1a184e9a54 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/constant/WxCpApiPathConsts.java
@@ -181,6 +181,7 @@ interface ExternalContact {
String GET_FOLLOW_USER_LIST = "/cgi-bin/externalcontact/get_follow_user_list";
String GET_CONTACT_DETAIL = "/cgi-bin/externalcontact/get?external_userid=";
String CONVERT_TO_OPENID = "/cgi-bin/externalcontact/convert_to_openid";
+ String UNIONID_TO_EXTERNAL_USERID = "/cgi-bin/externalcontact/unionid_to_external_userid";
String GET_CONTACT_DETAIL_BATCH = "/cgi-bin/externalcontact/batch/get_by_user?";
String UPDATE_REMARK = "/cgi-bin/externalcontact/remark";
String LIST_EXTERNAL_CONTACT = "/cgi-bin/externalcontact/list?userid=";
From b06cc90f94c1702226d37b7068f7124d6ba3cd79 Mon Sep 17 00:00:00 2001
From: dinghe1018 <33716606+dinghe1018@users.noreply.github.com>
Date: Sun, 5 Sep 2021 16:06:30 +0800
Subject: [PATCH 0025/1263] =?UTF-8?q?:bug:=20#2284=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E4=BF=AE=E5=A4=8D=E7=9B=B4=E6=92=AD?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E7=9A=84type=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
index 4078cd77e1..7d880ecc89 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/live/WxMaLiveResult.java
@@ -101,6 +101,7 @@ public static class RoomInfo implements Serializable {
private String anchorWechat;
@SerializedName("anchor_img")
private String anchorImg;
+ @SerializedName("live_type")
private Integer type;
@SerializedName("screen_type")
private Integer screenType;
From ba99224d137a36f44e384bb5e78cdef3ea5e23de Mon Sep 17 00:00:00 2001
From: xingyao
Date: Sun, 5 Sep 2021 22:17:30 +0800
Subject: [PATCH 0026/1263] =?UTF-8?q?:art:=20#2295=20=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=89=B9=E9=87=8F=E8=8E=B7?=
=?UTF-8?q?=E5=8F=96=E5=A4=96=E9=83=A8=E5=AE=A2=E6=88=B7=E8=AF=A6=E6=83=85?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=94=AF=E6=8C=81=E5=A4=9A=E4=B8=AAuserId?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cp/api/WxCpExternalContactService.java | 73 ++++++++++---------
.../impl/WxCpExternalContactServiceImpl.java | 4 +-
.../WxCpExternalContactServiceImplTest.java | 15 +++-
3 files changed, 53 insertions(+), 39 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
index c7507d656d..2a6ffe218a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpExternalContactService.java
@@ -153,6 +153,7 @@ public interface WxCpExternalContactService {
/**
* 企业和服务商可通过此接口,将微信外部联系人的userid转为微信openid,用于调用支付相关接口。暂不支持企业微信外部联系人(ExternalUserid为wo开头)的userid转openid。
+ *
* @param externalUserid 微信外部联系人的userid
* @return 该企业的外部联系人openid
* @throws WxErrorException .
@@ -197,13 +198,13 @@ public interface WxCpExternalContactService {
* 第三方/自建应用调用时,返回的跟进人follow_user仅包含应用可见范围之内的成员。
*
*
- * @param userId 企业成员的userid,注意不是外部联系人的帐号
- * @param cursor the cursor
- * @param limit the limit
+ * @param userIdList 企业成员的userid列表,注意不是外部联系人的帐号
+ * @param cursor the cursor
+ * @param limit the limit
* @return wx cp user external contact batch info
* @throws WxErrorException .
*/
- WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
+ WxCpExternalContactBatchInfo getContactDetailBatch(String[] userIdList, String cursor,
Integer limit)
throws WxErrorException;
@@ -273,24 +274,25 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @param takeOverUserid the take over userid
* @return wx cp base resp
* @throws WxErrorException the wx error exception
- * @deprecated 此后续将不再更新维护,建议使用 {@link #transferCustomer(WxCpUserTransferCustomerReq)}
+ * @deprecated 此后续将不再更新维护, 建议使用 {@link #transferCustomer(WxCpUserTransferCustomerReq)}
*/
@Deprecated
WxCpBaseResp transferExternalContact(String externalUserid, String handOverUserid, String takeOverUserid) throws WxErrorException;
/**
* 企业可通过此接口,转接在职成员的客户给其他成员。
- *
+ *
* external_userid必须是handover_userid的客户(即配置了客户联系功能的成员所添加的联系人)。
* 在职成员的每位客户最多被分配2次。客户被转接成功后,将有90个自然日的服务关系保护期,保护期内的客户无法再次被分配。
- *
+ *
* 权限说明:
- * * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
+ * * 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
* 接替成员需要配置了客户联系功能。
* 接替成员需要在企业微信激活且已经过实名认证。
- *
+ *
+ *
* @param req 转接在职成员的客户给其他成员请求实体
* @return wx cp base resp
* @throws WxErrorException the wx error exception
@@ -300,35 +302,37 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
/**
* 企业和第三方可通过此接口查询在职成员的客户转接情况。
*
- * 权限说明:
- *
+ * 权限说明:
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
*
+ *
* @param handOverUserid 原添加成员的userid
* @param takeOverUserid 接替成员的userid
- * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
+ * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
* @return 客户转接接口实体
* @throws WxErrorException the wx error exception
*/
- WxCpUserTransferResultResp transferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
+ WxCpUserTransferResultResp transferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
/**
* 企业可通过此接口,分配离职成员的客户给其他成员。
- *
+ *
* handover_userid必须是已离职用户。
* external_userid必须是handover_userid的客户(即配置了客户联系功能的成员所添加的联系人)。
* 在职成员的每位客户最多被分配2次。客户被转接成功后,将有90个自然日的服务关系保护期,保护期内的客户无法再次被分配。
- *
+ *
* 权限说明:
- *
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->离职分配”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
* 接替成员需要配置了客户联系功能。
* 接替成员需要在企业微信激活且已经过实名认证。
- *
+ *
+ *
* @param req 转接在职成员的客户给其他成员请求实体
* @return wx cp base resp
* @throws WxErrorException the wx error exception
@@ -339,18 +343,19 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 企业和第三方可通过此接口查询离职成员的客户分配情况。
*
* 权限说明:
- *
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->在职继承”权限
* 接替成员必须在此第三方应用或自建应用的可见范围内。
*
+ *
* @param handOverUserid 原添加成员的userid
* @param takeOverUserid 接替成员的userid
- * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
+ * @param cursor 分页查询的cursor,每个分页返回的数据不会超过1000条;不填或为空表示获取第一个分页;
* @return 客户转接接口实体
* @throws WxErrorException the wx error exception
*/
- WxCpUserTransferResultResp resignedTransferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
+ WxCpUserTransferResultResp resignedTransferResult(@NotNull String handOverUserid, @NotNull String takeOverUserid, String cursor) throws WxErrorException;
/**
*
@@ -360,7 +365,6 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
*
*
- * @deprecated 请使用 {@link WxCpExternalContactService#listGroupChat(Integer, String, int, String[])}
* @param pageIndex the page index
* @param pageSize the page size
* @param status the status
@@ -368,6 +372,7 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* @param partyIds the party ids
* @return the wx cp user external group chat list
* @throws WxErrorException the wx error exception
+ * @deprecated 请使用 {@link WxCpExternalContactService#listGroupChat(Integer, String, int, String[])}
*/
@Deprecated
WxCpUserExternalGroupChatList listGroupChat(Integer pageIndex, Integer pageSize, int status, String[] userIds, String[] partyIds) throws WxErrorException;
@@ -380,10 +385,10 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 微信文档:https://work.weixin.qq.com/api/doc/90000/90135/92119
*
*
- * @param limit 分页,预期请求的数据量,取值范围 1 ~ 1000
- * @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
- * @param status 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成 默认为0
- * @param userIds 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过1000人,为了防止数据包过大,会报错 81017);用户ID列表。最多100个
+ * @param limit 分页,预期请求的数据量,取值范围 1 ~ 1000
+ * @param cursor 用于分页查询的游标,字符串类型,由上一次调用返回,首次调用不填
+ * @param status 客户群跟进状态过滤。0 - 所有列表(即不过滤) 1 - 离职待继承 2 - 离职继承中 3 - 离职继承完成 默认为0
+ * @param userIds 群主过滤。如果不填,表示获取应用可见范围内全部群主的数据(但是不建议这么用,如果可见范围人数超过1000人,为了防止数据包过大,会报错 81017);用户ID列表。最多100个
* @return the wx cp user external group chat list
* @throws WxErrorException the wx error exception
*/
@@ -404,30 +409,30 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
WxCpUserExternalGroupChatInfo getGroupChat(String chatId, Integer needName) throws WxErrorException;
/**
- *
* 企业可通过此接口,将已离职成员为群主的群,分配给另一个客服成员。
*
*
* 注意::
- *
+ *
* 群主离职了的客户群,才可继承
* 继承给的新群主,必须是配置了客户联系功能的成员
* 继承给的新群主,必须有设置实名
* 继承给的新群主,必须有激活企业微信
* 同一个人的群,限制每天最多分配300个给新群主
- *
+ *
* 权限说明:
- *
+ *
* 企业需要使用“客户联系”secret或配置到“可调用应用”列表中的自建应用secret所获取的accesstoken来调用(accesstoken如何获取?)。
* 第三方应用需拥有“企业客户权限->客户联系->分配离职成员的客户群”权限
* 对于第三方/自建应用,群主必须在应用的可见范围。
*
- * @param chatIds 需要转群主的客户群ID列表。取值范围: 1 ~ 100
- * @param newOwner 新群主ID
+ *
+ * @param chatIds 需要转群主的客户群ID列表。取值范围: 1 ~ 100
+ * @param newOwner 新群主ID
* @return 分配结果,主要是分配失败的群列表
- * @throws WxErrorException the wx error exception
+ * @throws WxErrorException the wx error exception
*/
- WxCpUserExternalGroupChatTransferResp transferGroupChat(String[] chatIds, String newOwner) throws WxErrorException;
+ WxCpUserExternalGroupChatTransferResp transferGroupChat(String[] chatIds, String newOwner) throws WxErrorException;
/**
*
@@ -520,7 +525,7 @@ WxCpExternalContactBatchInfo getContactDetailBatch(String userId, String cursor,
* 同时传递tag_id和group_id时,忽略tag_id,仅以group_id作为过滤条件。
*
*
- * @param tagId the tag id
+ * @param tagId the tag id
* @param groupId the tagGroup id
* @return corp tag list
* @throws WxErrorException the wx error exception
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
index 29d70a2595..d4b4e7db48 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImpl.java
@@ -148,7 +148,7 @@ public String unionidToExternalUserid(@NotNull String unionid) throws WxErrorExc
}
@Override
- public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
+ public WxCpExternalContactBatchInfo getContactDetailBatch(String[] userIdList,
String cursor,
Integer limit)
throws WxErrorException {
@@ -157,7 +157,7 @@ public WxCpExternalContactBatchInfo getContactDetailBatch(String userId,
.getWxCpConfigStorage()
.getApiUrl(GET_CONTACT_DETAIL_BATCH);
JsonObject json = new JsonObject();
- json.addProperty("userid", userId);
+ json.add("userid_list", new Gson().toJsonTree(userIdList).getAsJsonArray());
if (StringUtils.isNotBlank(cursor)) {
json.addProperty("cursor", cursor);
}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
index accd8f2701..cfbdcca930 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/WxCpExternalContactServiceImplTest.java
@@ -7,6 +7,7 @@
import me.chanjar.weixin.cp.api.WxCpService;
import me.chanjar.weixin.cp.bean.WxCpBaseResp;
import me.chanjar.weixin.cp.bean.external.*;
+import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactInfo;
import me.chanjar.weixin.cp.bean.external.msg.Attachment;
import me.chanjar.weixin.cp.bean.external.msg.Image;
@@ -115,6 +116,14 @@ public void testGetContactDetail() throws WxErrorException {
assertNotNull(result);
}
+ @Test
+ public void testGetContactDetailBatch() throws WxErrorException {
+ String userId = this.configStorage.getUserId();
+ WxCpExternalContactBatchInfo result = this.wxCpService.getExternalContactService().getContactDetailBatch(new String[]{userId}, "", 100);
+ System.out.println(result);
+ assertNotNull(result);
+ }
+
@Test
public void testGetCorpTagList() throws WxErrorException {
String[] tag = {};
@@ -236,14 +245,14 @@ public void testresignedTrnsferResult() throws WxErrorException {
@Test
public void testListGroupChat() throws WxErrorException {
- WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(0, 100 ,0,new String[1],new String[1]);
+ WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(0, 100, 0, new String[1], new String[1]);
System.out.println(result);
assertNotNull(result);
}
@Test
public void testListGroupChatV3() throws WxErrorException {
- WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(100, "" ,0,new String[1]);
+ WxCpUserExternalGroupChatList result = this.wxCpService.getExternalContactService().listGroupChat(100, "", 0, new String[1]);
System.out.println(result);
assertNotNull(result);
}
@@ -301,7 +310,7 @@ public void testUpdateRemark() throws WxErrorException {
.externalUserId("aaa")
.remark("aa")
.remarkCompany("aaa")
- .remarkMobiles(new String[]{"111","222"})
+ .remarkMobiles(new String[]{"111", "222"})
.remarkPicMediaId("aaa")
.build());
}
From 5f35ab27fb118c6af4052a5f9ba79478f0f8e3fe Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 5 Sep 2021 23:00:54 +0800
Subject: [PATCH 0027/1263] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.8.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index 73dfc916ab..b573e8b85e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index ce755fd86c..9f867c34d5 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 522dd844be..5365e12b52 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 7e47cbe62d..1a261b44f0 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index 1a1e8a67e2..c0c806020a 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 391f2d48de..64c7ff1020 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 08d82ac1f8..0dd830a4b4 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index 5fa142ec70..f86fe25683 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index f197d9efe5..a83cb838c0 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index c836d6d2e0..6b034d30c1 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index 2edd2fce79..ef301b5071 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 6c93330117..7a56d4fe1d 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index c76fd9136d..d84eea879c 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index ceb69a1ba3..c32188ba2f 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index c39fa67ddf..35a6475d4a 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.7.B
+ 4.1.8.B
weixin-java-qidian
From 8f4993971d07fa22240a85c147b605ce578c6700 Mon Sep 17 00:00:00 2001
From: Leeway
Date: Tue, 7 Sep 2021 22:41:08 +0800
Subject: [PATCH 0028/1263] =?UTF-8?q?:new:=20#2305=E3=80=90=E5=85=AC?=
=?UTF-8?q?=E4=BC=97=E5=8F=B7=E3=80=91=E5=BE=AE=E4=BF=A1=E4=BA=8B=E4=BB=B6?=
=?UTF-8?q?=E6=B6=88=E6=81=AF=E7=B1=BB=E5=A2=9E=E5=8A=A0=E7=BE=A4=E5=8F=91?=
=?UTF-8?q?=E5=9B=BE=E6=96=87=E7=9A=84url=E7=BB=93=E6=9E=9C=E5=B1=9E?=
=?UTF-8?q?=E6=80=A7?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../mp/bean/message/ArticleUrlResult.java | 48 +++++++++++++++++++
.../mp/bean/message/WxMpXmlMessage.java | 5 +-
2 files changed, 52 insertions(+), 1 deletion(-)
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java
new file mode 100644
index 0000000000..e635e7e506
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/ArticleUrlResult.java
@@ -0,0 +1,48 @@
+package me.chanjar.weixin.mp.bean.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import lombok.Data;
+import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * @author plw on 2021/9/7 10:39 AM.
+ * @version 1.0
+ */
+@XStreamAlias("ArticleUrlResult")
+@Data
+public class ArticleUrlResult implements Serializable {
+
+ @XStreamAlias("ResultList")
+ private List- resultList;
+
+ @XStreamAlias("Count")
+ private Long count;
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+ @XStreamAlias("item")
+ @Data
+ public static class Item implements Serializable {
+
+ @XStreamAlias("ArticleIdx")
+ private String articleIdx;
+
+ @XStreamAlias("ArticleUrl")
+ @XStreamConverter(value = XStreamCDataConverter.class)
+ private String articleUrl;
+
+ @Override
+ public String toString() {
+ return WxMpGsonBuilder.create().toJson(this);
+ }
+
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
index 43d6a47bde..56af43a642 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/message/WxMpXmlMessage.java
@@ -353,6 +353,9 @@ public class WxMpXmlMessage implements Serializable {
@XStreamAlias("SendLocationInfo")
private SendLocationInfo sendLocationInfo = new SendLocationInfo();
+ @XStreamAlias("ArticleUrlResult")
+ private ArticleUrlResult articleUrlResult = new ArticleUrlResult();
+
/**
* 审核不通过原因
*/
@@ -446,7 +449,7 @@ public class WxMpXmlMessage implements Serializable {
/**
* 审核结果,成功succ 或失败fail.
- *
+ *
* 在商品审核结果推送时,verify_ok表示审核通过,verify_not_pass表示审核未通过。
*/
@XStreamAlias("Result")
From f7f2121fcae5211a3d9c47f1cc9b78f4abdbd523 Mon Sep 17 00:00:00 2001
From: yiyi910
Date: Tue, 7 Sep 2021 22:43:10 +0800
Subject: [PATCH 0029/1263] =?UTF-8?q?:bug:=20#2301=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E4=BF=AE=E5=A4=8D=E7=94=9F=E6=88=90?=
=?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=A0=81=E7=9A=84okhttp=E4=B8=8EJod?=
=?UTF-8?q?d=E5=AE=9E=E7=8E=B0=E7=B1=BB=E5=BD=93=E5=BE=AE=E4=BF=A1?=
=?UTF-8?q?=E5=90=8E=E7=AB=AF=E6=8A=A5=E9=94=99=E6=97=B6=E4=B8=8D=E4=BC=9A?=
=?UTF-8?q?=E6=8A=9B=E5=BC=82=E5=B8=B8=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../JoddHttpQrcodeFileRequestExecutor.java | 9 ++-
.../JoddQrcodeBytesRequestExecutor.java | 55 +++++++++++++++++++
.../OkHttpQrcodeBytesRequestExecutor.java | 6 +-
.../OkHttpQrcodeFileRequestExecutor.java | 6 +-
4 files changed, 67 insertions(+), 9 deletions(-)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java
index 714a857ae1..d63e29c5d4 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddHttpQrcodeFileRequestExecutor.java
@@ -57,12 +57,15 @@ public File execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType
HttpResponse response = request.send();
response.charset(StandardCharsets.UTF_8.name());
String contentTypeHeader = response.header("Content-Type");
- if (MimeTypes.MIME_TEXT_PLAIN.equals(contentTypeHeader)) {
+ if (MimeTypes.MIME_APPLICATION_JSON.equals(contentTypeHeader)) {
String responseContent = response.bodyText();
- throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ throw new WxErrorException(WxError.fromJson(responseContent, wxType));
}
try (InputStream inputStream = new ByteArrayInputStream(response.bodyBytes())) {
- return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg");
+ if (StringUtils.isBlank(filePath)) {
+ return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg");
+ }
+ return FileUtils.createTmpFile(inputStream, UUID.randomUUID().toString(), "jpg", Paths.get(filePath).toFile());
}
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java
new file mode 100644
index 0000000000..234360a735
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/JoddQrcodeBytesRequestExecutor.java
@@ -0,0 +1,55 @@
+package cn.binarywang.wx.miniapp.executor;
+
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+
+import cn.binarywang.wx.miniapp.bean.AbstractWxMaQrcodeWrapper;
+import jodd.http.HttpConnectionProvider;
+import jodd.http.HttpRequest;
+import jodd.http.HttpResponse;
+import jodd.http.ProxyInfo;
+import jodd.net.MimeTypes;
+import me.chanjar.weixin.common.enums.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+
+/**
+ * @author vania
+ * @since 2021/09/06
+ */
+public class JoddQrcodeBytesRequestExecutor extends QrcodeBytesRequestExecutor {
+
+
+ public JoddQrcodeBytesRequestExecutor(RequestHttp requestHttp) {
+ super(requestHttp);
+ }
+
+ /**
+ * 执行http请求.
+ *
+ * @param uri uri
+ * @param qrcodeWrapper 数据
+ * @param wxType 微信模块类型
+ * @return 响应结果
+ * @throws WxErrorException 自定义异常
+ * @throws IOException io异常
+ */
+ @Override
+ public byte[] execute(String uri, AbstractWxMaQrcodeWrapper qrcodeWrapper, WxType wxType) throws WxErrorException, IOException {
+ HttpRequest request = HttpRequest.get(uri);
+ if (requestHttp.getRequestHttpProxy() != null) {
+ requestHttp.getRequestHttpClient().useProxy(requestHttp.getRequestHttpProxy());
+ }
+ request.withConnectionProvider(requestHttp.getRequestHttpClient());
+
+ HttpResponse response = request.send();
+ response.charset(StandardCharsets.UTF_8.name());
+ String contentTypeHeader = response.header("Content-Type");
+ if (MimeTypes.MIME_APPLICATION_JSON.equals(contentTypeHeader)) {
+ String responseContent = response.bodyText();
+ throw new WxErrorException(WxError.fromJson(responseContent, wxType));
+ }
+ return response.bodyBytes();
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java
index 9a1c677af1..d716987ceb 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/executor/OkHttpQrcodeBytesRequestExecutor.java
@@ -35,13 +35,13 @@ public OkHttpQrcodeBytesRequestExecutor(RequestHttp
Date: Tue, 7 Sep 2021 22:44:03 +0800
Subject: [PATCH 0030/1263] =?UTF-8?q?:new:=20#2281=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0=E5=B0=8F=E7=A8=8B?=
=?UTF-8?q?=E5=BA=8F=E5=8A=A0=E5=AF=86=E7=BD=91=E7=BB=9C=E9=80=9A=E9=81=93?=
=?UTF-8?q?=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaInternetService.java | 27 ++++++++
.../wx/miniapp/api/WxMaService.java | 7 +++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ++
.../api/impl/WxMaInternetServiceImpl.java | 33 ++++++++++
.../bean/internet/WxMaInternetResponse.java | 61 +++++++++++++++++++
.../internet/WxMaInternetUserKeyInfo.java | 56 +++++++++++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 4 ++
.../api/impl/WxMaInternetServiceImplTest.java | 29 +++++++++
8 files changed, 223 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java
new file mode 100644
index 0000000000..8e6a3e2d80
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaInternetService.java
@@ -0,0 +1,27 @@
+package cn.binarywang.wx.miniapp.api;
+
+import cn.binarywang.wx.miniapp.bean.internet.WxMaInternetResponse;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ *
+ * 【小程序-服务端-网络】网络相关接口.
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ *
+ * @author chutian0124
+ */
+public interface WxMaInternetService {
+ /**
+ *
+ *
+ *
+ * 获取用户encryptKey。 会获取用户最近3次的key,每个key的存活时间为3600s。
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ * 接口地址:POST https://api.weixin.qq.com/wxa/business/getuserencryptkey?access_token=ACCESS_TOKEN&openid=OPENID&signature=SIGNATURE&sig_method=hmac_sha256
+ *
+ *
+ * @return {@link WxMaInternetResponse}
+ * @throws WxErrorException
+ */
+ WxMaInternetResponse getUserEncryptKey() 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 a182c245cd..1ebf7d7eba 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
@@ -342,6 +342,13 @@ public interface WxMaService extends WxService {
*/
WxMaCloudService getCloudService();
+ /**
+ * 获取服务端网络接口服务对象
+ *
+ * @return 。internet service
+ */
+ WxMaInternetService getInternetService();
+
/**
* 获取直播接口服务对象
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
index 096eedd5bf..ecbce2ee05 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
@@ -49,6 +49,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaSchemeService schemeService = new WxMaSchemeServiceImpl(this);
private final WxMaAnalysisService analysisService = new WxMaAnalysisServiceImpl(this);
private final WxMaCodeService codeService = new WxMaCodeServiceImpl(this);
+ private final WxMaInternetService internetService = new WxMaInternetServiceImpl(this);
private final WxMaSettingService settingService = new WxMaSettingServiceImpl(this);
private final WxMaJsapiService jsapiService = new WxMaJsapiServiceImpl(this);
private final WxMaShareService shareService = new WxMaShareServiceImpl(this);
@@ -488,6 +489,11 @@ public WxMaCloudService getCloudService() {
return this.cloudService;
}
+ @Override
+ public WxMaInternetService getInternetService() {
+ return this.internetService;
+ }
+
@Override
public WxMaLiveService getLiveService() {
return this.liveService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java
new file mode 100644
index 0000000000..8ee023baf5
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImpl.java
@@ -0,0 +1,33 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaInternetService;
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.internet.WxMaInternetResponse;
+import cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants;
+import cn.binarywang.wx.miniapp.json.WxMaGsonBuilder;
+import lombok.RequiredArgsConstructor;
+import me.chanjar.weixin.common.enums.WxType;
+import me.chanjar.weixin.common.error.WxError;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ *
+ * 服务端网络相关接口
+ *
+ * @author chutian0124
+ * @Date 2021-09-06
+ */
+@RequiredArgsConstructor
+public class WxMaInternetServiceImpl implements WxMaInternetService {
+ private final WxMaService wxMaService;
+
+ @Override
+ public WxMaInternetResponse getUserEncryptKey() throws WxErrorException {
+ String responseContent = this.wxMaService.post(WxMaApiUrlConstants.Internet.GET_USER_ENCRYPT_KEY, "");
+ WxMaInternetResponse response = WxMaGsonBuilder.create().fromJson(responseContent, WxMaInternetResponse.class);
+ if (response.getErrcode() == -1) {
+ throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
+ }
+ return response;
+ }
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java
new file mode 100644
index 0000000000..da9cfbc059
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetResponse.java
@@ -0,0 +1,61 @@
+package cn.binarywang.wx.miniapp.bean.internet;
+
+import cn.binarywang.wx.miniapp.bean.WxMaBaseResponse;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ *
+ *
+ *
+ * 获取用户encryptKey。 用户最近三次的加密key,每个key的存活时间为3600s。
+ * 【小程序-服务端-网络】网络相关接口.
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ * 微信返回报文:
+ * {
+ * "errcode":0,
+ * "errmsg":"ok",
+ * "key_info_list":
+ * [
+ * {
+ * "encrypt_key":"VI6BpyrK9XH4i4AIGe86tg==",
+ * "version":10,
+ * "expire_in":3597,
+ * "iv":"6003f73ec441c386",
+ * "create_time":1616572301
+ * },
+ * {
+ * "encrypt_key":"aoUGAHltcliiL9f23oTKHA==",
+ * "version":9,
+ * "expire_in":0,
+ * "iv":"7996656384218dbb",
+ * "create_time":1616504886
+ * },
+ * {
+ * "encrypt_key":"MlZNQNnRQz3zXHHcr6A3mA==",
+ * "version":8,
+ * "expire_in":0,
+ * "iv":"58a1814f88883024",
+ * "create_time":1616488061
+ * }
+ * ]
+ * }
+ *
+ *
+ * @author chutian0124
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WxMaInternetResponse extends WxMaBaseResponse implements Serializable {
+
+ private static final long serialVersionUID = 6254922047193011785L;
+ /**
+ * 用户最近三次的加密key列表
+ */
+ @SerializedName("key_info_list")
+ List keyInfoList;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java
new file mode 100644
index 0000000000..01bcfbce0b
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/internet/WxMaInternetUserKeyInfo.java
@@ -0,0 +1,56 @@
+package cn.binarywang.wx.miniapp.bean.internet;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ *
+ *
+ * 【小程序-服务端-网络】网络相关接口.
+ * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/internet/internet.getUserEncryptKey.html
+ * 微信返回报文:
+ * {
+ * "encrypt_key":"VI6BpyrK9XH4i4AIGe86tg==",
+ * "version":10,
+ * "expire_in":3597,
+ * "iv":"6003f73ec441c386",
+ * "create_time":1616572301
+ * }
+ *
+ *
+ * @author chutian0124
+ */
+@Data
+public class WxMaInternetUserKeyInfo implements Serializable {
+ private static final long serialVersionUID = 117922490907396705L;
+ /**
+ * 加密key
+ */
+ @SerializedName("encrypt_key")
+ private String encryptKey;
+
+ /**
+ * key的版本号
+ */
+ private Integer version;
+
+ /**
+ * 剩余有效时间
+ */
+ @SerializedName("expire_in")
+ private Long expireIn;
+
+ /**
+ * 加密iv
+ */
+ private String iv;
+
+ /**
+ * 创建key的时间戳
+ */
+ @SerializedName("create_time")
+ private Long createTime;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index f65fceaaa8..37c8db1314 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -388,4 +388,8 @@ public interface Invoice{
*/
String UPDATE_STATUS_BATCH = "https://api.weixin.qq.com/card/invoice/reimburse/updatestatusbatch";
}
+
+ public interface Internet{
+ String GET_USER_ENCRYPT_KEY = "https://api.weixin.qq.com/wxa/business/getuserencryptkey";
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java
new file mode 100644
index 0000000000..ccc2f9c93a
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaInternetServiceImplTest.java
@@ -0,0 +1,29 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.internet.WxMaInternetResponse;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+/**
+ *
+ * 服务端网络相关接口测试
+ *
+ * @author chutian0124
+ * @date 2021-09-06
+ */
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaInternetServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGetUserEncryptKey() throws WxErrorException {
+ WxMaInternetResponse response = this.wxService.getInternetService().getUserEncryptKey();
+ System.out.println(response);
+ }
+}
From ea31b7bfbebed306db646ce54261cc156ee852e2 Mon Sep 17 00:00:00 2001
From: linlinjava
Date: Fri, 10 Sep 2021 11:38:35 +0800
Subject: [PATCH 0031/1263] =?UTF-8?q?:new:=20#2306=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E5=B0=8F=E7=A8=8B=E5=BA=8F=E3=80=91=E5=A2=9E=E5=8A=A0?=
=?UTF-8?q?=E5=B0=8F=E7=A8=8B=E5=BA=8FShort=20Link=E7=94=9F=E6=88=90?=
=?UTF-8?q?=E7=9A=84=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaService.java | 7 +++
.../wx/miniapp/api/WxMaShortLinkService.java | 14 ++++++
.../miniapp/api/impl/BaseWxMaServiceImpl.java | 6 +++
.../api/impl/WxMaShortLinkServiceImpl.java | 34 ++++++++++++++
.../shortlink/GenerateShortLinkRequest.java | 45 +++++++++++++++++++
.../miniapp/constant/WxMaApiUrlConstants.java | 4 ++
.../impl/WxMaShortLinkServiceImplTest.java | 24 ++++++++++
7 files changed, 134 insertions(+)
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
create mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java
create mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
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 1ebf7d7eba..fdbc3ec11e 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
@@ -456,6 +456,13 @@ public interface WxMaService extends WxService {
*/
WxMaLinkService getLinkService();
+ /**
+ * 获取小程序 Short Link服务接口
+ *
+ * @return
+ */
+ WxMaShortLinkService getShortLinkService();
+
/**
* 获取电子发票报销方服务接口
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
new file mode 100644
index 0000000000..e8e5942a9c
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
@@ -0,0 +1,14 @@
+package cn.binarywang.wx.miniapp.api;
+
+
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
+import me.chanjar.weixin.common.error.WxErrorException;
+
+/**
+ * 获取小程序 Short Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
+ */
+public interface WxMaShortLinkService {
+
+ String generate(GenerateShortLinkRequest request) throws WxErrorException;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
index ecbce2ee05..ebc96e8dfa 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
@@ -74,6 +74,7 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopAfterSaleService shopAfterSaleService = new WxMaShopAfterSaleServiceImpl(this);
private final WxMaShopDeliveryService shopDeliveryService = new WxMaShopDeliveryServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
+ private final WxMaShortLinkService shortlinkService = new WxMaShortLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
private int retrySleepMillis = 1000;
@@ -569,6 +570,11 @@ public WxMaLinkService getLinkService() {
return this.linkService;
}
+ @Override
+ public WxMaShortLinkService getShortLinkService() {
+ return this.shortlinkService;
+ }
+
@Override
public WxMaReimburseInvoiceService getReimburseInvoiceService() {
return this.reimburseInvoiceService;
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
new file mode 100644
index 0000000000..074dfd4d5e
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
@@ -0,0 +1,34 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.api.WxMaShortLinkService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
+import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonParser;
+
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.ShortLink.GENERATE_SHORT_LINK_URL;
+
+/**
+ * 获取小程序 Short Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
+ */
+@AllArgsConstructor
+public class WxMaShortLinkServiceImpl implements WxMaShortLinkService {
+
+ private final WxMaService wxMaService;
+
+ @Override
+ public String generate(GenerateShortLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_SHORT_LINK_URL,request);
+ String linkField = "link";
+ JsonObject jsonObject = GsonParser.parse(result);
+ if(jsonObject.has(linkField)){
+ return jsonObject.get(linkField).toString();
+ }
+ throw new WxErrorException("无link");
+ }
+ }
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java
new file mode 100644
index 0000000000..2356475148
--- /dev/null
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shortlink/GenerateShortLinkRequest.java
@@ -0,0 +1,45 @@
+package cn.binarywang.wx.miniapp.bean.shortlink;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Builder;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ *
+ * 获取小程序 Short Link参数对象
+ *
+ */
+@Data
+@Builder
+public class GenerateShortLinkRequest implements Serializable {
+ private static final long serialVersionUID = -7517804620683442832L;
+
+ /**
+ * 通过 Short Link 进入的小程序页面路径,必须是已经发布的小程序存在的页面,可携带 query,最大1024个字符
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("page_url")
+ private String pageUrl;
+
+ /**
+ * 页面标题,不能包含违法信息,超过20字符会用... 截断代替
+ *
+ * 是否必填: 是
+ *
+ */
+ @SerializedName("page_title")
+ private String pageTitle;
+
+ /**
+ * 生成的 Short Link 类型,短期有效:false,永久有效:true
+ *
+ * 是否必填: 否
+ *
+ */
+ @SerializedName("is_permanent")
+ private Boolean isPermanent;
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
index 37c8db1314..17b72c8db5 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/constant/WxMaApiUrlConstants.java
@@ -226,6 +226,10 @@ public interface Link {
String GENERATE_URLLINK_URL = "https://api.weixin.qq.com/wxa/generate_urllink";
}
+ public interface ShortLink {
+ String GENERATE_SHORT_LINK_URL = "https://api.weixin.qq.com/wxa/genwxashortlink";
+ }
+
public interface SecCheck {
String IMG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/img_sec_check";
String MSG_SEC_CHECK_URL = "https://api.weixin.qq.com/wxa/msg_sec_check";
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
new file mode 100644
index 0000000000..4e6e1a9f62
--- /dev/null
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
@@ -0,0 +1,24 @@
+package cn.binarywang.wx.miniapp.api.impl;
+
+import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
+import cn.binarywang.wx.miniapp.test.ApiTestModule;
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+@Test
+@Guice(modules = ApiTestModule.class)
+public class WxMaShortLinkServiceImplTest {
+ @Inject
+ private WxMaService wxService;
+
+ @Test
+ public void testGenerate() throws WxErrorException {
+ final String generate = this.wxService.getShortLinkService().generate(GenerateShortLinkRequest.builder().
+ pageUrl("pages/productView/editPhone/editPhone?id=31832").pageTitle("productView").isPermanent(false).build());
+ System.out.println("generate:");
+ System.out.println(generate);
+ }
+}
From ba23afd49f85270ff29ea00099e0d3854bb2c20b Mon Sep 17 00:00:00 2001
From: xdtand <346570926@qq.com>
Date: Fri, 10 Sep 2021 11:40:01 +0800
Subject: [PATCH 0032/1263] =?UTF-8?q?:art:=20#2311=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BC=81=E4=B8=9A=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=89=93=E5=8D=A1=E6=95=B0=E6=8D=AE=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86=E7=BC=BA=E5=A4=B1=E5=AD=97?=
=?UTF-8?q?=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/bean/oa/WxCpCheckinData.java | 24 +++++++++++++++++++
1 file changed, 24 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
index 4ab801de1a..c33c99fec5 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
@@ -96,4 +96,28 @@ public class WxCpCheckinData implements Serializable {
*/
@SerializedName("deviceid")
private String deviceId;
+
+ /**
+ * 标准打卡时间,指此次打卡时间对应的标准上班时间或标准下班时间
+ */
+ @SerializedName("sch_checkin_time")
+ private String schCheckinTime;
+
+ /**
+ * 规则id,表示打卡记录所属规则的id
+ */
+ @SerializedName("groupid")
+ private String groupId;
+
+ /**
+ * 班次id,表示打卡记录所属规则中,所属班次的id
+ */
+ @SerializedName("schedule_id")
+ private String scheduleId;
+
+ /**
+ * 时段id,表示打卡记录所属规则中,某一班次中的某一时段的id,如上下班时间为9:00-12:00、13:00-18:00的班次中,9:00-12:00为其中一组时段
+ */
+ @SerializedName("timeline_id")
+ private String timelineId;
}
From 123bef0ea9464ade28ff05f8c540baf50f3c8fde Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 13 Sep 2021 23:08:32 +0800
Subject: [PATCH 0033/1263] =?UTF-8?q?:art:=20=E9=87=8D=E6=9E=84=E4=BC=98?=
=?UTF-8?q?=E5=8C=96=E5=B0=8F=E7=A8=8B=E5=BA=8FLink=E7=9B=B8=E5=85=B3?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/api/WxMaLinkService.java | 22 ++++++++++--
.../wx/miniapp/api/WxMaShortLinkService.java | 14 --------
.../miniapp/api/impl/WxMaLinkServiceImpl.java | 22 +++++++++---
.../api/impl/WxMaShortLinkServiceImpl.java | 34 -------------------
.../api/impl/WxMaLinkServiceImplTest.java | 24 ++++++++-----
.../impl/WxMaShortLinkServiceImplTest.java | 24 -------------
6 files changed, 51 insertions(+), 89 deletions(-)
delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
delete mode 100644 weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
delete mode 100644 weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
index c3c4559a83..090ac95e35 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaLinkService.java
@@ -1,16 +1,32 @@
package cn.binarywang.wx.miniapp.api;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
import me.chanjar.weixin.common.error.WxErrorException;
/**
- * 获取小程序 URL Link接口
- * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
* @author xiaoyu
* @since 2021-06-10
*/
public interface WxMaLinkService {
+ /**
+ * 获取小程序 URL Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+ *
+ * @param request 请求
+ * @return link地址
+ * @throws WxErrorException .
+ */
+ String generateUrlLink(GenerateUrlLinkRequest request) throws WxErrorException;
- String generate(GenerateUrlLinkRequest request) throws WxErrorException;
+ /**
+ * 获取小程序 Short Link接口
+ * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
+ *
+ * @param request 请求
+ * @return link地址
+ * @throws WxErrorException .
+ */
+ String generateShortLink(GenerateShortLinkRequest request) throws WxErrorException;
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
deleted file mode 100644
index e8e5942a9c..0000000000
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaShortLinkService.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package cn.binarywang.wx.miniapp.api;
-
-
-import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
-import me.chanjar.weixin.common.error.WxErrorException;
-
-/**
- * 获取小程序 Short Link接口
- * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
- */
-public interface WxMaShortLinkService {
-
- String generate(GenerateShortLinkRequest request) throws WxErrorException;
-}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
index c3b78e4e1e..e0dd4a915c 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImpl.java
@@ -2,34 +2,46 @@
import cn.binarywang.wx.miniapp.api.WxMaLinkService;
import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
import com.google.gson.JsonObject;
import lombok.AllArgsConstructor;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.json.GsonParser;
-import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
+import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.ShortLink.GENERATE_SHORT_LINK_URL;
/**
* 获取小程序 URL Link接口实现
* 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/url-link/urllink.generate.html
+ *
* @author xiaoyu
* @since 2021-06-10
*/
@AllArgsConstructor
public class WxMaLinkServiceImpl implements WxMaLinkService {
-
private final WxMaService wxMaService;
@Override
- public String generate(GenerateUrlLinkRequest request) throws WxErrorException {
- String result = this.wxMaService.post(GENERATE_URLLINK_URL,request);
+ public String generateUrlLink(GenerateUrlLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_URLLINK_URL, request);
String linkField = "url_link";
JsonObject jsonObject = GsonParser.parse(result);
- if(jsonObject.has(linkField)){
+ if (jsonObject.has(linkField)) {
return jsonObject.get(linkField).toString();
}
throw new WxErrorException("无url_link");
}
+
+ @Override
+ public String generateShortLink(GenerateShortLinkRequest request) throws WxErrorException {
+ String result = this.wxMaService.post(GENERATE_SHORT_LINK_URL, request);
+ String linkField = "link";
+ JsonObject jsonObject = GsonParser.parse(result);
+ if (jsonObject.has(linkField)) {
+ return jsonObject.get(linkField).toString();
+ }
+ throw new WxErrorException("无link");
}
+}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
deleted file mode 100644
index 074dfd4d5e..0000000000
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImpl.java
+++ /dev/null
@@ -1,34 +0,0 @@
-package cn.binarywang.wx.miniapp.api.impl;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.api.WxMaShortLinkService;
-import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
-import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
-import com.google.gson.JsonObject;
-import lombok.AllArgsConstructor;
-import me.chanjar.weixin.common.error.WxErrorException;
-import me.chanjar.weixin.common.util.json.GsonParser;
-
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.Link.GENERATE_URLLINK_URL;
-import static cn.binarywang.wx.miniapp.constant.WxMaApiUrlConstants.ShortLink.GENERATE_SHORT_LINK_URL;
-
-/**
- * 获取小程序 Short Link接口
- * 接口文档: https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/short-link/shortlink.generate.html
- */
-@AllArgsConstructor
-public class WxMaShortLinkServiceImpl implements WxMaShortLinkService {
-
- private final WxMaService wxMaService;
-
- @Override
- public String generate(GenerateShortLinkRequest request) throws WxErrorException {
- String result = this.wxMaService.post(GENERATE_SHORT_LINK_URL,request);
- String linkField = "link";
- JsonObject jsonObject = GsonParser.parse(result);
- if(jsonObject.has(linkField)){
- return jsonObject.get(linkField).toString();
- }
- throw new WxErrorException("无link");
- }
- }
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
index 68ca9b6214..c97e11077d 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaLinkServiceImplTest.java
@@ -1,6 +1,7 @@
package cn.binarywang.wx.miniapp.api.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
+import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
import cn.binarywang.wx.miniapp.bean.urllink.GenerateUrlLinkRequest;
import cn.binarywang.wx.miniapp.test.ApiTestModule;
import com.google.inject.Inject;
@@ -8,24 +9,29 @@
import org.testng.annotations.Guice;
import org.testng.annotations.Test;
-import static org.testng.Assert.*;
-
@Test
@Guice(modules = ApiTestModule.class)
public class WxMaLinkServiceImplTest {
-
@Inject
private WxMaService wxMaService;
@Test
- public void testGenerate() throws WxErrorException {
-
- GenerateUrlLinkRequest request = GenerateUrlLinkRequest.builder()
+ public void testGenerateUrlLink() throws WxErrorException {
+ String url = this.wxMaService.getLinkService().generateUrlLink(GenerateUrlLinkRequest.builder()
.path("pages/tabBar/home/home")
- .build();
-
- String url = this.wxMaService.getLinkService().generate(request);
+ .build());
System.out.println(url);
}
+
+ @Test
+ public void testGenerateShortLink() throws WxErrorException {
+ final String generate = this.wxMaService.getLinkService()
+ .generateShortLink(GenerateShortLinkRequest.builder().
+ pageUrl("pages/productView/editPhone/editPhone?id=31832")
+ .pageTitle("productView")
+ .isPermanent(false).build());
+ System.out.println("generate:");
+ System.out.println(generate);
+ }
}
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
deleted file mode 100644
index 4e6e1a9f62..0000000000
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShortLinkServiceImplTest.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package cn.binarywang.wx.miniapp.api.impl;
-
-import cn.binarywang.wx.miniapp.api.WxMaService;
-import cn.binarywang.wx.miniapp.bean.shortlink.GenerateShortLinkRequest;
-import cn.binarywang.wx.miniapp.test.ApiTestModule;
-import com.google.inject.Inject;
-import me.chanjar.weixin.common.error.WxErrorException;
-import org.testng.annotations.Guice;
-import org.testng.annotations.Test;
-
-@Test
-@Guice(modules = ApiTestModule.class)
-public class WxMaShortLinkServiceImplTest {
- @Inject
- private WxMaService wxService;
-
- @Test
- public void testGenerate() throws WxErrorException {
- final String generate = this.wxService.getShortLinkService().generate(GenerateShortLinkRequest.builder().
- pageUrl("pages/productView/editPhone/editPhone?id=31832").pageTitle("productView").isPermanent(false).build());
- System.out.println("generate:");
- System.out.println(generate);
- }
-}
From 6bba793f4fa0137155652d2456c5b35b020cb4dd Mon Sep 17 00:00:00 2001
From: xdtand <346570926@qq.com>
Date: Mon, 13 Sep 2021 23:22:57 +0800
Subject: [PATCH 0034/1263] =?UTF-8?q?:art:=20=E4=BF=AE=E6=94=B9=E5=A2=9E?=
=?UTF-8?q?=E5=8A=A0=E7=9A=84=E5=AD=97=E6=AE=B5=E5=AF=B9=E5=BA=94=E7=9A=84?=
=?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=B1=BB=E5=9E=8B?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
index c33c99fec5..93e975508a 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/oa/WxCpCheckinData.java
@@ -101,23 +101,23 @@ public class WxCpCheckinData implements Serializable {
* 标准打卡时间,指此次打卡时间对应的标准上班时间或标准下班时间
*/
@SerializedName("sch_checkin_time")
- private String schCheckinTime;
+ private Long schCheckinTime;
/**
* 规则id,表示打卡记录所属规则的id
*/
@SerializedName("groupid")
- private String groupId;
+ private Integer groupId;
/**
* 班次id,表示打卡记录所属规则中,所属班次的id
*/
@SerializedName("schedule_id")
- private String scheduleId;
+ private Integer scheduleId;
/**
* 时段id,表示打卡记录所属规则中,某一班次中的某一时段的id,如上下班时间为9:00-12:00、13:00-18:00的班次中,9:00-12:00为其中一组时段
*/
@SerializedName("timeline_id")
- private String timelineId;
+ private Integer timelineId;
}
From 941c47a19325713ecf4882f6e77a2286b5e14d8e Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 13 Sep 2021 23:44:46 +0800
Subject: [PATCH 0035/1263] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E5=B7=B2?=
=?UTF-8?q?=E7=A7=BB=E9=99=A4=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/cn/binarywang/wx/miniapp/api/WxMaService.java | 9 +--------
.../wx/miniapp/api/impl/BaseWxMaServiceImpl.java | 6 ------
2 files changed, 1 insertion(+), 14 deletions(-)
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 fdbc3ec11e..d0b2dcf12b 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
@@ -450,19 +450,12 @@ public interface WxMaService extends WxService {
WxMaShopAuditService getShopAuditService();
/**
- * 获取小程序 URL Link服务接口
+ * 获取小程序Link服务接口
*
* @return
*/
WxMaLinkService getLinkService();
- /**
- * 获取小程序 Short Link服务接口
- *
- * @return
- */
- WxMaShortLinkService getShortLinkService();
-
/**
* 获取电子发票报销方服务接口
*
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
index ebc96e8dfa..ecbce2ee05 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/BaseWxMaServiceImpl.java
@@ -74,7 +74,6 @@ public abstract class BaseWxMaServiceImpl implements WxMaService, RequestH
private final WxMaShopAfterSaleService shopAfterSaleService = new WxMaShopAfterSaleServiceImpl(this);
private final WxMaShopDeliveryService shopDeliveryService = new WxMaShopDeliveryServiceImpl(this);
private final WxMaLinkService linkService = new WxMaLinkServiceImpl(this);
- private final WxMaShortLinkService shortlinkService = new WxMaShortLinkServiceImpl(this);
private final WxMaReimburseInvoiceService reimburseInvoiceService = new WxMaReimburseInvoiceServiceImpl(this);
private Map configMap;
private int retrySleepMillis = 1000;
@@ -570,11 +569,6 @@ public WxMaLinkService getLinkService() {
return this.linkService;
}
- @Override
- public WxMaShortLinkService getShortLinkService() {
- return this.shortlinkService;
- }
-
@Override
public WxMaReimburseInvoiceService getReimburseInvoiceService() {
return this.reimburseInvoiceService;
From 8faef7c8e25b46613b305265b420749e4ac73127 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Mon, 13 Sep 2021 23:32:05 +0800
Subject: [PATCH 0036/1263] =?UTF-8?q?:bookmark:=20=E5=8F=91=E5=B8=83=204.1?=
=?UTF-8?q?.9.B=20=E6=B5=8B=E8=AF=95=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
pom.xml | 2 +-
spring-boot-starters/pom.xml | 2 +-
.../wx-java-miniapp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml | 2 +-
spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml | 2 +-
weixin-graal/pom.xml | 2 +-
weixin-java-common/pom.xml | 2 +-
weixin-java-cp/pom.xml | 2 +-
weixin-java-miniapp/pom.xml | 2 +-
weixin-java-mp/pom.xml | 2 +-
weixin-java-open/pom.xml | 2 +-
weixin-java-pay/pom.xml | 2 +-
weixin-java-qidian/pom.xml | 2 +-
15 files changed, 15 insertions(+), 15 deletions(-)
diff --git a/pom.xml b/pom.xml
index b573e8b85e..842aae46f1 100644
--- a/pom.xml
+++ b/pom.xml
@@ -3,7 +3,7 @@
4.0.0
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
pom
WxJava - Weixin/Wechat Java SDK
微信开发Java SDK
diff --git a/spring-boot-starters/pom.xml b/spring-boot-starters/pom.xml
index 9f867c34d5..85fe5094b0 100644
--- a/spring-boot-starters/pom.xml
+++ b/spring-boot-starters/pom.xml
@@ -4,7 +4,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
pom
wx-java-spring-boot-starters
diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
index 5365e12b52..743650b256 100644
--- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
index 1a261b44f0..e62e70040c 100644
--- a/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
index c0c806020a..9545eb445f 100644
--- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
index 64c7ff1020..074e202146 100644
--- a/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-pay-spring-boot-starter/pom.xml
@@ -5,7 +5,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
index 0dd830a4b4..fe8b29ecaa 100644
--- a/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
+++ b/spring-boot-starters/wx-java-qidian-spring-boot-starter/pom.xml
@@ -3,7 +3,7 @@
wx-java-spring-boot-starters
com.github.binarywang
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/weixin-graal/pom.xml b/weixin-graal/pom.xml
index f86fe25683..896a812b5a 100644
--- a/weixin-graal/pom.xml
+++ b/weixin-graal/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-graal
diff --git a/weixin-java-common/pom.xml b/weixin-java-common/pom.xml
index a83cb838c0..665f0d7b87 100644
--- a/weixin-java-common/pom.xml
+++ b/weixin-java-common/pom.xml
@@ -6,7 +6,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-common
diff --git a/weixin-java-cp/pom.xml b/weixin-java-cp/pom.xml
index 6b034d30c1..90edd559fb 100644
--- a/weixin-java-cp/pom.xml
+++ b/weixin-java-cp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-cp
diff --git a/weixin-java-miniapp/pom.xml b/weixin-java-miniapp/pom.xml
index ef301b5071..1dba48165a 100644
--- a/weixin-java-miniapp/pom.xml
+++ b/weixin-java-miniapp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-miniapp
diff --git a/weixin-java-mp/pom.xml b/weixin-java-mp/pom.xml
index 7a56d4fe1d..62ebb65b13 100644
--- a/weixin-java-mp/pom.xml
+++ b/weixin-java-mp/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-mp
diff --git a/weixin-java-open/pom.xml b/weixin-java-open/pom.xml
index d84eea879c..2407c52146 100644
--- a/weixin-java-open/pom.xml
+++ b/weixin-java-open/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-open
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index c32188ba2f..097fd4cfc1 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -5,7 +5,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
4.0.0
diff --git a/weixin-java-qidian/pom.xml b/weixin-java-qidian/pom.xml
index 35a6475d4a..f36c374918 100644
--- a/weixin-java-qidian/pom.xml
+++ b/weixin-java-qidian/pom.xml
@@ -7,7 +7,7 @@
com.github.binarywang
wx-java
- 4.1.8.B
+ 4.1.9.B
weixin-java-qidian
From 18b49daf2b4f203bfc3b033ebc7410d7cd0e8523 Mon Sep 17 00:00:00 2001
From: Zerision <894477402@qq.com>
Date: Sun, 19 Sep 2021 10:30:35 +0800
Subject: [PATCH 0037/1263] =?UTF-8?q?:bug:=20#2314=20=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BF=AE=E5=A4=8D=E5=A4=9A?=
=?UTF-8?q?=E4=B8=AA=E4=B8=8D=E5=90=8C=E9=80=9A=E7=9F=A5=E6=B6=88=E6=81=AF?=
=?UTF-8?q?=E8=A2=AB=E8=AF=AF=E5=88=A4=E4=B8=BA=E5=90=8C=E4=B8=80=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/cp/message/WxCpMessageRouter.java | 18 +++++++++++-------
1 file changed, 11 insertions(+), 7 deletions(-)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
index 92de0c238a..a0464a7252 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/message/WxCpMessageRouter.java
@@ -209,16 +209,20 @@ private boolean isMsgDuplicated(WxCpXmlMessage wxMessage) {
.append("-").append(wxMessage.getCreateTime())
.append("-").append(wxMessage.getFromUserName());
}
+ append(messageId, wxMessage.getUserId());
+ append(messageId, wxMessage.getChangeType());
+ append(messageId, wxMessage.getTagId());
+ append(messageId, wxMessage.getId());
+ append(messageId, wxMessage.getChatId());
+ append(messageId, wxMessage.getExternalUserId());
- if (StringUtils.isNotEmpty(wxMessage.getUserId())) {
- messageId.append("-").append(wxMessage.getUserId());
- }
+ return this.messageDuplicateChecker.isDuplicate(messageId.toString());
+ }
- if (StringUtils.isNotEmpty(wxMessage.getChangeType())) {
- messageId.append("-").append(wxMessage.getChangeType());
+ private void append(StringBuilder sb, String value){
+ if(StringUtils.isNotEmpty(value)){
+ sb.append("-").append(value);
}
-
- return this.messageDuplicateChecker.isDuplicate(messageId.toString());
}
/**
From cabee0f70cbf6f8b3f83ab0e4afc0e0e8dda6529 Mon Sep 17 00:00:00 2001
From: laizuan <1032299142@qq.com>
Date: Sun, 19 Sep 2021 12:53:42 +0800
Subject: [PATCH 0038/1263] =?UTF-8?q?:art:=20=E9=BB=98=E8=AE=A4Apache=20ht?=
=?UTF-8?q?tp=EF=BC=8C=E6=8E=92=E9=99=A4jodd-http=E4=BE=9D=E8=B5=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
weixin-java-pay/pom.xml | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/weixin-java-pay/pom.xml b/weixin-java-pay/pom.xml
index 097fd4cfc1..acd179ce4b 100644
--- a/weixin-java-pay/pom.xml
+++ b/weixin-java-pay/pom.xml
@@ -27,7 +27,7 @@
org.jodd
jodd-http
- compile
+ provided
From 2019efffa3f188f15b2acb2f603f6441ee67a3a6 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 19 Sep 2021 12:59:03 +0800
Subject: [PATCH 0039/1263] =?UTF-8?q?:art:=20=E4=BF=AE=E5=A4=8D=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E5=8F=82=E6=95=B0=E5=91=BD=E5=90=8D=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/request/WxPayRefundQueryV3Request.java | 16 +++++++---------
.../binarywang/wxpay/service/WxPayService.java | 4 ++--
.../wxpay/service/impl/BaseWxPayServiceImpl.java | 6 +++---
.../service/impl/BaseWxPayServiceImplTest.java | 4 ++--
4 files changed, 14 insertions(+), 16 deletions(-)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java
index d29f41a4c0..e7d34e31f9 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayRefundQueryV3Request.java
@@ -19,16 +19,14 @@ public class WxPayRefundQueryV3Request implements Serializable {
private static final long serialVersionUID = 1L;
/**
*
- * 字段名:商户订单号
- * 变量名:out_trade_no
+ * 字段名:商户退款单号
+ * 变量名:out_refund_no
* 是否必填:是
- * 类型:string[1,32]
- * 描述:
- * 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。
- * 特殊规则:最小字符长度为6
- * 示例值:1217752501201407033233368018
+ * 类型:string[1, 64]
+ * 描述:商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
+ * 示例值:1217752501201407033233368018
*
*/
- @SerializedName(value = "out_trade_no")
- private String outTradeNo;
+ @SerializedName(value = "out_refund_no")
+ private String outRefundNo;
}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
index 9b42bd75be..73dad0c9d2 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
@@ -697,11 +697,11 @@ WxPayRefundQueryResult refundQuery(String transactionId, String outTradeNo, Stri
* 接口链接:https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/{out_refund_no}
*
*
- * @param outTradeNo 商户订单号
+ * @param outRefundNo 商户退款单号
* @return 退款信息 wx pay refund query result
* @throws WxPayException the wx pay exception
*/
- WxPayRefundQueryV3Result refundQueryV3(String outTradeNo) throws WxPayException;
+ WxPayRefundQueryV3Result refundQueryV3(String outRefundNo) throws WxPayException;
/**
*
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
index a80a7f4527..e5ef0be8be 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
@@ -305,15 +305,15 @@ public WxPayRefundQueryResult refundQueryV2(WxPayRefundQueryRequest request) thr
}
@Override
- public WxPayRefundQueryV3Result refundQueryV3(String outTradeNo) throws WxPayException {
- String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), outTradeNo);
+ public WxPayRefundQueryV3Result refundQueryV3(String outRefundNo) throws WxPayException {
+ String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), outRefundNo);
String response = this.getV3(url);
return GSON.fromJson(response, WxPayRefundQueryV3Result.class);
}
@Override
public WxPayRefundQueryV3Result refundQueryV3(WxPayRefundQueryV3Request request) throws WxPayException {
- String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), request.getOutTradeNo());
+ String url = String.format("%s/v3/refund/domestic/refunds/%s", this.getPayBaseUrl(), request.getOutRefundNo());
String response = this.getV3(url);
return GSON.fromJson(response, WxPayRefundQueryV3Result.class);
}
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
index e984b334fc..920d917ffc 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java
@@ -769,8 +769,8 @@ public void testRefundV3() throws WxPayException {
@Test
public void testRefundQueryV3() throws WxPayException {
WxPayRefundQueryV3Request request = new WxPayRefundQueryV3Request();
-// request.setOutTradeNo("n1ZvYqjAg3D7LUBa");
- request.setOutTradeNo("123456789011");
+// request.setOutRefundNo("n1ZvYqjAg3D7LUBa");
+ request.setOutRefundNo("123456789011");
WxPayRefundQueryV3Result result = this.payService.refundQueryV3(request);
System.out.println(GSON.toJson(result));
}
From abbfc85e24b16334426d13f114fab7b5c78cd786 Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Tue, 21 Sep 2021 17:07:10 +0800
Subject: [PATCH 0040/1263] Update README.md
---
README.md | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/README.md b/README.md
index 8f0a4f95b6..e8636426c8 100644
--- a/README.md
+++ b/README.md
@@ -28,9 +28,9 @@
- 1. 驰骋快速开发平台、工作流引擎、表单引擎采用GPL协议.
-2. 驰骋.net版称为ccflow, java版称为jflow,代码100%开源.
-3. 支持10多个国内外数据库. 单机版\集团版\SAAS版本.
+
1. 驰骋快速开发平台、工作流/表单引擎采用GPL协议。
+
2. 驰骋.NET版称为ccflow,Java版称为jflow,代码100%开源。
+
3. 支持10多个国内外数据库,有单机版\集团版\SAAS版本。
From b45c626e8299c9992270382cd90baf2a4b517cd5 Mon Sep 17 00:00:00 2001
From: yearliny
Date: Sat, 25 Sep 2021 23:05:28 +0800
Subject: [PATCH 0041/1263] =?UTF-8?q?:bug:=20=E4=BF=AE=E5=A4=8D=E6=9F=90?=
=?UTF-8?q?=E4=BA=9B=E6=83=85=E5=86=B5=E4=B8=8B=E4=BC=9A=E6=8A=9B=E5=87=BA?=
=?UTF-8?q?CannotResolveClassException=E5=BC=82=E5=B8=B8=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
https://stackoverflow.com/questions/9508292/nodecom-thoughtworks-xstream-mapper-cannotresolveclassexception-while-using-xstr
---
.../com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java | 1 +
1 file changed, 1 insertion(+)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
index 9f6f5e2700..6f66dfdd86 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/BaseWxPayResult.java
@@ -150,6 +150,7 @@ public static T fromXML(String xmlString, Class c
}
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(clz);
+ xstream.setClassLoader(BaseWxPayResult.class.getClassLoader());
T result = (T) xstream.fromXML(xmlString);
result.setXmlString(xmlString);
return result;
From cecdace1c59d28eaccecd15ae99801af305df6e0 Mon Sep 17 00:00:00 2001
From: nickname263
Date: Sat, 25 Sep 2021 23:06:19 +0800
Subject: [PATCH 0042/1263] =?UTF-8?q?:new:=20#2324=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=B7=BB=E5=8A=A0=E5=AF=B9?=
=?UTF-8?q?=E6=96=B0=E7=9A=84=E6=A8=A1=E7=89=88=E5=8D=A1=E7=89=87=E6=B6=88?=
=?UTF-8?q?=E6=81=AF=E7=9A=84=E6=94=AF=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/common/api/WxConsts.java | 31 ++
.../weixin/cp/bean/message/WxCpMessage.java | 281 ++++++++++++++++
.../messagebuilder/TemplateCardBuilder.java | 300 ++++++++++++++++++
.../cp/bean/templatecard/CheckboxOption.java | 49 +++
.../bean/templatecard/HorizontalContent.java | 66 ++++
.../cp/bean/templatecard/MultipleSelect.java | 68 ++++
.../bean/templatecard/TemplateCardButton.java | 49 +++
.../bean/templatecard/TemplateCardJump.java | 65 ++++
.../cp/bean/templatecard/VerticalContent.java | 44 +++
.../cp/bean/message/WxCpMessageTest.java | 283 +++++++++++++++++
10 files changed, 1236 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index 3e08462017..c1e6d39910 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -120,6 +120,37 @@ public static class KefuMsgType {
* 小程序通知消息.
*/
public static final String MINIPROGRAM_NOTICE = "miniprogram_notice";
+
+ /**
+ * 模板卡片消息.
+ */
+ public static final String TEMPLATE_CARD = "template_card";
+ }
+
+ /**
+ * 企业微信模板卡片消息的卡片类型
+ */
+ public static class TemplateCardType {
+ /**
+ * 文本通知型卡片
+ */
+ public static final String TEXT_NOTICE = "text_notice";
+ /**
+ * 图文展示型卡片
+ */
+ public static final String NEWS_NOTICE = "news_notice";
+ /**
+ * 按钮交互型卡片
+ */
+ public static final String BUTTON_INTERACTION = "button_interaction";
+ /**
+ * 投票选择型卡片
+ */
+ public static final String VOTE_INTERACTION = "vote_interaction";
+ /**
+ * 多项选择型卡片
+ */
+ public static final String MULTIPLE_INTERACTION = "multiple_interaction";
}
/**
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java
index 244e7fed07..a2f6e6c5c6 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpMessage.java
@@ -8,6 +8,7 @@
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.messagebuilder.*;
import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
+import me.chanjar.weixin.cp.bean.templatecard.*;
import org.apache.commons.lang3.StringUtils;
import java.io.Serializable;
@@ -70,6 +71,134 @@ public class WxCpMessage implements Serializable {
private String taskId;
private List taskButtons = new ArrayList<>();
+ /**
+ * 模板型卡片特有属性
+ */
+ /**
+ * 模板卡片类型,文本通知型卡片填写 “text_notice”,
+ * 图文展示型卡片此处填写 “news_notice”,
+ * 按钮交互型卡片填写”button_interaction”,
+ * 投票选择型卡片填写”vote_interaction”,
+ * 多项选择型卡片填写 “multiple_interaction”
+ */
+ private String card_type;
+
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的url
+ */
+ private String source_icon_url;
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的描述,建议不超过20个字
+ */
+ private String source_desc;
+
+ /**
+ * 一级标题,建议不超过36个字
+ */
+ private String main_title_title;
+ /**
+ * 标题辅助信息,建议不超过44个字
+ */
+ private String main_title_desc;
+
+ /**
+ * 图文展示型的卡片必须有图片字段。
+ * 图片的url.
+ */
+ private String card_image_url;
+
+ /**
+ * 图片的宽高比,宽高比要小于2.25,大于1.3,不填该参数默认1.3
+ */
+ private Float card_image_aspect_ratio;
+ /**
+ * 关键数据样式
+ * 关键数据样式的数据内容,建议不超过14个字
+ */
+ private String emphasis_content_title;
+ /**
+ * 关键数据样式的数据描述内容,建议不超过22个字
+ */
+ private String emphasis_content_desc;
+
+ /**
+ * 二级普通文本,建议不超过160个字
+ */
+ private String sub_title_text;
+
+ /**
+ * 卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过4
+ */
+ private List vertical_contents;
+
+ /**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List horizontal_contents;
+
+ /**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ */
+ private List jumps;
+
+ /**
+ * 整体卡片的点击跳转事件,text_notice必填本字段
+ * 跳转事件类型,1 代表跳转url,2 代表打开小程序。text_notice卡片模版中该字段取值范围为[1,2]
+ */
+ private Integer card_action_type;
+ /**
+ * 跳转事件的url,card_action.type是1时必填
+ */
+ private String card_action_url;
+
+ /**
+ * 跳转事件的小程序的appid,必须是与当前应用关联的小程序,card_action.type是2时必填
+ */
+ private String card_action_appid;
+
+ /**
+ * 跳转事件的小程序的pagepath,card_action.type是2时选填
+ */
+ private String card_action_pagepath;
+
+ /**
+ * 按钮交互型卡片需指定。
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List buttons;
+
+ /**
+ * 投票选择型卡片需要指定
+ * 选择题key值,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节
+ */
+ private String checkbox_question_key;
+
+ /**
+ * 选择题模式,单选:0,多选:1,不填默认0
+ */
+ private Integer checkbox_mode;
+
+ /**
+ * 选项list,选项个数不超过 20 个,最少1个
+ */
+ private List options;
+
+ /**
+ * 提交按钮样式
+ * 按钮文案,建议不超过10个字,不填默认为提交
+ */
+ private String submit_button_text;
+ /**
+ * 提交按钮的key,会产生回调事件将本参数作为EventKey返回,最长支持1024字节
+ */
+ private String submit_button_key;
+ /**
+ * 下拉式的选择器列表,multiple_interaction类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
+ */
+ private List selects;
+
/**
* 获得文本消息builder.
*/
@@ -140,6 +269,13 @@ public static TaskCardBuilder TASKCARD() {
return new TaskCardBuilder();
}
+ /**
+ * 获得任务卡片消息builder.
+ */
+ public static TemplateCardBuilder TEMPLATECARD() {
+ return new TemplateCardBuilder();
+ }
+
/**
* 获得小程序通知消息builder.
*/
@@ -160,6 +296,7 @@ public static MiniProgramNoticeMsgBuilder newMiniProgramNoticeBuilder() {
* {@link KefuMsgType#MARKDOWN}
* {@link KefuMsgType#TASKCARD}
* {@link KefuMsgType#MINIPROGRAM_NOTICE}
+ * {@link KefuMsgType#TEMPLATE_CARD}
*
*
* @param msgType 消息类型
@@ -328,6 +465,150 @@ private void handleMsgType(JsonObject messageJson) {
messageJson.add("miniprogram_notice", notice);
break;
}
+ case TEMPLATE_CARD: {
+ JsonObject template = new JsonObject();
+ template.addProperty("card_type", this.getCard_type());
+
+ if (StringUtils.isNotBlank(this.getSource_icon_url()) || StringUtils.isNotBlank(this.getSource_desc())) {
+ JsonObject source = new JsonObject();
+ if (StringUtils.isNotBlank(this.getSource_icon_url())) {
+ source.addProperty("icon_url", this.getSource_icon_url());
+ }
+ if (StringUtils.isNotBlank(this.getSource_desc())) {
+ source.addProperty("desc", this.getSource_desc());
+ }
+ template.add("source", source);
+ }
+
+ if (StringUtils.isNotBlank(this.getMain_title_title()) || StringUtils.isNotBlank(this.getMain_title_desc())) {
+ JsonObject main_title = new JsonObject();
+ if (StringUtils.isNotBlank(this.getMain_title_title())) {
+ main_title.addProperty("title", this.getMain_title_title());
+ }
+ if (StringUtils.isNotBlank(this.getMain_title_desc())) {
+ main_title.addProperty("desc", this.getMain_title_desc());
+ }
+ template.add("main_title", main_title);
+ }
+
+ if (StringUtils.isNotBlank(this.getEmphasis_content_title()) || StringUtils.isNotBlank(this.getEmphasis_content_desc())) {
+ JsonObject emphasis_content = new JsonObject();
+ if (StringUtils.isNotBlank(this.getEmphasis_content_title())) {
+ emphasis_content.addProperty("title", this.getEmphasis_content_title());
+ }
+ if (StringUtils.isNotBlank(this.getEmphasis_content_desc())) {
+ emphasis_content.addProperty("desc", this.getEmphasis_content_desc());
+ }
+ template.add("emphasis_content", emphasis_content);
+ }
+
+
+ if (StringUtils.isNotBlank(this.getSub_title_text())) {
+ template.addProperty("sub_title_text", this.getSub_title_text());
+ }
+
+ if (StringUtils.isNotBlank(this.getTaskId())) {
+ template.addProperty("task_id", this.getTaskId());
+ }
+
+ List verticalContents = this.getVertical_contents();
+ if(null != verticalContents && verticalContents.size() > 0) {
+ JsonArray vContentJsonArray = new JsonArray();
+ for (VerticalContent vContent : this.getVertical_contents()) {
+ JsonObject tempObject = vContent.toJson();
+ vContentJsonArray.add(tempObject);
+ }
+ template.add("vertical_content_list", vContentJsonArray);
+ }
+
+ List horizontalContents = this.getHorizontal_contents();
+ if(null != horizontalContents && horizontalContents.size() > 0) {
+ JsonArray hContentJsonArray = new JsonArray();
+ for (HorizontalContent hContent : this.getHorizontal_contents()) {
+ JsonObject tempObject = hContent.toJson();
+ hContentJsonArray.add(tempObject);
+ }
+ template.add("horizontal_content_list", hContentJsonArray);
+ }
+
+ List jumps = this.getJumps();
+ if(null != jumps && jumps.size() > 0) {
+ JsonArray jumpJsonArray = new JsonArray();
+ for (TemplateCardJump jump : this.getJumps()) {
+ JsonObject tempObject = jump.toJson();
+ jumpJsonArray.add(tempObject);
+ }
+ template.add("jump_list", jumpJsonArray);
+ }
+
+ if (null != this.getCard_action_type()) {
+ JsonObject cardAction = new JsonObject();
+ cardAction.addProperty("type", this.getCard_action_type());
+ if (StringUtils.isNotBlank(this.getCard_action_url())) {
+ cardAction.addProperty("url", this.getCard_action_url());
+ }
+ if (StringUtils.isNotBlank(this.getCard_action_appid())) {
+ cardAction.addProperty("appid", this.getCard_action_appid());
+ }
+ if (StringUtils.isNotBlank(this.getCard_action_pagepath())) {
+ cardAction.addProperty("pagepath", this.getCard_action_pagepath());
+ }
+ template.add("card_action", cardAction);
+ }
+
+ List buttons = this.getButtons();
+ if(null != buttons && buttons.size() > 0) {
+ JsonArray btnJsonArray = new JsonArray();
+ for (TemplateCardButton btn : this.getButtons()) {
+ JsonObject tempObject = btn.toJson();
+ btnJsonArray.add(tempObject);
+ }
+ template.add("button_list", btnJsonArray);
+ }
+
+ // checkbox
+ if (StringUtils.isNotBlank(this.getCheckbox_question_key())) {
+ JsonObject checkBox = new JsonObject();
+ checkBox.addProperty("question_key", this.getCheckbox_question_key());
+ if (null != this.getCheckbox_mode()) {
+ checkBox.addProperty("mode", this.getCheckbox_mode());
+ }
+ JsonArray optionArray = new JsonArray();
+ for (CheckboxOption option : this.getOptions()) {
+ JsonObject tempObject = option.toJson();
+ optionArray.add(tempObject);
+ }
+ checkBox.add("option_list", optionArray);
+
+ template.add("checkbox", checkBox);
+ }
+
+ // submit_button
+ if (StringUtils.isNotBlank(this.getSubmit_button_text()) || StringUtils.isNotBlank(this.getSubmit_button_key())) {
+ JsonObject submit_button = new JsonObject();
+ if (StringUtils.isNotBlank(this.getSubmit_button_text())) {
+ submit_button.addProperty("text", this.getSubmit_button_text());
+ }
+ if (StringUtils.isNotBlank(this.getSubmit_button_key())) {
+ submit_button.addProperty("key", this.getSubmit_button_key());
+ }
+ template.add("submit_button", submit_button);
+ }
+
+ // select_list
+ List selects = this.getSelects();
+ if(null != selects && selects.size() > 0) {
+ JsonArray selectJsonArray = new JsonArray();
+ for (MultipleSelect select : this.getSelects()) {
+ JsonObject tempObject = select.toJson();
+ selectJsonArray.add(tempObject);
+ }
+ template.add("select_list", selectJsonArray);
+ }
+
+ messageJson.add("template_card", template);
+ break;
+ }
default: {
// do nothing
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java
new file mode 100644
index 0000000000..7a29491ab1
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/messagebuilder/TemplateCardBuilder.java
@@ -0,0 +1,300 @@
+package me.chanjar.weixin.cp.bean.messagebuilder;
+
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.cp.bean.message.WxCpMessage;
+import me.chanjar.weixin.cp.bean.templatecard.*;
+
+import java.util.List;
+/**
+ *
+ * 模板卡片消息Builder
+ * 用法: WxCustomMessage m = WxCustomMessage.TEMPLATECARD().title(...)....toUser(...).build();
+ *
+ *
+ * @author yzts
+ * @date 2019-05-16
+ */
+public class TemplateCardBuilder extends BaseBuilder{
+ /**
+ * 模板卡片类型,文本通知型卡片填写 “text_notice”,
+ * 图文展示型卡片此处填写 “news_notice”,
+ * 按钮交互型卡片填写”button_interaction”,
+ * 投票选择型卡片填写”vote_interaction”,
+ * 多项选择型卡片填写 “multiple_interaction”
+ */
+ private String card_type;
+
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的url
+ */
+ private String source_icon_url;
+ /**
+ * 卡片来源样式信息,不需要来源样式可不填写
+ * 来源图片的描述,建议不超过20个字
+ */
+ private String source_desc;
+
+ /**
+ * 一级标题,建议不超过36个字
+ */
+ private String main_title_title;
+ /**
+ * 标题辅助信息,建议不超过44个字
+ */
+ private String main_title_desc;
+
+ /**
+ * 图文展示型的卡片必须有图片字段。
+ * 图片的url.
+ */
+ private String card_image_url;
+
+ /**
+ * 图片的宽高比,宽高比要小于2.25,大于1.3,不填该参数默认1.3
+ */
+ private Float card_image_aspect_ratio;
+ /**
+ * 关键数据样式
+ * 关键数据样式的数据内容,建议不超过14个字
+ */
+ private String emphasis_content_title;
+ /**
+ * 关键数据样式的数据描述内容,建议不超过22个字
+ */
+ private String emphasis_content_desc;
+
+ /**
+ * 二级普通文本,建议不超过160个字
+ */
+ private String sub_title_text;
+
+ /**
+ * 卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过4
+ */
+ private List vertical_contents;
+
+ /**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List horizontal_contents;
+
+ /**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ */
+ private List jumps;
+
+ /**
+ * 整体卡片的点击跳转事件,text_notice必填本字段
+ * 跳转事件类型,1 代表跳转url,2 代表打开小程序。text_notice卡片模版中该字段取值范围为[1,2]
+ */
+ private Integer card_action_type;
+ /**
+ * 跳转事件的url,card_action.type是1时必填
+ */
+ private String card_action_url;
+
+ /**
+ * 跳转事件的小程序的appid,必须是与当前应用关联的小程序,card_action.type是2时必填
+ */
+ private String card_action_appid;
+
+ /**
+ * 跳转事件的小程序的pagepath,card_action.type是2时选填
+ */
+ private String card_action_pagepath;
+
+ /**
+ * 任务id,同一个应用任务id不能重复,只能由数字、字母和“_-@”组成,最长128字节
+ */
+ private String task_id;
+
+ /**
+ * 按钮交互型卡片需指定。
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ */
+ private List buttons;
+
+ /**
+ * 投票选择型卡片需要指定
+ * 选择题key值,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节
+ */
+ private String checkbox_question_key;
+
+ /**
+ * 选择题模式,单选:0,多选:1,不填默认0
+ */
+ private Integer checkbox_mode;
+
+ /**
+ * 选项list,选项个数不超过 20 个,最少1个
+ */
+ private List options;
+
+ /**
+ * 提交按钮样式
+ * 按钮文案,建议不超过10个字,不填默认为提交
+ */
+ private String submit_button_text;
+ /**
+ * 提交按钮的key,会产生回调事件将本参数作为EventKey返回,最长支持1024字节
+ */
+ private String submit_button_key;
+
+ /**
+ * 下拉式的选择器列表,multiple_interaction类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
+ */
+ private List selects;
+
+
+ public TemplateCardBuilder() {
+ this.msgType = WxConsts.KefuMsgType.TEMPLATE_CARD;
+ }
+
+ public TemplateCardBuilder card_type(String card_type) {
+ this.card_type = card_type;
+ return this;
+ }
+
+ public TemplateCardBuilder source_icon_url(String source_icon_url) {
+ this.source_icon_url = source_icon_url;
+ return this;
+ }
+
+ public TemplateCardBuilder source_desc(String source_desc) {
+ this.source_desc = source_desc;
+ return this;
+ }
+
+ public TemplateCardBuilder main_title_title(String main_title_title) {
+ this.main_title_title = main_title_title;
+ return this;
+ }
+
+ public TemplateCardBuilder main_title_desc(String mainTitleDesc) {
+ this.main_title_desc = mainTitleDesc;
+ return this;
+ }
+
+ public TemplateCardBuilder emphasis_content_title(String emphasis_content_title) {
+ this.emphasis_content_title = emphasis_content_title;
+ return this;
+ }
+
+ public TemplateCardBuilder emphasis_content_desc(String emphasis_content_desc) {
+ this.emphasis_content_desc = emphasis_content_desc;
+ return this;
+ }
+
+ public TemplateCardBuilder sub_title_text(String sub_title_text) {
+ this.sub_title_text = sub_title_text;
+ return this;
+ }
+
+ public TemplateCardBuilder vertical_contents(List vertical_contents) {
+ this.vertical_contents = vertical_contents;
+ return this;
+ }
+
+ public TemplateCardBuilder horizontal_contents(List horizontal_contents) {
+ this.horizontal_contents = horizontal_contents;
+ return this;
+ }
+
+ public TemplateCardBuilder jumps(List jumps) {
+ this.jumps = jumps;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_type(Integer card_action_type) {
+ this.card_action_type = card_action_type;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_url(String card_action_url) {
+ this.card_action_url = card_action_url;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_appid(String card_action_appid) {
+ this.card_action_appid = card_action_appid;
+ return this;
+ }
+
+ public TemplateCardBuilder card_action_pagepath(String card_action_pagepath) {
+ this.card_action_pagepath = card_action_pagepath;
+ return this;
+ }
+
+ public TemplateCardBuilder task_id(String taskId) {
+ this.task_id = taskId;
+ return this;
+ }
+
+ public TemplateCardBuilder buttons(List buttons) {
+ this.buttons = buttons;
+ return this;
+ }
+
+ public TemplateCardBuilder checkbox_question_key(String checkbox_question_key) {
+ this.checkbox_question_key = checkbox_question_key;
+ return this;
+ }
+
+ public TemplateCardBuilder checkbox_mode(Integer checkbox_mode) {
+ this.checkbox_mode = checkbox_mode;
+ return this;
+ }
+
+ public TemplateCardBuilder options(List options) {
+ this.options = options;
+ return this;
+ }
+
+ public TemplateCardBuilder submit_button_text(String submit_button_text) {
+ this.submit_button_text = submit_button_text;
+ return this;
+ }
+
+ public TemplateCardBuilder submit_button_key(String submit_button_key) {
+ this.submit_button_key = submit_button_key;
+ return this;
+ }
+
+ public TemplateCardBuilder selects(List selects) {
+ this.selects = selects;
+ return this;
+ }
+
+ @Override
+ public WxCpMessage build() {
+ WxCpMessage m = super.build();
+ m.setSafe(null);
+ m.setCard_type(this.card_type);
+ m.setSource_icon_url(this.source_icon_url);
+ m.setSource_desc(this.source_desc);
+ m.setMain_title_title(this.main_title_title);
+ m.setMain_title_desc(this.main_title_desc);
+ m.setCard_image_url(this.card_image_url);
+ m.setCard_image_aspect_ratio(this.card_image_aspect_ratio);
+ m.setEmphasis_content_title(this.emphasis_content_title);
+ m.setEmphasis_content_desc(this.emphasis_content_desc);
+ m.setSub_title_text(this.sub_title_text);
+ m.setVertical_contents(this.vertical_contents);
+ m.setHorizontal_contents(this.horizontal_contents);
+ m.setJumps(this.jumps);
+ m.setCard_action_type(this.card_action_type);
+ m.setCard_action_appid(this.card_action_appid);
+ m.setCard_action_pagepath(this.card_action_pagepath);
+ m.setCard_action_url(this.card_action_url);
+ m.setTaskId(this.task_id);
+ m.setButtons(this.buttons);
+ m.setCheckbox_mode(this.checkbox_mode);
+ m.setCheckbox_question_key(this.checkbox_question_key);
+ m.setOptions(this.options);
+ m.setSubmit_button_text(this.submit_button_text);
+ m.setSubmit_button_key(this.submit_button_key);
+ m.setSelects(this.selects);
+ return m;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java
new file mode 100644
index 0000000000..2f6b5b1a97
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/CheckboxOption.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class CheckboxOption implements Serializable {
+ private static final long serialVersionUID = 5405702239190050250L;
+
+ /**
+ * 选项id,用户提交选项后,会产生回调事件,回调事件会带上该id值表示该选项,最长支持128字节,不可重复
+ * 必填
+ */
+ private String id;
+ /**
+ * 选项文案描述,建议不超过17个字.
+ * 必填
+ */
+ private String text;
+ /**
+ * 该选项是否要默认选中
+ * 必填
+ */
+ private Boolean is_checked;
+
+ public JsonObject toJson() {
+ JsonObject optionJson = new JsonObject();
+ optionJson.addProperty("id", this.getId());
+ optionJson.addProperty("text", this.getText());
+ if(null != this.getIs_checked()) {
+ optionJson.addProperty("is_checked", this.getIs_checked());
+ }
+ return optionJson;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java
new file mode 100644
index 0000000000..4f1160e933
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/HorizontalContent.java
@@ -0,0 +1,66 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 二级标题+文本列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class HorizontalContent implements Serializable {
+
+ private static final long serialVersionUID = -2209656515382964372L;
+
+ /**
+ * 链接类型,0或不填代表不是链接,1 代表跳转url,2 代表下载附件
+ */
+ private Integer type;
+ /**
+ * 二级标题,建议不超过5个字
+ */
+ private String keyname;
+ /**
+ * 二级文本,如果horizontal_content_list.type是2,该字段代表文件名称(要包含文件类型),建议不超过30个字
+ */
+ private String value;
+ /**
+ * 链接跳转的url,horizontal_content_list.type是1时必填
+ */
+ private String url;
+ /**
+ * 附件的media_id,horizontal_content_list.type是2时必填
+ */
+ private String media_id;
+
+ public JsonObject toJson() {
+ JsonObject hContentJson = new JsonObject();
+
+ if(null != this.getType()){
+ hContentJson.addProperty("type", this.getType());
+ }
+ hContentJson.addProperty("keyname", this.getKeyname());
+
+ if (StringUtils.isNotBlank(this.getValue())) {
+ hContentJson.addProperty("value", this.getValue());
+ }
+ if (StringUtils.isNotBlank(this.getUrl())) {
+ hContentJson.addProperty("url", this.getUrl());
+ }
+ if (StringUtils.isNotBlank(this.getMedia_id())) {
+ hContentJson.addProperty("media_id", this.getMedia_id());
+ }
+ return hContentJson;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java
new file mode 100644
index 0000000000..145a6c4426
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/MultipleSelect.java
@@ -0,0 +1,68 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 下拉式的选择器列表,multiple_interaction类型的卡片该字段不可为空,一个消息最多支持 3 个选择器
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MultipleSelect implements Serializable {
+ private static final long serialVersionUID = 3446092543065698516L;
+
+ /**
+ * 下拉式的选择器题目的key,用户提交选项后,会产生回调事件,回调事件会带上该key值表示该题,最长支持1024字节,不可重复
+ */
+ private String question_key;
+ /**
+ * 下拉式的选择器上面的title
+ */
+ private String title;
+ /**
+ * 默认选定的id,不填或错填默认第一个
+ */
+ private String selected_id;
+
+ /**
+ * 选项列表,下拉选项不超过 10 个,最少1个
+ */
+ private List options;
+
+ public JsonObject toJson() {
+ JsonObject selectJson = new JsonObject();
+
+ selectJson.addProperty("question_key", this.getQuestion_key());
+
+ if (StringUtils.isNotBlank(this.getTitle())) {
+ selectJson.addProperty("title", this.getTitle());
+ }
+ if (StringUtils.isNotBlank(this.getSelected_id())) {
+ selectJson.addProperty("selected_id", this.getSelected_id());
+ }
+// select_list
+ List options = this.getOptions();
+ if(null != options && options.size() > 0) {
+ JsonArray optionJsonArray = new JsonArray();
+ for (CheckboxOption option : this.getOptions()) {
+ JsonObject tempObject = option.toJson();
+ optionJsonArray.add(tempObject);
+ }
+ selectJson.add("option_list", optionJsonArray);
+ }
+
+ return selectJson;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java
new file mode 100644
index 0000000000..4ac9e005e4
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardButton.java
@@ -0,0 +1,49 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 按钮列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过6
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TemplateCardButton implements Serializable {
+ private static final long serialVersionUID = -4826551822490837002L;
+
+ /**
+ * 按钮文案,建议不超过10个字
+ */
+ private String text;
+ /**
+ * 按钮样式,目前可填1~4,不填或错填默认1
+ */
+ private Integer style;
+ /**
+ * 按钮key值,用户点击后,会产生回调事件将本参数作为EventKey返回,回调事件会带上该key值,最长支持1024字节,不可重复
+ */
+ private String key;
+
+ public JsonObject toJson() {
+ JsonObject btnObject = new JsonObject();
+
+
+ btnObject.addProperty("text", this.getText());
+
+ if (null != this.getStyle()) {
+ btnObject.addProperty("style", this.getStyle());
+ }
+ btnObject.addProperty("key", this.getKey());
+ return btnObject;
+ }
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java
new file mode 100644
index 0000000000..6d297e9c0b
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/TemplateCardJump.java
@@ -0,0 +1,65 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 跳转指引样式的列表,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过3
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class TemplateCardJump implements Serializable {
+ private static final long serialVersionUID = 4440089247405968074L;
+
+ /**
+ * 跳转链接类型,0或不填代表不是链接,1 代表跳转url,2 代表跳转小程序
+ */
+ private Integer type;
+ /**
+ * 跳转链接样式的文案内容,建议不超过18个字
+ */
+ private String title;
+ /**
+ * 跳转链接的url,jump_list.type是1时必填
+ */
+ private String url;
+ /**
+ * 跳转链接的小程序的appid,必须是与当前应用关联的小程序,jump_list.type是2时必填
+ */
+ private String appid;
+ /**
+ * 跳转链接的小程序的pagepath,jump_list.type是2时选填
+ */
+ private String pagepath;
+
+ public JsonObject toJson() {
+ JsonObject hContentJson = new JsonObject();
+
+ if(null != this.getType()){
+ hContentJson.addProperty("type", this.getType());
+ }
+ hContentJson.addProperty("title", this.getTitle());
+
+ if (StringUtils.isNotBlank(this.getUrl())) {
+ hContentJson.addProperty("url", this.getUrl());
+ }
+ if (StringUtils.isNotBlank(this.getAppid())) {
+ hContentJson.addProperty("appid", this.getAppid());
+ }
+ if (StringUtils.isNotBlank(this.getPagepath())) {
+ hContentJson.addProperty("pagepath", this.getPagepath());
+ }
+ return hContentJson;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java
new file mode 100644
index 0000000000..7d364ff106
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/templatecard/VerticalContent.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.cp.bean.templatecard;
+
+import com.google.gson.JsonObject;
+import kotlin.text.UStringsKt;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 卡片二级垂直内容,该字段可为空数组,但有数据的话需确认对应字段是否必填,列表长度不超过4
+ * @author yzts
+ * @date 2021/9/22
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class VerticalContent implements Serializable {
+ private static final long serialVersionUID = -1383852553854573558L;
+
+ /**
+ * 卡片二级标题,建议不超过38个字.必填字段
+ */
+ private String title;
+ /**
+ * 二级普通文本,建议不超过160个字
+ */
+ private String desc;
+
+ public JsonObject toJson() {
+ JsonObject vContentJson = new JsonObject();
+
+ vContentJson.addProperty("title", this.getTitle());
+
+ if (StringUtils.isNotBlank(this.getDesc())) {
+ vContentJson.addProperty("desc", this.getDesc());
+ }
+ return vContentJson;
+ }
+}
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java
index 3f7859116e..a1cfee801b 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/bean/message/WxCpMessageTest.java
@@ -1,9 +1,12 @@
package me.chanjar.weixin.cp.bean.message;
+import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.cp.bean.article.MpnewsArticle;
import me.chanjar.weixin.cp.bean.article.NewArticle;
import me.chanjar.weixin.cp.bean.message.WxCpMessage;
import me.chanjar.weixin.cp.bean.taskcard.TaskCardButton;
+import me.chanjar.weixin.cp.bean.templatecard.*;
+import org.testng.Assert;
import org.testng.annotations.Test;
import java.util.Arrays;
@@ -141,4 +144,284 @@ public void testTaskCardBuilder() {
.isEqualTo("{\"touser\":\"OPENID\",\"msgtype\":\"taskcard\",\"taskcard\":{\"title\":\"任务卡片\",\"description\":\"有一条待处理任务\",\"url\":\"http://www.qq.com\",\"task_id\":\"task_123\",\"btn\":[{\"key\":\"yes\",\"name\":\"批准\",\"replace_name\":\"已批准\",\"color\":\"blue\",\"is_bold\":true},{\"key\":\"yes\",\"name\":\"拒绝\",\"replace_name\":\"已拒绝\",\"color\":\"red\",\"is_bold\":false}]}}");
}
+ /**
+ * 测试模板卡片消息
+ * 文本通知型
+ */
+ public void TestTemplateCardBuilder_text_notice() {
+
+ HorizontalContent hContent1 = HorizontalContent.builder()
+ .keyname("邀请人")
+ .value("张三")
+ .build();
+ HorizontalContent hContent2 = HorizontalContent.builder()
+ .type(1)
+ .keyname("企业微信官网")
+ .value("点击访问")
+ .url("https://work.weixin.qq.com")
+ .build();
+ HorizontalContent hContent3 = HorizontalContent.builder()
+ .type(2)
+ .keyname("企业微信下载")
+ .value("企业微信.apk")
+ .media_id("文件的media_id")
+ .build();
+
+ TemplateCardJump jump1 = TemplateCardJump.builder()
+ .type(1)
+ .title("企业微信官网")
+ .url("https://work.weixin.qq.com")
+ .build();
+ TemplateCardJump jump2 = TemplateCardJump.builder()
+ .type(2)
+ .title("跳转小程序")
+ .appid("小程序的appid")
+ .pagepath("/index.html")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.TEXT_NOTICE)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .emphasis_content_title("100")
+ .emphasis_content_desc("核心数据")
+ .sub_title_text("下载企业微信还能抢红包!")
+ .horizontal_contents(Arrays.asList(hContent1,hContent2,hContent3))
+ .jumps(Arrays.asList(jump1,jump2))
+ .card_action_type(2)
+ .card_action_appid("小程序的appid")
+ .card_action_url("https://work.weixin.qq.com")
+ .card_action_pagepath("/index.html")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+// System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"text_notice\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"emphasis_content\":{\"title\":\"100\",\"desc\":\"核心数据\"},\"sub_title_text\":\"下载企业微信还能抢红包!\",\"horizontal_content_list\":[{\"keyname\":\"邀请人\",\"value\":\"张三\"},{\"type\":1,\"keyname\":\"企业微信官网\",\"value\":\"点击访问\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"keyname\":\"企业微信下载\",\"value\":\"企业微信.apk\",\"media_id\":\"文件的media_id\"}],\"jump_list\":[{\"type\":1,\"title\":\"企业微信官网\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"title\":\"跳转小程序\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}],\"card_action\":{\"type\":2,\"url\":\"https://work.weixin.qq.com\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}}}");
+
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 图文展示型
+ */
+ public void TestTemplateCardBuilder_news_notice() {
+
+ VerticalContent vContent1 = VerticalContent.builder()
+ .title("惊喜红包等你来拿")
+ .desc("下载企业微信还能抢红包!")
+ .build();
+ VerticalContent vContent2 = VerticalContent.builder()
+ .title("二级垂直内容")
+ .desc("二级垂直内容!")
+ .build();
+
+ HorizontalContent hContent1 = HorizontalContent.builder()
+ .keyname("邀请人")
+ .value("张三")
+ .build();
+ HorizontalContent hContent2 = HorizontalContent.builder()
+ .type(1)
+ .keyname("企业微信官网")
+ .value("点击访问")
+ .url("https://work.weixin.qq.com")
+ .build();
+ HorizontalContent hContent3 = HorizontalContent.builder()
+ .type(2)
+ .keyname("企业微信下载")
+ .value("企业微信.apk")
+ .media_id("文件的media_id")
+ .build();
+
+ TemplateCardJump jump1 = TemplateCardJump.builder()
+ .type(1)
+ .title("企业微信官网")
+ .url("https://work.weixin.qq.com")
+ .build();
+ TemplateCardJump jump2 = TemplateCardJump.builder()
+ .type(2)
+ .title("跳转小程序")
+ .appid("小程序的appid")
+ .pagepath("/index.html")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.NEWS_NOTICE)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .vertical_contents(Arrays.asList(vContent1,vContent2))
+ .horizontal_contents(Arrays.asList(hContent1,hContent2,hContent3))
+ .jumps(Arrays.asList(jump1,jump2))
+ .card_action_type(2)
+ .card_action_appid("小程序的appid")
+ .card_action_url("https://work.weixin.qq.com")
+ .card_action_pagepath("/index.html")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"news_notice\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"vertical_content_list\":[{\"title\":\"惊喜红包等你来拿\",\"desc\":\"下载企业微信还能抢红包!\"},{\"title\":\"二级垂直内容\",\"desc\":\"二级垂直内容!\"}],\"horizontal_content_list\":[{\"keyname\":\"邀请人\",\"value\":\"张三\"},{\"type\":1,\"keyname\":\"企业微信官网\",\"value\":\"点击访问\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"keyname\":\"企业微信下载\",\"value\":\"企业微信.apk\",\"media_id\":\"文件的media_id\"}],\"jump_list\":[{\"type\":1,\"title\":\"企业微信官网\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"title\":\"跳转小程序\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}],\"card_action\":{\"type\":2,\"url\":\"https://work.weixin.qq.com\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"}}}");
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 按钮交互型
+ */
+ public void TestTemplateCardBuilder_button_interaction() {
+
+ TemplateCardButton tButton1 = TemplateCardButton.builder()
+ .text("按钮1")
+ .style(1)
+ .key("button_key_1")
+ .build();
+ TemplateCardButton tButton2 = TemplateCardButton.builder()
+ .text("按钮2")
+ .style(2)
+ .key("button_key_2")
+ .build();
+
+ HorizontalContent hContent1 = HorizontalContent.builder()
+ .keyname("邀请人")
+ .value("张三")
+ .build();
+ HorizontalContent hContent2 = HorizontalContent.builder()
+ .type(1)
+ .keyname("企业微信官网")
+ .value("点击访问")
+ .url("https://work.weixin.qq.com")
+ .build();
+ HorizontalContent hContent3 = HorizontalContent.builder()
+ .type(2)
+ .keyname("企业微信下载")
+ .value("企业微信.apk")
+ .media_id("文件的media_id")
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.BUTTON_INTERACTION)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .sub_title_text("下载企业微信还能抢红包!")
+ .horizontal_contents(Arrays.asList(hContent1,hContent2,hContent3))
+ .card_action_type(2)
+ .card_action_appid("小程序的appid")
+ .card_action_url("https://work.weixin.qq.com")
+ .card_action_pagepath("/index.html")
+ .task_id("task_id")
+ .buttons(Arrays.asList(tButton1,tButton2))
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"button_interaction\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"sub_title_text\":\"下载企业微信还能抢红包!\",\"task_id\":\"task_id\",\"horizontal_content_list\":[{\"keyname\":\"邀请人\",\"value\":\"张三\"},{\"type\":1,\"keyname\":\"企业微信官网\",\"value\":\"点击访问\",\"url\":\"https://work.weixin.qq.com\"},{\"type\":2,\"keyname\":\"企业微信下载\",\"value\":\"企业微信.apk\",\"media_id\":\"文件的media_id\"}],\"card_action\":{\"type\":2,\"url\":\"https://work.weixin.qq.com\",\"appid\":\"小程序的appid\",\"pagepath\":\"/index.html\"},\"button_list\":[{\"text\":\"按钮1\",\"style\":1,\"key\":\"button_key_1\"},{\"text\":\"按钮2\",\"style\":2,\"key\":\"button_key_2\"}]}}");
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 投票选择型
+ */
+ public void TestTemplateCardBuilder_vote_interaction() {
+ CheckboxOption option1 = CheckboxOption.builder()
+ .id("option_id1")
+ .text("选择题选项1")
+ .is_checked(true)
+ .build();
+ CheckboxOption option2 = CheckboxOption.builder()
+ .id("option_id2")
+ .text("选择题选项2")
+ .is_checked(false)
+ .build();
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.VOTE_INTERACTION)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .task_id("task_id")
+ .checkbox_question_key("question_key1")
+ .checkbox_mode(1)
+ .options(Arrays.asList(option1,option2))
+ .submit_button_key("key")
+ .submit_button_text("提交")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"vote_interaction\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"task_id\":\"task_id\",\"checkbox\":{\"question_key\":\"question_key1\",\"mode\":1,\"option_list\":[{\"id\":\"option_id1\",\"text\":\"选择题选项1\",\"is_checked\":true},{\"id\":\"option_id2\",\"text\":\"选择题选项2\",\"is_checked\":false}]},\"submit_button\":{\"text\":\"提交\",\"key\":\"key\"}}}");
+ }
+
+ /**
+ * 测试模板卡片消息
+ * 投票选择型
+ */
+ public void TestTemplateCardBuilder_multiple_interaction() {
+ CheckboxOption option1 = CheckboxOption.builder()
+ .id("selection_id1")
+ .text("选择器选项1")
+ .build();
+ CheckboxOption option2 = CheckboxOption.builder()
+ .id("selection_id2")
+ .text("选择题选项2")
+ .build();
+ CheckboxOption option3 = CheckboxOption.builder()
+ .id("selection_id3")
+ .text("选择器选项3")
+ .build();
+ CheckboxOption option4 = CheckboxOption.builder()
+ .id("selection_id4")
+ .text("选择题选项4")
+ .build();
+
+ MultipleSelect mSelect1 = MultipleSelect.builder()
+ .question_key("question_key1")
+ .title("选择器标签1")
+ .selected_id("selection_id1")
+ .options(Arrays.asList(option1,option2))
+ .build();
+ MultipleSelect mSelect2 = MultipleSelect.builder()
+ .question_key("question_key2")
+ .title("选择器标签2")
+ .selected_id("selection_id3")
+ .options(Arrays.asList(option3,option4))
+ .build();
+
+
+ WxCpMessage reply = WxCpMessage.TEMPLATECARD().toUser("OPENID")
+ .agentId(1000002)
+ .card_type(WxConsts.TemplateCardType.MULTIPLE_INTERACTION)
+ .source_icon_url("图片的url")
+ .source_desc("企业微信")
+ .main_title_title("欢迎使用企业微信")
+ .main_title_desc("您的好友正在邀请您加入企业微信")
+ .task_id("task_id")
+ .selects(Arrays.asList(mSelect1,mSelect2))
+ .submit_button_key("key")
+ .submit_button_text("提交")
+ .build();
+ reply.setEnableIdTrans(false);
+ reply.setEnableDuplicateCheck(false);
+ reply.setDuplicateCheckInterval(1800);
+ System.out.println(reply.toJson());
+ assertThat(reply.toJson())
+ .isEqualTo("{\"agentid\":1000002,\"touser\":\"OPENID\",\"msgtype\":\"template_card\",\"duplicate_check_interval\":1800,\"template_card\":{\"card_type\":\"multiple_interaction\",\"source\":{\"icon_url\":\"图片的url\",\"desc\":\"企业微信\"},\"main_title\":{\"title\":\"欢迎使用企业微信\",\"desc\":\"您的好友正在邀请您加入企业微信\"},\"task_id\":\"task_id\",\"submit_button\":{\"text\":\"提交\",\"key\":\"key\"},\"select_list\":[{\"question_key\":\"question_key1\",\"title\":\"选择器标签1\",\"selected_id\":\"selection_id1\",\"option_list\":[{\"id\":\"selection_id1\",\"text\":\"选择器选项1\"},{\"id\":\"selection_id2\",\"text\":\"选择题选项2\"}]},{\"question_key\":\"question_key2\",\"title\":\"选择器标签2\",\"selected_id\":\"selection_id3\",\"option_list\":[{\"id\":\"selection_id3\",\"text\":\"选择器选项3\"},{\"id\":\"selection_id4\",\"text\":\"选择题选项4\"}]}]}}");
+ }
+
}
From 56d2b5f57acb16502e393a285129c299b9478547 Mon Sep 17 00:00:00 2001
From: nickname263
Date: Mon, 27 Sep 2021 17:27:46 +0800
Subject: [PATCH 0043/1263] =?UTF-8?q?:new:=E3=80=90=E4=BC=81=E4=B8=9A?=
=?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=E6=B7=BB=E5=8A=A0=E5=AF=B9=E6=96=B0?=
=?UTF-8?q?=E7=9A=84=E6=A8=A1=E6=9D=BF=E5=8D=A1=E7=89=87=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E6=B6=88=E6=81=AF=E2=80=9C=E6=9B=B4=E6=96=B0=E7=82=B9=E5=87=BB?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E7=9A=84=E6=8C=89=E9=92=AE=E7=82=B9=E5=87=BB?=
=?UTF-8?q?=E6=96=87=E6=A1=88=E6=B6=88=E6=81=AF=E2=80=9D=E7=9A=84=E6=94=AF?=
=?UTF-8?q?=E6=8C=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../chanjar/weixin/common/api/WxConsts.java | 1 +
.../cp/bean/message/WxCpXmlOutMessage.java | 8 +++++
.../message/WxCpXmlOutUpdateBtnMessage.java | 33 +++++++++++++++++++
.../outxmlbuilder/UpdateButtonBuilder.java | 29 ++++++++++++++++
.../cp/util/xml/XStreamTransformer.java | 7 ++++
5 files changed, 78 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
index c1e6d39910..01b1d36483 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/api/WxConsts.java
@@ -45,6 +45,7 @@ public static class XmlMsgType {
public static final String HARDWARE = "hardware";
public static final String TRANSFER_CUSTOMER_SERVICE = "transfer_customer_service";
public static final String UPDATE_TASKCARD = "update_taskcard";
+ public static final String UPDATE_BUTTON = "update_button";
}
/**
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
index ff036b4c0e..70882561b7 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutMessage.java
@@ -78,6 +78,14 @@ public static NewsBuilder NEWS() {
public static TaskCardBuilder TASK_CARD() {
return new TaskCardBuilder();
}
+
+ /**
+ * 获得任务卡片消息builder.
+ */
+ public static UpdateButtonBuilder UPDATE_BUTTON() {
+ return new UpdateButtonBuilder();
+ }
+
protected String toXml() {
return XStreamTransformer.toXml((Class) this.getClass(), this);
}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java
new file mode 100644
index 0000000000..b0428469f1
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/message/WxCpXmlOutUpdateBtnMessage.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.cp.bean.message;
+
+import com.thoughtworks.xstream.annotations.XStreamAlias;
+import com.thoughtworks.xstream.annotations.XStreamConverter;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import me.chanjar.weixin.common.api.WxConsts;
+import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
+import me.chanjar.weixin.common.util.xml.XStreamMediaIdConverter;
+import me.chanjar.weixin.common.util.xml.XStreamReplaceNameConverter;
+
+import java.io.Serializable;
+
+/**
+ * @author nickname263
+ * @date 2021-09-23
+ */
+@XStreamAlias("xml")
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class WxCpXmlOutUpdateBtnMessage extends WxCpXmlOutMessage {
+ private static final long serialVersionUID = 976182367423048138L;
+ @XStreamAlias("Button")
+ @XStreamConverter(value = XStreamReplaceNameConverter.class)
+ private String replaceName;
+
+ public WxCpXmlOutUpdateBtnMessage() {
+ this.msgType = WxConsts.XmlMsgType.UPDATE_BUTTON;
+ }
+
+
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java
new file mode 100644
index 0000000000..d4dd4b04d2
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/outxmlbuilder/UpdateButtonBuilder.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.cp.bean.outxmlbuilder;
+
+import me.chanjar.weixin.cp.bean.message.WxCpXmlOutTaskCardMessage;
+import me.chanjar.weixin.cp.bean.message.WxCpXmlOutUpdateBtnMessage;
+
+/**
+ * 模板卡片更新点击用户的按钮点击文案消息builder
+ *
+ * @author nickname263
+ */
+public class UpdateButtonBuilder extends BaseBuilder {
+
+
+ private String replaceName;
+
+ public UpdateButtonBuilder replaceName(String replaceName) {
+ this.replaceName = replaceName;
+ return this;
+ }
+
+ @Override
+ public WxCpXmlOutUpdateBtnMessage build() {
+ WxCpXmlOutUpdateBtnMessage m = new WxCpXmlOutUpdateBtnMessage();
+ setCommon(m);
+ m.setReplaceName(this.replaceName);
+ return m;
+ }
+
+}
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
index aa907b7288..421765bc0f 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/util/xml/XStreamTransformer.java
@@ -54,6 +54,7 @@ private static Map configXStreamInstance() {
map.put(WxCpXmlOutVideoMessage.class, configWxCpXmlOutVideoMessage());
map.put(WxCpXmlOutVoiceMessage.class, configWxCpXmlOutVoiceMessage());
map.put(WxCpXmlOutTaskCardMessage.class, configWxCpXmlOutTaskCardMessage());
+ map.put(WxCpXmlOutUpdateBtnMessage.class, configWxCpXmlOutUpdateBtnMessage());
map.put(WxCpTpXmlPackage.class, configWxCpTpXmlPackage());
map.put(WxCpTpXmlMessage.class, configWxCpTpXmlMessage());
return map;
@@ -119,6 +120,12 @@ private static XStream configWxCpXmlOutTaskCardMessage() {
xstream.processAnnotations(WxCpXmlOutTaskCardMessage.class);
return xstream;
}
+ private static XStream configWxCpXmlOutUpdateBtnMessage() {
+ XStream xstream = XStreamInitializer.getInstance();
+ xstream.processAnnotations(WxCpXmlOutMessage.class);
+ xstream.processAnnotations(WxCpXmlOutUpdateBtnMessage.class);
+ return xstream;
+ }
private static XStream configWxCpTpXmlPackage() {
XStream xstream = XStreamInitializer.getInstance();
From 3c4e749ea9d9abbb38a26bde62aaff530c0543a8 Mon Sep 17 00:00:00 2001
From: Lucas
Date: Wed, 6 Oct 2021 10:17:07 +0800
Subject: [PATCH 0044/1263] =?UTF-8?q?:bug:=20#2338=20=E3=80=90=E5=BE=AE?=
=?UTF-8?q?=E4=BF=A1=E6=94=AF=E4=BB=98=E3=80=91=E8=90=A5=E9=94=80=E4=BB=A3?=
=?UTF-8?q?=E9=87=91=E5=88=B8=E6=8E=A5=E5=8F=A3=E4=BF=AE=E5=A4=8Dpause?=
=?UTF-8?q?=E5=92=8Crestart=E5=AE=9E=E7=8E=B0=E7=9A=84=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../marketing/FavorStocksPauseResult.java | 37 +++++++++++++++++++
.../marketing/FavorStocksRestartResult.java | 37 +++++++++++++++++++
.../wxpay/service/MarketingFavorService.java | 8 ++--
.../impl/MarketingFavorServiceImpl.java | 12 +++---
.../impl/MarketingFavorServiceImplTest.java | 4 +-
5 files changed, 86 insertions(+), 12 deletions(-)
create mode 100755 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java
create mode 100755 weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java
new file mode 100755
index 0000000000..91e10fbf28
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksPauseResult.java
@@ -0,0 +1,37 @@
+package com.github.binarywang.wxpay.bean.marketing;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 暂停代金券批次返回结果对象
+ *
+ * @author lichuang
+ */
+@NoArgsConstructor
+@Data
+public class FavorStocksPauseResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 生效时间
+ *
+ * 生效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2015-05-20T13:29:35.120+08:00
+ */
+ @SerializedName("pause_time")
+ private String pauseTime;
+
+ /**
+ * 批次号
+ *
+ * 微信为每个代金券批次分配的唯一ID。
+ * 示例值:98065001
+ */
+ @SerializedName("stock_id")
+ private String stockId;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java
new file mode 100755
index 0000000000..b9078bca59
--- /dev/null
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/marketing/FavorStocksRestartResult.java
@@ -0,0 +1,37 @@
+package com.github.binarywang.wxpay.bean.marketing;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 重启代金券批次返回结果对象
+ *
+ * @author lichuang
+ */
+@NoArgsConstructor
+@Data
+public class FavorStocksRestartResult implements Serializable {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 生效时间
+ *
+ * 生效时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
+ * 示例值:2015-05-20T13:29:35.120+08:00
+ */
+ @SerializedName("restart_time")
+ private String restartTime;
+
+ /**
+ * 批次号
+ *
+ * 微信为每个代金券批次分配的唯一ID。
+ * 示例值:98065001
+ */
+ @SerializedName("stock_id")
+ private String stockId;
+}
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java
index 5da11aabf3..ac0ed5212f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/MarketingFavorService.java
@@ -187,10 +187,10 @@ public interface MarketingFavorService {
*
*
* @param request 请求对象
- * @return FavorCallbacksSaveResult 微信返回的结果信息。
+ * @return FavorStocksPauseResult 微信返回的结果信息。
* @throws WxPayException the wx pay exception
*/
- FavorStocksStartResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
+ FavorStocksPauseResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
/**
*
@@ -200,10 +200,10 @@ public interface MarketingFavorService {
*
*
* @param request 请求对象
- * @return FavorCallbacksSaveResult 微信返回的结果信息。
+ * @return FavorStocksRestartResult 微信返回的结果信息。
* @throws WxPayException the wx pay exception
*/
- FavorStocksStartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
+ FavorStocksRestartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException;
UseNotifyData parseNotifyData(String data, SignatureHeader header) throws WxPayException;
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
index 5923d0e106..a10bbbb085 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImpl.java
@@ -154,19 +154,19 @@ public FavorCallbacksSaveResult saveFavorCallbacksV3(FavorCallbacksSaveRequest r
}
@Override
- public FavorStocksStartResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
- String url = String.format("%s/v3/marketing/favor/stocks/%s/start", this.payService.getPayBaseUrl(), stockId);
+ public FavorStocksPauseResult pauseFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
+ String url = String.format("%s/v3/marketing/favor/stocks/%s/pause", this.payService.getPayBaseUrl(), stockId);
RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
- return GSON.fromJson(result, FavorStocksStartResult.class);
+ return GSON.fromJson(result, FavorStocksPauseResult.class);
}
@Override
- public FavorStocksStartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
- String url = String.format("%s/v3/marketing/favor/stocks/%s/start", this.payService.getPayBaseUrl(), stockId);
+ public FavorStocksRestartResult restartFavorStocksV3(String stockId, FavorStocksSetRequest request) throws WxPayException {
+ String url = String.format("%s/v3/marketing/favor/stocks/%s/restart", this.payService.getPayBaseUrl(), stockId);
RsaCryptoUtil.encryptFields(request, this.payService.getConfig().getVerifier().getValidCertificate());
String result = this.payService.postV3WithWechatpaySerial(url, GSON.toJson(request));
- return GSON.fromJson(result, FavorStocksStartResult.class);
+ return GSON.fromJson(result, FavorStocksRestartResult.class);
}
/**
diff --git a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java
index 48fdf8c8e5..7a532d6bdb 100644
--- a/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java
+++ b/weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/MarketingFavorServiceImplTest.java
@@ -175,7 +175,7 @@ public void testSaveFavorCallbacksV3() throws WxPayException {
public void testPauseFavorStocksV3() throws WxPayException {
FavorStocksSetRequest request = new FavorStocksSetRequest();
request.setStockCreatorMchid(wxPayService.getConfig().getMchId());
- FavorStocksStartResult result = wxPayService.getMarketingFavorService().pauseFavorStocksV3(stockId, request);
+ FavorStocksPauseResult result = wxPayService.getMarketingFavorService().pauseFavorStocksV3(stockId, request);
log.info("result: {}", GSON.toJson(result));
}
@@ -184,7 +184,7 @@ public void testPauseFavorStocksV3() throws WxPayException {
public void testRestartFavorStocksV3() throws WxPayException {
FavorStocksSetRequest request = new FavorStocksSetRequest();
request.setStockCreatorMchid(wxPayService.getConfig().getMchId());
- FavorStocksStartResult result = wxPayService.getMarketingFavorService().restartFavorStocksV3(stockId, request);
+ FavorStocksRestartResult result = wxPayService.getMarketingFavorService().restartFavorStocksV3(stockId, request);
log.info("result: {}", GSON.toJson(result));
}
From a5c141f7bebf65894ae64803d94c561de83da69a Mon Sep 17 00:00:00 2001
From: ArBing
Date: Wed, 13 Oct 2021 13:48:49 +0800
Subject: [PATCH 0045/1263] =?UTF-8?q?:art:=20=20#2344=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E6=B0=B8=E4=B9=85=E6=8E=88?=
=?UTF-8?q?=E6=9D=83=E7=A0=81=E4=BF=A1=E6=81=AF=E7=9B=B8=E5=85=B3=E6=8E=A5?=
=?UTF-8?q?=E5=8F=A3=E5=A2=9E=E5=8A=A0authMode=E3=80=81isCustomizedApp?=
=?UTF-8?q?=E5=AD=97=E6=AE=B5?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java | 12 ++++++++++++
.../weixin/cp/bean/WxCpTpPermanentCodeInfo.java | 12 ++++++++++++
2 files changed, 24 insertions(+)
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java
index 02d51095c8..9ca4971754 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpAuthInfo.java
@@ -152,6 +152,18 @@ public static class Agent implements Serializable {
@Deprecated
private String appid;
+ /**
+ * 授权模式,0为管理员授权;1为成员授权
+ */
+ @SerializedName("auth_mode")
+ private Integer authMode;
+
+ /**
+ * 是否为代开发自建应用
+ */
+ @SerializedName("is_customized_app")
+ private Boolean isCustomizedApp;
+
/**
* 应用权限
*/
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java
index 02793de14d..9774f6230b 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpTpPermanentCodeInfo.java
@@ -151,6 +151,18 @@ public static class Agent implements Serializable {
@Deprecated
private String appid;
+ /**
+ * 授权模式,0为管理员授权;1为成员授权
+ */
+ @SerializedName("auth_mode")
+ private Integer authMode;
+
+ /**
+ * 是否为代开发自建应用
+ */
+ @SerializedName("is_customized_app")
+ private Boolean isCustomizedApp;
+
/**
* 应用权限
*/
From fddb2f7a182df67ef98fdef1d20019ddd249a635 Mon Sep 17 00:00:00 2001
From: ArBing
Date: Wed, 13 Oct 2021 13:49:16 +0800
Subject: [PATCH 0046/1263] =?UTF-8?q?:new:=20#2345=E3=80=90=E4=BC=81?=
=?UTF-8?q?=E4=B8=9A=E5=BE=AE=E4=BF=A1=E3=80=91=E5=A2=9E=E5=8A=A0=E5=88=9B?=
=?UTF-8?q?=E5=BB=BA=E8=B0=83=E7=94=A8wx.agentConfig=E6=97=B6=E6=89=80?=
=?UTF-8?q?=E9=9C=80=E8=A6=81=E7=9A=84=E7=AD=BE=E5=90=8D=E6=96=B9=E6=B3=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../me/chanjar/weixin/cp/api/WxCpService.java | 13 ++++++++
.../cp/api/impl/BaseWxCpServiceImpl.java | 25 +++++++++++++++
.../cp/bean/WxCpAgentJsapiSignature.java | 31 +++++++++++++++++++
3 files changed, 69 insertions(+)
create mode 100644 weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
index 345b3bb344..94cd212637 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/WxCpService.java
@@ -8,6 +8,7 @@
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.cp.bean.WxCpAgentJsapiSignature;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
@@ -124,6 +125,18 @@ public interface WxCpService extends WxService {
*/
WxJsapiSignature createJsapiSignature(String url) throws WxErrorException;
+ /**
+ *
+ * 创建调用wx.agentConfig时所需要的签名
+ *
+ * 详情请见:https://open.work.weixin.qq.com/api/doc/90000/90136/94313
+ *
+ *
+ * @param url url
+ * @return the agent jsapi signature
+ * @throws WxErrorException
+ */
+ WxCpAgentJsapiSignature createAgentJsapiSignature(String url) throws WxErrorException;
/**
* 小程序登录凭证校验
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
index 0a06571c97..89221f1a1e 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImpl.java
@@ -20,6 +20,7 @@
import me.chanjar.weixin.common.util.http.*;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.cp.api.*;
+import me.chanjar.weixin.cp.bean.WxCpAgentJsapiSignature;
import me.chanjar.weixin.cp.bean.WxCpMaJsCode2SessionResult;
import me.chanjar.weixin.cp.bean.WxCpProviderToken;
import me.chanjar.weixin.cp.config.WxCpConfigStorage;
@@ -171,6 +172,30 @@ public WxJsapiSignature createJsapiSignature(String url) throws WxErrorException
return jsapiSignature;
}
+ @Override
+ public WxCpAgentJsapiSignature createAgentJsapiSignature(String url) throws WxErrorException {
+ long timestamp = System.currentTimeMillis() / 1000;
+ String noncestr = RandomUtils.getRandomStr();
+ String jsapiTicket = getAgentJsapiTicket(false);
+ String signature = SHA1.genWithAmple(
+ "jsapi_ticket=" + jsapiTicket,
+ "noncestr=" + noncestr,
+ "timestamp=" + timestamp,
+ "url=" + url
+ );
+
+ WxCpAgentJsapiSignature jsapiSignature = new WxCpAgentJsapiSignature();
+ jsapiSignature.setTimestamp(timestamp);
+ jsapiSignature.setNonceStr(noncestr);
+ jsapiSignature.setUrl(url);
+ jsapiSignature.setSignature(signature);
+
+ jsapiSignature.setCorpid(this.configStorage.getCorpId());
+ jsapiSignature.setAgentid(this.configStorage.getAgentId());
+
+ return jsapiSignature;
+ }
+
@Override
public WxCpMaJsCode2SessionResult jsCode2Session(String jsCode) throws WxErrorException {
Map params = new HashMap<>(2);
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java
new file mode 100644
index 0000000000..4562d9b9b0
--- /dev/null
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/bean/WxCpAgentJsapiSignature.java
@@ -0,0 +1,31 @@
+package me.chanjar.weixin.cp.bean;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+
+/**
+ * 调用wx.agentConfig时所需要的签名信息
+ */
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxCpAgentJsapiSignature implements Serializable {
+ private static final long serialVersionUID = 2650119900835832545L;
+
+ private String url;
+
+ private String corpid;
+
+ private Integer agentid;
+
+ private long timestamp;
+
+ private String nonceStr;
+
+ private String signature;
+}
From 0bcba32ea40d2e8f60ff49d27b2747a0be86d8c3 Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Tue, 12 Oct 2021 23:06:39 -0700
Subject: [PATCH 0047/1263] refactor: Use diamond operator
---
.../weixin/common/util/http/WxDnsResolver.java | 4 ++--
.../config/impl/AbstractWxMaRedisConfig.java | 2 +-
.../api/impl/WxMaShopAuditServiceImplTest.java | 16 ++++++++--------
.../open/api/impl/WxOpenMessageRouter.java | 2 +-
4 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
index 6c6137089a..d0321af097 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
@@ -19,7 +19,7 @@
public class WxDnsResolver implements DnsResolver {
private final static String WECHAT_API_URL = "api.weixin.qq.com";
- private static Map MAPPINGS = new HashMap();
+ private static Map MAPPINGS = new HashMap<>();
protected final Logger log = LoggerFactory.getLogger(WxDnsResolver.class);
private String wxApiIp;
@@ -38,7 +38,7 @@ private void init() {
} catch (UnknownHostException e) {
//如果初始化DNS配置失败则使用默认配置,不影响服务的启动
log.error("init WxDnsResolver error", e);
- MAPPINGS = new HashMap();
+ MAPPINGS = new HashMap<>();
}
}
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java
index 9b94a04bbb..19d3a00f69 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/AbstractWxMaRedisConfig.java
@@ -79,7 +79,7 @@ private String getValueFromRedis(String key) {
private void setValueToRedis(String key, long expiresTime, String value) {
try (Jedis jedis = getConfiguredJedis()) {
- Map hash = new HashMap();
+ Map hash = new HashMap<>();
hash.put(HASH_VALUE_FIELD, value);
hash.put(HASH_EXPIRE_FIELD, String.valueOf(expiresTime));
jedis.hmset(getRedisKey(key), hash);
diff --git a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
index c8ec9f081c..117f052ac3 100644
--- a/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
+++ b/weixin-java-miniapp/src/test/java/cn/binarywang/wx/miniapp/api/impl/WxMaShopAuditServiceImplTest.java
@@ -33,23 +33,23 @@ public void testAuditBrand() throws WxErrorException {
WxMaShopAuditBrandRequest request = WxMaShopAuditBrandRequest.builder().build();
WxMaShopAuditBrandRequest.AuditReqBean auditReqBean = WxMaShopAuditBrandRequest.AuditReqBean.builder().build();
- auditReqBean.setLicense(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")));
+ auditReqBean.setLicense(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")));
auditReqBean.setBrandInfo(WxMaShopAuditBrandRequest.AuditReqBean.BrandInfoBean.builder()
.brandAuditType(1)
.trademarkType("29")
.brandManagementType(2)
.commodityOriginType(2)
.brandWording("346225226351203275")
- .saleAuthorization(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
- .trademarkRegistrationCertificate(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
- .trademarkChangeCertificate(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .saleAuthorization(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkRegistrationCertificate(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkChangeCertificate(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
.trademarkRegistrant("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")
.trademarkRegistrantNu("1249305")
.trademarkAuthorizationPeriod("2020-03-25 12:05:25")
- .trademarkRegistrationApplication(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .trademarkRegistrationApplication(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
.trademarkApplicant("张三")
.trademarkApplicationTime("2020-03-25 12:05:25")
- .importedGoodsForm(new ArrayList(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
+ .importedGoodsForm(new ArrayList<>(Arrays.asList("https://img.zhls.qq.com/3/609b98f7e0ff43d59ce6d9cca636c3e0.jpg")))
.build());
request.setAuditReq(auditReqBean);
@@ -61,12 +61,12 @@ public void testAuditBrand() throws WxErrorException {
public void testAuditCategory() throws WxErrorException {
WxMaShopAuditCategoryRequest request = WxMaShopAuditCategoryRequest.builder().build();
WxMaShopAuditCategoryRequest.AuditReqBean auditReqBean = WxMaShopAuditCategoryRequest.AuditReqBean.builder().build();
- auditReqBean.setLicense(new ArrayList(Arrays.asList("www.xxxxx.com")));
+ auditReqBean.setLicense(new ArrayList<>(Arrays.asList("www.xxxxx.com")));
auditReqBean.setCategoryInfo(WxMaShopAuditCategoryRequest.AuditReqBean.CategoryInfoBean.builder()
.level1(7419)
.level2(7439)
.level3(7448)
- .certificate(new ArrayList(Arrays.asList("www.xxxxx.com")))
+ .certificate(new ArrayList<>(Arrays.asList("www.xxxxx.com")))
.build());
request.setAuditReq(auditReqBean);
WxMaShopAuditCategoryResponse response = wxService.getShopAuditService().auditCategory(request);
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java
index 2e483fc0aa..7314bfd694 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenMessageRouter.java
@@ -17,7 +17,7 @@ public WxOpenMessageRouter(WxOpenService wxOpenService) {
}
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage, String appId) {
- return route(wxMessage, new HashMap(), appId);
+ return route(wxMessage, new HashMap<>(), appId);
}
public WxMpXmlOutMessage route(final WxMpXmlMessage wxMessage, final Map context, String appId) {
From e68477c26c48881f7aae52d241d89e7f46422e00 Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Wed, 13 Oct 2021 23:20:08 -0700
Subject: [PATCH 0048/1263] refactor: Remove unnecessary parentheses
---
.../weixin/common/session/StandardSessionManager.java | 8 ++++----
.../qidian/api/impl/WxQidianDialServiceImplTest.java | 2 +-
2 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
index 290a0c04f7..8d994b9c36 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/session/StandardSessionManager.java
@@ -98,7 +98,7 @@ public WxSession getSession(String sessionId, boolean create) {
// Create a new session if requested and the response is not committed
if (!create) {
- return (null);
+ return null;
}
session = createSession(sessionId);
@@ -127,7 +127,7 @@ public void remove(InternalSession session, boolean update) {
@Override
public InternalSession findSession(String id) {
if (id == null) {
- return (null);
+ return null;
}
return this.sessions.get(id);
}
@@ -251,7 +251,7 @@ public void processExpires() {
if (this.log.isDebugEnabled()) {
this.log.debug("End expire sessions {} processingTime {} expired sessions: {}", getName(), timeEnd - timeNow, expireHere);
}
- this.processingTime += (timeEnd - timeNow);
+ this.processingTime += timeEnd - timeNow;
}
@@ -289,7 +289,7 @@ public void setBackgroundProcessorDelay(int backgroundProcessorDelay) {
*/
public String getName() {
- return (name);
+ return name;
}
diff --git a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java
index e91d471c15..43e7ba299d 100644
--- a/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java
+++ b/weixin-java-qidian/src/test/java/me/chanjar/weixin/qidian/api/impl/WxQidianDialServiceImplTest.java
@@ -32,7 +32,7 @@ public void dial() throws WxErrorException {
IVRListResponse iVRListResponse = this.wxService.getDialService().getIVRList();
Assert.assertEquals(iVRListResponse.getErrcode(), new Integer(0));
log.info("ivr size:" + iVRListResponse.getNode().size());
- Optional optional = iVRListResponse.getNode().stream().filter((o) -> o.getIvr_name().equals("自动接听需求测试"))
+ Optional optional = iVRListResponse.getNode().stream().filter(o -> o.getIvr_name().equals("自动接听需求测试"))
.findFirst();
Assert.assertTrue(optional.isPresent());
Ivr ivr = optional.get();
From 0c1258594ea2cbcb8e5f7b1aa2c5ad99bf0f4670 Mon Sep 17 00:00:00 2001
From: linlinjava
Date: Sun, 17 Oct 2021 20:05:46 +0800
Subject: [PATCH 0049/1263] =?UTF-8?q?=E4=BF=AE=E5=A4=8DWxMaShopPayInfo?=
=?UTF-8?q?=E7=9A=84=E6=94=AF=E4=BB=98=E6=96=B9=E5=BC=8F=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
index c9a56a3aed..7ea749e197 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/shop/WxMaShopPayInfo.java
@@ -13,13 +13,13 @@ public class WxMaShopPayInfo implements Serializable {
private static final long serialVersionUID = 687488209024968647L;
/**
- * 支付方式(目前只有"微信支付")
+ * 支付方式(支付方式,0:微信支付,1: 货到付款,2:商家会员储蓄卡, 默认0)
*
* 是否必填:是
*
*/
- @SerializedName("pay_method")
- private String payMethod;
+ @SerializedName("pay_method_type")
+ private Integer payMethodType;
/**
* 预支付ID
From f4c18d7eb80f6bb4a74406fa9c9b948b55d7293f Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 17 Oct 2021 20:20:43 +0800
Subject: [PATCH 0050/1263] =?UTF-8?q?:art:=20=E8=A1=A5=E5=85=85=E9=94=99?=
=?UTF-8?q?=E8=AF=AF=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
index 486791986b..58dc4f345d 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/error/WxMpErrorMsgEnum.java
@@ -209,6 +209,10 @@ public enum WxMpErrorMsgEnum {
* 请勿添加其他公众号的主页链接.
*/
CODE_40155(40155, "请勿添加其他公众号的主页链接"),
+ /**
+ * oauth_code已使用
+ */
+ CODE_40163(40163, "oauth_code已使用"),
/**
* 缺少 access_token 参数.
*/
From 8c787d16389aff273e7bfe10d96a3c0966cb2c6f Mon Sep 17 00:00:00 2001
From: Binary Wang
Date: Sun, 17 Oct 2021 20:21:56 +0800
Subject: [PATCH 0051/1263] =?UTF-8?q?:art:=20=E8=A1=A5=E5=85=85=E7=BC=BA?=
=?UTF-8?q?=E5=A4=B1=E5=8F=82=E6=95=B0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../bean/profitsharing/ProfitSharingResult.java | 14 ++++++++++++++
1 file changed, 14 insertions(+)
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java
index ce6a1f8e95..ffa6d5a2af 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/profitsharing/ProfitSharingResult.java
@@ -36,10 +36,24 @@ public class ProfitSharingResult extends BaseWxPayResult implements Serializable
@XStreamAlias("order_id")
private String orderId;
+ /**
+ * 分账单状态.
+ */
+ @XStreamAlias("status")
+ private String status;
+
+ /**
+ * 分账接收方列表.
+ */
+ @XStreamAlias("receivers")
+ private String receivers;
+
@Override
protected void loadXml(Document d) {
transactionId = readXmlString(d, "transaction_id");
outOrderNo = readXmlString(d, "out_order_no");
orderId = readXmlString(d, "order_id");
+ status = readXmlString(d, "status");
+ receivers = readXmlString(d, "receivers");
}
}
From 5755c293dfea25f16b30b8afb145aaaa4cf08f3a Mon Sep 17 00:00:00 2001
From: dragon
Date: Sat, 23 Oct 2021 23:23:18 +0800
Subject: [PATCH 0052/1263] =?UTF-8?q?:new:=20#2356=20=E3=80=90=E5=85=AC?=
=?UTF-8?q?=E4=BC=97=E5=8F=B7=E3=80=91=E6=96=B0=E5=A2=9E=E8=8D=89=E7=A8=BF?=
=?UTF-8?q?=E7=AE=B1=E5=92=8C=E5=8F=91=E5=B8=83=E7=9B=B8=E5=85=B3=E7=9A=84?=
=?UTF-8?q?=E6=8E=A5=E5=8F=A3?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../weixin/mp/api/WxMpDraftService.java | 127 ++++++++++++++++++
.../weixin/mp/api/WxMpFreePublishService.java | 113 ++++++++++++++++
.../me/chanjar/weixin/mp/api/WxMpService.java | 28 ++++
.../mp/api/impl/BaseWxMpServiceImpl.java | 25 +++-
.../mp/api/impl/WxMpDraftServiceImpl.java | 84 ++++++++++++
.../api/impl/WxMpFreePublishServiceImpl.java | 72 ++++++++++
.../weixin/mp/bean/draft/WxMpAddDraft.java | 44 ++++++
.../mp/bean/draft/WxMpDraftArticles.java | 81 +++++++++++
.../weixin/mp/bean/draft/WxMpDraftInfo.java | 44 ++++++
.../weixin/mp/bean/draft/WxMpDraftItem.java | 33 +++++
.../weixin/mp/bean/draft/WxMpDraftList.java | 41 ++++++
.../weixin/mp/bean/draft/WxMpUpdateDraft.java | 55 ++++++++
.../freepublish/WxMpFreePublishArticles.java | 85 ++++++++++++
.../bean/freepublish/WxMpFreePublishInfo.java | 44 ++++++
.../bean/freepublish/WxMpFreePublishItem.java | 35 +++++
.../bean/freepublish/WxMpFreePublishList.java | 41 ++++++
.../freepublish/WxMpFreePublishStatus.java | 56 ++++++++
.../chanjar/weixin/mp/enums/WxMpApiUrl.java | 89 +++++++++++-
.../mp/api/impl/WxMpDraftServiceImplTest.java | 127 ++++++++++++++++++
.../impl/WxMpFreePublishServiceImplTest.java | 109 +++++++++++++++
20 files changed, 1330 insertions(+), 3 deletions(-)
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java
create mode 100644 weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java
create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java
create mode 100644 weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java
new file mode 100644
index 0000000000..3e38410d5f
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpDraftService.java
@@ -0,0 +1,127 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftInfo;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftList;
+import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft;
+
+/**
+ * 微信 草稿箱 接口.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+public interface WxMpDraftService {
+
+ /**
+ * 新建草稿 - 只有默认必填参数
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html
+ *
+ *
+ * @param title 标题
+ * @param content 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。
+ * @param thumbMediaId 图文消息的封面图片素材id(必须是永久MediaID)
+ * @throws WxErrorException .
+ */
+ String addDraft(String title, String content, String thumbMediaId) throws WxErrorException;
+
+ /**
+ * 新建草稿 - 完整参数
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/add?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Add_draft.html
+ *
+ *
+ * @param addDraft 新建草稿信息
+ * @throws WxErrorException .
+ */
+ String addDraft(WxMpAddDraft addDraft) throws WxErrorException;
+
+ /**
+ * 修改草稿 - 完整参数
+ * 正常情况下调用成功时,errcode将为0。错误时微信会返回错误码等信息,请根据错误码查询错误信息
+ *
+ * 请求地址: POST https://api.weixin.qq.com/cgi-bin/draft/update?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Update_draft.html
+ *
+ *
+ * @param updateDraftInfo 修改草稿信息
+ * @throws WxErrorException .
+ */
+ Boolean updateDraft(WxMpUpdateDraft updateDraftInfo) throws WxErrorException;
+
+ /**
+ * 获取草稿信息
+ *
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/get?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Get_draft.html
+ *
+ *
+ * @param mediaId 要获取的草稿的media_id
+ * @return 草稿信息
+ * @throws WxErrorException .
+ */
+ WxMpDraftInfo getDraft(String mediaId) throws WxErrorException;
+
+ /**
+ * 删除草稿
+ * 正常情况下调用成功时,errcode将为0。错误时微信会返回错误码等信息,请根据错误码查询错误信息。
+ * 多次删除同一篇草稿,也返回 0.
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/delete?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Delete_draft.html
+ *
+ *
+ * @param mediaId 要删除的草稿的media_id
+ * @throws WxErrorException .
+ */
+ Boolean delDraft(String mediaId) throws WxErrorException;
+
+ /**
+ * 获取草稿列表
+ *
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Get_draft_list.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @param noContent 1 表示不返回 content 字段,0 表示正常返回,默认为 0
+ * @return 草稿信息列表
+ * @throws WxErrorException .
+ */
+ WxMpDraftList listDraft(int offset, int count, int noContent) throws WxErrorException;
+
+ /**
+ * 获取草稿列表
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Get_draft_list.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @return
+ * @throws WxErrorException
+ */
+ WxMpDraftList listDraft(int offset, int count) throws WxErrorException;
+
+ /**
+ * 获取草稿数量
+ * 开发者可以根据本接口来获取草稿的总数。此接口只统计数量,不返回草稿的具体内容。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/count?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Draft_Box/Count_drafts.html
+ *
+ *
+ * @return 草稿的总数
+ * @throws WxErrorException .
+ */
+ Long countDraft() throws WxErrorException;
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java
new file mode 100644
index 0000000000..c695942790
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpFreePublishService.java
@@ -0,0 +1,113 @@
+package me.chanjar.weixin.mp.api;
+
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishInfo;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishStatus;
+
+/**
+ * 微信 发布能力 接口.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+public interface WxMpFreePublishService {
+
+ /**
+ * 发布接口 - 只有默认必填参数
+ * 开发者需要先将图文素材以草稿的形式保存(见“草稿箱/新建草稿”,如需从已保存的草稿中选择,见“草稿箱/获取草稿列表”),选择要发布的草稿 media_id 进行发布
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/submit?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Publish.html
+ *
+ *
+ * @param mediaId 要发布的草稿的media_id
+ * @throws WxErrorException .
+ */
+ String submit(String mediaId) throws WxErrorException;
+
+ /**
+ * 发布状态轮询接口
+ * 开发者可以尝试通过下面的发布状态轮询接口获知发布情况。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/get?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_status.html
+ *
+ *
+ * @param publishId 发布任务id
+ * @throws WxErrorException .
+ */
+ WxMpFreePublishStatus getPushStatus(String publishId) throws WxErrorException;
+
+ /**
+ * 删除发布
+ * 发布成功之后,随时可以通过该接口删除。此操作不可逆,请谨慎操作。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/delete?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Delete_posts.html
+ *
+ *
+ * @param articleId 成功发布时返回的 article_id
+ * @param index 要删除的文章在图文消息中的位置,第一篇编号为1,该字段不填或填0会删除全部文章
+ * @throws WxErrorException .
+ */
+ Boolean deletePush(String articleId, Integer index) throws WxErrorException;
+
+ /**
+ * 删除发布 - 此条发布的所有内容,不指定文章编号
+ * 发布成功之后,随时可以通过该接口删除。此操作不可逆,请谨慎操作。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/delete?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Delete_posts.html
+ *
+ *
+ * @param articleId 成功发布时返回的 article_id
+ * @throws WxErrorException .
+ */
+ Boolean deletePushAllArticle(String articleId) throws WxErrorException;
+
+ /**
+ * 通过 article_id 获取已发布文章
+ * 开发者可以通过 article_id 获取已发布的图文信息。
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/freepublish/getarticle?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_article_from_id.html
+ *
+ *
+ * @param articleId 要获取的草稿的article_id
+ * @return 已发布文章信息
+ * @throws WxErrorException .
+ */
+ WxMpFreePublishInfo getArticleFromId(String articleId) throws WxErrorException;
+
+ /**
+ * 获取成功发布列表 - 支持选择是否返回:图文消息的具体内容
+ *
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_publication_records.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @param noContent 1 表示不返回 content 字段,0 表示正常返回,默认为 0
+ * @return 草稿信息列表
+ * @throws WxErrorException .
+ */
+ WxMpFreePublishList getPublicationRecords(int offset, int count, int noContent) throws WxErrorException;
+
+ /**
+ * 获取成功发布列表 - 默认返回 图文消息的具体内容
+ *
+ * 请求地址:POST https://api.weixin.qq.com/cgi-bin/draft/batchget?access_token=ACCESS_TOKEN
+ * 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Publish/Get_publication_records.html
+ *
+ *
+ * @param offset 分页页数,从0开始 从全部素材的该偏移位置开始返回,0表示从第一个素材返回
+ * @param count 每页数量 返回素材的数量,取值在1到20之间
+ * @return
+ * @throws WxErrorException
+ */
+ WxMpFreePublishList getPublicationRecords(int offset, int count) throws WxErrorException;
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
index 6b6e30b7f3..fbe9e2d43a 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpService.java
@@ -567,6 +567,20 @@ public interface WxMpService extends WxService {
*/
WxMpReimburseInvoiceService getReimburseInvoiceService();
+ /**
+ * 返回草稿箱相关接口
+ *
+ * @return WxMpDraftService
+ */
+ WxMpDraftService getDraftService();
+
+ /**
+ * 返回发布能力接口
+ *
+ * @return WxMpFreePublishService
+ */
+ WxMpFreePublishService getFreePublishService();
+
/**
* .
*
@@ -818,4 +832,18 @@ public interface WxMpService extends WxService {
* @param merchantInvoiceService the merchant invoice service
*/
void setMerchantInvoiceService(WxMpMerchantInvoiceService merchantInvoiceService);
+
+ /**
+ * Sets draft service.
+ *
+ * @param draftService the draft service
+ */
+ void setDraftService(WxMpDraftService draftService);
+
+ /**
+ * Sets free publish service.
+ *
+ * @param freePublishService the free publish service
+ */
+ void setFreePublishService(WxMpFreePublishService freePublishService);
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
index 2b8d9bfd39..d11499bd4f 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
@@ -25,7 +25,11 @@
import me.chanjar.weixin.common.util.DataUtils;
import me.chanjar.weixin.common.util.RandomUtils;
import me.chanjar.weixin.common.util.crypto.SHA1;
-import me.chanjar.weixin.common.util.http.*;
+import me.chanjar.weixin.common.util.http.RequestExecutor;
+import me.chanjar.weixin.common.util.http.RequestHttp;
+import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor;
+import me.chanjar.weixin.common.util.http.SimplePostRequestExecutor;
+import me.chanjar.weixin.common.util.http.URIUtil;
import me.chanjar.weixin.common.util.json.GsonParser;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.api.*;
@@ -42,7 +46,16 @@
import java.util.Map;
import java.util.concurrent.locks.Lock;
-import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.*;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.CLEAR_QUOTA_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.FETCH_SHORTEN_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GEN_SHORTEN_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_CALLBACK_IP_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_CURRENT_AUTOREPLY_INFO_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.GET_TICKET_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.NETCHECK_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.QRCONNECT_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.SEMANTIC_SEMPROXY_SEARCH_URL;
+import static me.chanjar.weixin.mp.enums.WxMpApiUrl.Other.SHORTURL_API_URL;
/**
* 基础实现类.
@@ -146,6 +159,14 @@ public abstract class BaseWxMpServiceImpl implements WxMpService, RequestH
@Setter
private WxMpReimburseInvoiceService reimburseInvoiceService = new WxMpReimburseInvoiceServiceImpl(this);
+ @Getter
+ @Setter
+ private WxMpDraftService draftService = new WxMpDraftServiceImpl(this);
+
+ @Getter
+ @Setter
+ private WxMpFreePublishService freePublishService = new WxMpFreePublishServiceImpl(this);
+
private Map configStorageMap;
private int retrySleepMillis = 1000;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java
new file mode 100644
index 0000000000..96ff9f70b6
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImpl.java
@@ -0,0 +1,84 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.common.util.json.GsonParser;
+import me.chanjar.weixin.mp.api.WxMpDraftService;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftArticles;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftInfo;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftList;
+import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft;
+import me.chanjar.weixin.mp.enums.WxMpApiUrl;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 草稿箱能力-service实现类.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@AllArgsConstructor
+public class WxMpDraftServiceImpl implements WxMpDraftService {
+
+ private static final String MEDIA_ID = "media_id";
+ private static final String ERRCODE_SUCCESS = "0";
+ private static final String ERRCODE = "errcode";
+ private final WxMpService mpService;
+
+ @Override
+ public String addDraft(String title, String content, String thumbMediaId) throws WxErrorException {
+ List draftArticleList = new ArrayList<>();
+ WxMpDraftArticles draftArticle = WxMpDraftArticles.builder()
+ .title(title).content(content).thumbMediaId(thumbMediaId).build();
+ WxMpAddDraft addDraft = WxMpAddDraft.builder().articles(draftArticleList).build();
+ draftArticleList.add(draftArticle);
+ return addDraft(addDraft);
+ }
+
+ @Override
+ public String addDraft(WxMpAddDraft addDraft) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.Draft.ADD_DRAFT, addDraft);
+ return GsonParser.parse(json).get(MEDIA_ID).toString();
+ }
+
+ @Override
+ public Boolean updateDraft(WxMpUpdateDraft updateDraftInfo) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.Draft.UPDATE_DRAFT, updateDraftInfo);
+ return GsonParser.parse(json).get(ERRCODE).toString().equals(ERRCODE_SUCCESS);
+ }
+
+ @Override
+ public WxMpDraftInfo getDraft(String mediaId) throws WxErrorException {
+ return WxMpDraftInfo.fromJson(this.mpService.post(WxMpApiUrl.Draft.GET_DRAFT,
+ GsonHelper.buildJsonObject(MEDIA_ID, mediaId)));
+ }
+
+ @Override
+ public Boolean delDraft(String mediaId) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.Draft.DEL_DRAFT,
+ GsonHelper.buildJsonObject(MEDIA_ID, mediaId));
+ return GsonParser.parse(json).get(ERRCODE).toString().equals(ERRCODE_SUCCESS);
+ }
+
+ @Override
+ public WxMpDraftList listDraft(int offset, int count, int noContent) throws WxErrorException {
+ return WxMpDraftList.fromJson(this.mpService.post(WxMpApiUrl.Draft.LIST_DRAFT,
+ GsonHelper.buildJsonObject("offset", offset, "count", count, "no_content", noContent)));
+ }
+
+ @Override
+ public WxMpDraftList listDraft(int offset, int count) throws WxErrorException {
+ return listDraft(offset, count, 0);
+ }
+
+ @Override
+ public Long countDraft() throws WxErrorException {
+ String json = this.mpService.get(WxMpApiUrl.Draft.COUNT_DRAFT, null);
+ return Long.valueOf(GsonParser.parse(json).get("total_count").toString());
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java
new file mode 100644
index 0000000000..f8f9b36843
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImpl.java
@@ -0,0 +1,72 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import lombok.AllArgsConstructor;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.common.util.json.GsonHelper;
+import me.chanjar.weixin.common.util.json.GsonParser;
+import me.chanjar.weixin.mp.api.WxMpFreePublishService;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishInfo;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishStatus;
+import me.chanjar.weixin.mp.enums.WxMpApiUrl;
+
+/**
+ * 发布能力-service实现类.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@AllArgsConstructor
+public class WxMpFreePublishServiceImpl implements WxMpFreePublishService {
+
+ private static final String MEDIA_ID = "media_id";
+ private static final String PUBLISH_ID = "publish_id";
+ private static final String ARTICLE_ID = "article_id";
+ private static final String ERRCODE_SUCCESS = "0";
+ private static final String ERRCODE = "errcode";
+ private final WxMpService mpService;
+
+ @Override
+ public String submit(String mediaId) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.FreePublish.SUBMIT,
+ GsonHelper.buildJsonObject(MEDIA_ID, mediaId));
+ return GsonParser.parse(json).get(PUBLISH_ID).toString();
+ }
+
+ @Override
+ public WxMpFreePublishStatus getPushStatus(String publishId) throws WxErrorException {
+ return WxMpFreePublishStatus.fromJson(this.mpService.post(WxMpApiUrl.FreePublish.GET_PUSH_STATUS,
+ GsonHelper.buildJsonObject(PUBLISH_ID, publishId)));
+ }
+
+ @Override
+ public Boolean deletePush(String articleId, Integer index) throws WxErrorException {
+ String json = this.mpService.post(WxMpApiUrl.FreePublish.DEL_PUSH,
+ GsonHelper.buildJsonObject(ARTICLE_ID, articleId, "index", index));
+ return GsonParser.parse(json).get(ERRCODE).toString().equals(ERRCODE_SUCCESS);
+ }
+
+ @Override
+ public Boolean deletePushAllArticle(String articleId) throws WxErrorException {
+ // index字段不填或填0会删除全部文章
+ return deletePush(articleId, 0);
+ }
+
+ @Override
+ public WxMpFreePublishInfo getArticleFromId(String articleId) throws WxErrorException {
+ return WxMpFreePublishInfo.fromJson(this.mpService.post(WxMpApiUrl.FreePublish.GET_ARTICLE,
+ GsonHelper.buildJsonObject(ARTICLE_ID, articleId)));
+ }
+
+ @Override
+ public WxMpFreePublishList getPublicationRecords(int offset, int count, int noContent) throws WxErrorException {
+ return WxMpFreePublishList.fromJson(this.mpService.post(WxMpApiUrl.FreePublish.BATCH_GET,
+ GsonHelper.buildJsonObject("offset", offset, "count", count, "no_content", noContent)));
+ }
+
+ @Override
+ public WxMpFreePublishList getPublicationRecords(int offset, int count) throws WxErrorException {
+ return getPublicationRecords(offset, count, 0);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java
new file mode 100644
index 0000000000..400b228c0b
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpAddDraft.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 草稿箱能力-新建草稿.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpAddDraft implements ToJson, Serializable {
+ private static final long serialVersionUID = 2481699972367293721L;
+
+ /**
+ * 图文素材列表
+ */
+ @SerializedName("articles")
+ private List articles;
+
+ public static WxMpAddDraft fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpAddDraft.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java
new file mode 100644
index 0000000000..fdcff5c293
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftArticles.java
@@ -0,0 +1,81 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 草稿箱能力-图文素材文章实体.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpDraftArticles implements ToJson, Serializable {
+ /**
+ * 标题
+ */
+ @SerializedName("title")
+ private String title;
+ /**
+ * 作者
+ */
+ @SerializedName("author")
+ private String author;
+ /**
+ * 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。如果本字段为没有填写,则默认抓取正文前54个字。
+ */
+ @SerializedName("digest")
+ private String digest;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS,涉及图片url必须来源 "上传图文消息内的图片获取URL"接口获取。外部图片url将被过滤。
+ */
+ @SerializedName("content")
+ private String content;
+ /**
+ * 图文消息的原文地址,即点击“阅读原文”后的URL
+ */
+ @SerializedName("content_source_url")
+ private String contentSourceUrl;
+ /**
+ * 图文消息的封面图片素材id(必须是永久MediaID)
+ */
+ @SerializedName("thumb_media_id")
+ private String thumbMediaId;
+ /**
+ * 是否显示封面,0为false,即不显示,1为true,即显示(默认)
+ */
+ @SerializedName("show_cover_pic")
+ private Integer showCoverPic;
+ /**
+ * 是否打开评论,0不打开(默认),1打开
+ */
+ @SerializedName("need_open_comment")
+ private Integer needOpenComment;
+ /**
+ * 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
+ */
+ @SerializedName("only_fans_can_comment")
+ private Integer onlyFansCanComment;
+
+ public static WxMpDraftArticles fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftArticles.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java
new file mode 100644
index 0000000000..92a0c928d9
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftInfo.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 草稿箱能力-获取草稿详情.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpDraftInfo implements ToJson, Serializable {
+ private static final long serialVersionUID = 6111694033486314392L;
+
+ /**
+ * 文章列表
+ */
+ @SerializedName("news_item")
+ private List newsItem;
+
+ public static WxMpDraftInfo fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftInfo.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java
new file mode 100644
index 0000000000..05294cade5
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftItem.java
@@ -0,0 +1,33 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 一条草稿
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+public class WxMpDraftItem implements Serializable {
+ private static final long serialVersionUID = 214696458030935146L;
+
+ /**
+ * 图文消息的id
+ */
+ @SerializedName("media_id")
+ private String mediaId;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS。
+ */
+ @SerializedName("content")
+ private WxMpDraftInfo content;
+
+ public static WxMpDraftItem fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftItem.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java
new file mode 100644
index 0000000000..924ce4b048
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpDraftList.java
@@ -0,0 +1,41 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 草稿箱能力-获取草稿列表.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+public class WxMpDraftList implements Serializable {
+ private static final long serialVersionUID = 7216822694952035295L;
+
+ /**
+ * 草稿素材的总数
+ */
+ @SerializedName("total_count")
+ private Integer totalCount;
+
+ /**
+ * 本次调用获取的素材的数量
+ */
+ @SerializedName("item_count")
+ private Integer itemCount;
+
+ /**
+ * 所有草稿列表
+ */
+ @SerializedName("item")
+ private List items;
+
+ public static WxMpDraftList fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpDraftList.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java
new file mode 100644
index 0000000000..fa92a62397
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/draft/WxMpUpdateDraft.java
@@ -0,0 +1,55 @@
+package me.chanjar.weixin.mp.bean.draft;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 草稿箱能力-修改草稿.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpUpdateDraft implements ToJson, Serializable {
+
+ private static final long serialVersionUID = -8564521168423899915L;
+ /**
+ * 要修改的图文消息的id
+ */
+ @SerializedName("media_id")
+ private String mediaId;
+
+ /**
+ * 要更新的文章在图文消息中的位置(多图文消息时,此字段才有意义),第一篇为0
+ */
+ @SerializedName("index")
+ private Integer index;
+
+ /**
+ * 图文素材列表
+ */
+ @SerializedName("articles")
+ private WxMpDraftArticles articles;
+
+ public static WxMpUpdateDraft fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpUpdateDraft.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java
new file mode 100644
index 0000000000..20f915f195
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishArticles.java
@@ -0,0 +1,85 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 一条发布的图文记录
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@NoArgsConstructor
+@Data
+public class WxMpFreePublishArticles implements Serializable {
+ private static final long serialVersionUID = -6435229818150835883L;
+
+ /**
+ * 标题
+ */
+ @SerializedName("title")
+ private String title;
+ /**
+ * 作者
+ */
+ @SerializedName("author")
+ private String author;
+ /**
+ * 图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空。
+ */
+ @SerializedName("digest")
+ private String digest;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS
+ */
+ @SerializedName("content")
+ private String content;
+ /**
+ * 图文消息的原文地址,即点击“阅读原文”后的URL
+ */
+ @SerializedName("content_source_url")
+ private String contentSourceUrl;
+ /**
+ * 图文消息的封面图片素材id(一定是永久MediaID)
+ */
+ @SerializedName("thumb_media_id")
+ private String thumbMediaId;
+ /**
+ * 是否显示封面,0为false,即不显示,1为true,即显示(默认)
+ */
+ @SerializedName("show_cover_pic")
+ private Integer showCoverPic;
+ /**
+ * 是否打开评论,0不打开(默认),1打开
+ */
+ @SerializedName("need_open_comment")
+ private Integer needOpenComment;
+ /**
+ * 是否粉丝才可评论,0所有人可评论(默认),1粉丝才可评论
+ */
+ @SerializedName("only_fans_can_comment")
+ private Integer onlyFansCanComment;
+
+ /*
+ * ===== 上面的参数,就是草稿箱的内容的字段,为了后续扩展,单独写一份====
+ */
+
+ /**
+ * 草稿的临时链接
+ */
+ @SerializedName("url")
+ private String url;
+ /**
+ * 该图文是否被删除
+ */
+ @SerializedName("is_deleted")
+ private Boolean isDeleted;
+
+ public static WxMpFreePublishArticles fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishArticles.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java
new file mode 100644
index 0000000000..79205aab98
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishInfo.java
@@ -0,0 +1,44 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 发布能力-通过 article_id 获取已发布文章.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpFreePublishInfo implements ToJson, Serializable {
+ private static final long serialVersionUID = 3331288672996730705L;
+
+ /**
+ * 文章列表
+ */
+ @SerializedName("news_item")
+ private List newsItem;
+
+ public static WxMpFreePublishInfo fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishInfo.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java
new file mode 100644
index 0000000000..f32b34a9ff
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishItem.java
@@ -0,0 +1,35 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+
+/**
+ * 发布列表的一条记录
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@NoArgsConstructor
+@Data
+public class WxMpFreePublishItem implements Serializable {
+ private static final long serialVersionUID = -6435229818150835883L;
+
+ /**
+ * 成功发布的图文消息id
+ */
+ @SerializedName("article_id")
+ private String articleId;
+ /**
+ * 图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS。
+ */
+ @SerializedName("content")
+ private WxMpFreePublishInfo content;
+
+ public static WxMpFreePublishItem fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishItem.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java
new file mode 100644
index 0000000000..c0c2e2dfba
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishList.java
@@ -0,0 +1,41 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 发布能力-获取成功发布列表.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Data
+public class WxMpFreePublishList implements Serializable {
+ private static final long serialVersionUID = 764054773431665250L;
+
+ /**
+ * 成功发布素材的总数
+ */
+ @SerializedName("total_count")
+ private Integer totalCount;
+
+ /**
+ * 本次调用获取的素材的数量
+ */
+ @SerializedName("item_count")
+ private Integer itemCount;
+
+ /**
+ * 所有成功发布列表
+ */
+ @SerializedName("item")
+ private List items;
+
+ public static WxMpFreePublishList fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishList.class);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java
new file mode 100644
index 0000000000..5734123960
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/freepublish/WxMpFreePublishStatus.java
@@ -0,0 +1,56 @@
+package me.chanjar.weixin.mp.bean.freepublish;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+import lombok.experimental.Accessors;
+import me.chanjar.weixin.common.bean.ToJson;
+import me.chanjar.weixin.common.util.json.WxGsonBuilder;
+
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 发布能力-发布状态轮询接口,通过publishId返回 article_id(删除发布时需要用到).
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@Data
+@Builder
+@Accessors(chain = true)
+@NoArgsConstructor
+@AllArgsConstructor
+public class WxMpFreePublishStatus implements ToJson, Serializable {
+
+ private static final long serialVersionUID = -7526369389476785732L;
+ private String publish_id;
+ private Integer publish_status;
+ private String article_id;
+ private ArticleDetail article_detail;
+ private List fail_idx;
+
+ public static WxMpFreePublishStatus fromJson(String json) {
+ return WxGsonBuilder.create().fromJson(json, WxMpFreePublishStatus.class);
+ }
+
+ @Override
+ public String toJson() {
+ return WxGsonBuilder.create().toJson(this);
+ }
+
+ @NoArgsConstructor
+ @Data
+ public static class ArticleDetail {
+ private Integer count;
+ private List- item;
+
+ @NoArgsConstructor
+ @Data
+ public static class Item {
+ private Integer idx;
+ private String article_url;
+ }
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 8f6cfeea4c..6ecf757549 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -5,7 +5,10 @@
import me.chanjar.weixin.mp.config.WxMpConfigStorage;
import me.chanjar.weixin.mp.config.WxMpHostConfig;
-import static me.chanjar.weixin.mp.config.WxMpHostConfig.*;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.API_DEFAULT_HOST_URL;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.MP_DEFAULT_HOST_URL;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.OPEN_DEFAULT_HOST_URL;
+import static me.chanjar.weixin.mp.config.WxMpHostConfig.buildUrl;
/**
*
@@ -1374,6 +1377,90 @@ enum Guide implements WxMpApiUrl {
;
+ private final String prefix;
+ private final String path;
+
+ }
+
+ /**
+ * 草稿箱 能力:
+ * 新建草稿
+ * 获取草稿
+ * 删除草稿
+ * 修改草稿
+ * 获取草稿总数
+ * 获取草稿列表
+ * MP端开关(仅内测期间使用)- 上线后废弃,没实现,可以自己去公众号后台开启草稿箱
+ */
+ @AllArgsConstructor
+ @Getter
+ enum Draft implements WxMpApiUrl {
+
+ /**
+ * 新建草稿
+ */
+ ADD_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/add"),
+ /**
+ * 修改草稿
+ */
+ UPDATE_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/update"),
+ /**
+ * 获取草稿
+ */
+ GET_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/get"),
+ /**
+ * 删除草稿
+ */
+ DEL_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/delete"),
+ /**
+ * 获取草稿列表
+ */
+ LIST_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/batchget"),
+ /**
+ * 获取草稿总数
+ */
+ COUNT_DRAFT(API_DEFAULT_HOST_URL, "/cgi-bin/draft/count");
+
+ private final String prefix;
+ private final String path;
+
+ }
+
+ /**
+ * 发布能力:
+ * 发布接口
+ * 发布状态轮询接口
+ * 事件推送发布结果 -- 是回调,没实现
+ * 删除发布
+ * 通过 article_id 获取已发布文章
+ * 获取成功发布列表
+ */
+ @AllArgsConstructor
+ @Getter
+ enum FreePublish implements WxMpApiUrl {
+
+ /**
+ * 发布接口
+ */
+ SUBMIT(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/submit"),
+ /**
+ * 通过 article_id 获取已发布文章
+ */
+ GET_ARTICLE(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/getarticle"),
+ /**
+ * 发布状态轮询接口
+ */
+ GET_PUSH_STATUS(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/get"),
+ /**
+ * 删除发布
+ */
+ DEL_PUSH(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/delete"),
+ /**
+ * 获取成功发布列表
+ */
+ BATCH_GET(API_DEFAULT_HOST_URL, "/cgi-bin/freepublish/batchget")
+ ;
+
private final String prefix;
private final String path;
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java
new file mode 100644
index 0000000000..193580a9f1
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpDraftServiceImplTest.java
@@ -0,0 +1,127 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.bean.draft.WxMpAddDraft;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftArticles;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftInfo;
+import me.chanjar.weixin.mp.bean.draft.WxMpDraftList;
+import me.chanjar.weixin.mp.bean.draft.WxMpUpdateDraft;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * 草稿箱单元测试.
+ *
+ * @author dragon
+ * @date 2021-10-22
+ */
+@Guice(modules = ApiTestModule.class)
+public class WxMpDraftServiceImplTest {
+
+ /**
+ * 1.先上传一个永久图片素材:me.chanjar.weixin.mp.api.impl.WxMpMaterialServiceImplTest.testUploadMaterial
+ * 2.后续图文需要设置一个永久素材id
+ */
+ final String thumbMediaId = "zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4";
+
+ /**
+ * 新增草稿后返回的id,后续查询、修改、删除,获取等需要使用
+ */
+ final String mediaId = "zUUtT8ZYeXzZ4slFbtnAkpgGKyqnTsjtUvMdVBRWJVk";
+
+ @Inject
+ protected WxMpService wxService;
+
+ @Test
+ public void testAddDraft() throws WxErrorException {
+ // {"mediaId":"zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4","url":"http://mmbiz.qpic.cn/mmbiz_jpg/fLtyChQRfH84IyicNUbGt3l3IlHxJRibSFz7Tky0ibmzKykzVbo9tZGYhXQGJ2npFtDPbvPhKYxBz6JxkYIibTmUicQ/0?wx_fmt=jpeg"}
+ this.wxService.getDraftService().addDraft("标题", "图文消息的具体内容", thumbMediaId);
+ // 【响应数据】:{"media_id":"zUUtT8ZYeXzZ4slFbtnAks-nZeGiPQmwvhShTh72CqM","item":[]}
+ }
+
+ @Test
+ public void testAddGuide_another() throws WxErrorException {
+ List draftArticleList = new ArrayList<>();
+ WxMpDraftArticles draftArticle = WxMpDraftArticles.builder()
+ .title("新建草稿-对象形式")
+ .author("dragon")
+ .digest("图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空")
+ .content("图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS")
+ .contentSourceUrl("https://github.com/Wechat-Group/WxJava")
+ .thumbMediaId(thumbMediaId)
+ // 显示封面、打开评论、所有人可评论
+ .showCoverPic(1).needOpenComment(1).onlyFansCanComment(0)
+ .build();
+ draftArticleList.add(draftArticle);
+
+ WxMpAddDraft addDraft = WxMpAddDraft.builder().articles(draftArticleList).build();
+ String mediaId = this.wxService.getDraftService().addDraft(addDraft);
+ // 【响应数据】:{"media_id":"zUUtT8ZYeXzZ4slFbtnAkpgGKyqnTsjtUvMdVBRWJVk","item":[]}
+ assertThat(mediaId).isNotNull();
+ }
+
+ @Test
+ public void testGetDraft() throws WxErrorException {
+ final WxMpDraftInfo draftInfo = this.wxService.getDraftService().getDraft(mediaId);
+ assertThat(draftInfo).isNotNull();
+ // 【响应数据】:{"news_item":[{"title":"标题","author":"","digest":"图文消息的具体内容","content":"图文消息的具体内容","content_source_url":"","thumb_media_id":"zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4","show_cover_pic":1,"url":"http:\/\/mp.weixin.qq.com\/s?__biz=Mzk0OTI5MzM1OQ==&mid=100000006&idx=1&sn=89903965ae5ebd6014903c7c5ca34daa&chksm=435bd946742c5050d18da32289904db5ede8bbd157d181438231a1762b85030419b3c0ed4c00#rd","thumb_url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/fLtyChQRfH84IyicNUbGt3l3IlHxJRibSFz7Tky0ibmzKykzVbo9tZGYhXQGJ2npFtDPbvPhKYxBz6JxkYIibTmUicQ\/0?wx_fmt=jpeg","need_open_comment":0,"only_fans_can_comment":0}],"create_time":1634886802,"update_time":1634886802}
+ }
+
+ @Test
+ public void testUpdateDraft() throws WxErrorException {
+ WxMpDraftArticles draftArticles = WxMpDraftArticles.builder()
+ .title("新标题").content("新图文消息的具体内容").thumbMediaId(thumbMediaId).build();
+ WxMpUpdateDraft updateDraft = WxMpUpdateDraft.builder()
+ .mediaId(mediaId)
+ .index(0)
+ .articles(draftArticles)
+ .build();
+ Boolean updateDraftResult = this.wxService.getDraftService().updateDraft(updateDraft);
+ // assertThat(updateDraftResult).isTrue();
+ assertThat(updateDraftResult).isTrue();
+ }
+
+ @Test
+ public void testDelDraft() throws WxErrorException {
+ Boolean delDraftResult = this.wxService.getDraftService().delDraft(mediaId);
+ // 【响应数据】:{"errcode":0,"errmsg":"ok"}
+ assertThat(delDraftResult).isTrue();
+ }
+
+ @Test
+ public void testListDraft() throws WxErrorException {
+ WxMpDraftList draftList = this.wxService.getDraftService().listDraft(0, 10);
+ /*
+ 【响应数据】:{"item":[{"media_id":"zUUtT8ZYeXzZ4slFbtnAks-nZeGiPQmwvhShTh72CqM",
+ "content":{
+ "news_item":
+ [
+ {"title":"标题","author":"","digest":"图文消息的具体内容","content":"图文消息的具体内容",
+ "content_source_url":"","thumb_media_id":"zUUtT8ZYeXzZ4slFbtnAkh7Yd-f45DbFoF9ERzVC6s4",
+ "show_cover_pic":1,"url":"http:\/\/mp.weixin.qq.com\/s?__biz=Mzk0OTI5MzM1?wx_fmt=jpeg",
+ "need_open_comment":0,"only_fans_can_comment":0}],
+ "create_time":1634886802,"update_time":1634886802},"update_time":1634886802}
+ ]
+ ,"total_count":1,"item_count":1}
+
+ */
+ assertThat(draftList).isNotNull();
+ }
+
+ @Test
+ public void testCountDraft() throws WxErrorException {
+ Long countDraft = this.wxService.getDraftService().countDraft();
+ // 【响应数据】:{"total_count":1}
+ assertThat(countDraft).isNotNull();
+ }
+
+}
+
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java
new file mode 100644
index 0000000000..ff5cd0e5d3
--- /dev/null
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpFreePublishServiceImplTest.java
@@ -0,0 +1,109 @@
+package me.chanjar.weixin.mp.api.impl;
+
+import com.google.inject.Inject;
+import me.chanjar.weixin.common.error.WxErrorException;
+import me.chanjar.weixin.mp.api.WxMpService;
+import me.chanjar.weixin.mp.api.test.ApiTestModule;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishInfo;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishList;
+import me.chanjar.weixin.mp.bean.freepublish.WxMpFreePublishStatus;
+import org.testng.annotations.Guice;
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * 发布能力-单元测试.
+ *
+ * @author dragon
+ * @date 2021-10-23
+ */
+@Guice(modules = ApiTestModule.class)
+public class WxMpFreePublishServiceImplTest {
+
+ /**
+ * 新增草稿后返回的id,发布需要使用
+ */
+ final String mediaId = "HKVdzjkDfooMqBqJtvSs2EEeRAJaM33gJgkii_JDOHg";
+
+ /**
+ * 发布后的id,后续查询等需要使用
+ */
+ final String publishId = "2650177669";
+
+ /**
+ * 图文的 article_id,后续查询图文详情、删除发布内容 需要使用
+ * 要根据 publishId 来获取 article_id
+ *
+ * @see this.testGetPushStatus
+ */
+ final String articleId = "zjMKVd1g66BkEkpetwml4ElbDdniE8JeI2Ec324Sjqg";
+
+ @Inject
+ protected WxMpService wxService;
+
+ @Test
+ public void testSubmit() throws WxErrorException {
+ String submit = this.wxService.getFreePublishService().submit(mediaId);
+ assertThat(submit).isNotBlank();
+ // 【响应数据】:{"errcode":0,"errmsg":"ok","publish_id":2650177668}
+ }
+
+ @Test
+ public void testGetPushStatus() throws WxErrorException {
+ WxMpFreePublishStatus pushStatus = this.wxService.getFreePublishService().getPushStatus(publishId);
+ assertThat(pushStatus).isNotNull();
+ // 【响应数据】:{"publish_id":2650177668,"publish_status":0,"article_id":"zjMKVd1g66BkEkpetwml4J-4gNf4I1nsh-B-r_inemw",
+ // "article_detail":{"count":1,"item":
+ // [{"idx":1,"article_url":
+ // "https://mp.weixin.qq.com/s?__biz=MzAwMTE2MzA1xxxxxxxxxx"
+ // }]},"fail_idx":[]}
+ // article_url -> 已发布内容可被自定义菜单、自动回复、话题引用,也可用于公开传播
+ }
+
+ @Test
+ public void testGetArticleFromId() throws WxErrorException {
+ WxMpFreePublishInfo articleFromId = this.wxService.getFreePublishService().getArticleFromId(articleId);
+ assertThat(articleFromId).isNotNull();
+ /* 【响应数据】:{"news_item":[{"title":"欢迎你加入啊~ 这是我的第一条文字消息草稿","author":"","digest":"","content":"欢迎你加入啊~ 这是我的第一条文字消息草稿",
+ "content_source_url":"","thumb_media_id":"","show_cover_pic":0,"url":"http:\/\/mp.weixin.qq
+ .com\/s?__biz=MzAwMTE2MzA1Mg==&mid=2650177668","thumb_url":"","need_open_comment":1,"only_fans_can_comment":1,"is_deleted":false}],
+ "create_time":1634961670,"update_time":1634961672}
+ */
+ }
+
+ @Test
+ public void testDelPush() throws WxErrorException {
+ Boolean deletePush = this.wxService.getFreePublishService().deletePush(articleId, 0);
+ // 【响应数据】:{"errcode":0,"errmsg":"ok"}
+ assertThat(deletePush).isTrue();
+ }
+
+ @Test
+ public void testDeletePushAllArticle() throws WxErrorException {
+ Boolean deletePush = this.wxService.getFreePublishService().deletePushAllArticle(articleId);
+ // 【响应数据】:{"errcode":0,"errmsg":"ok"}
+ assertThat(deletePush).isTrue();
+ }
+
+ @Test
+ public void testGetPublicationRecords() throws WxErrorException {
+ WxMpFreePublishList publicationRecords = this.wxService.getFreePublishService().getPublicationRecords(0, 10, 0);
+ /*
+ 【响应数据】:
+ {"item":[{"article_id":"zjMKVd1g66BkEkpetwml4BOSzatuEYNY3TFhCc0kSIE","content":{"news_item":[
+ {"title":"新建草稿-对象形式","author":"dragon","digest":"图文消息的摘要,仅有单图文消息才有摘要,多图文此处为空",
+ "content":"图文消息的具体内容,支持HTML标签,必须少于2万字符,小于1M,且此处会去除JS",
+ "content_source_url":"https:\/\/github.com\/Wechat-Group\/WxJava","thumb_media_id":"HKVdzjkDfooMqBqJtvSs2Ajz2v6L_vtGhyyr_mqKcPU",
+ "show_cover_pic":1,"url":"http:\/\/mp.weixin.qq.com\/s?__biz=MzAwMTE2MzA1Mg==&mid=26501776710e5adb91#rd",
+ "thumb_url":"http:\/\/mmbiz.qpic.cn\/mmbiz_jpg\/0QSAUfroWrUmxHthQ\/0?wx_fmt=jpeg",
+ "need_open_comment":1,"only_fans_can_comment":0,"is_deleted":false}],
+ "create_time":1634976306,"update_time":1634976318}}
+ ]
+ ,"total_count":1,"item_count":1}
+ */
+ assertThat(publicationRecords).isNotNull();
+ }
+
+}
+
From a2042dd7c285e28c8da8080b67d9d630e7f3754c Mon Sep 17 00:00:00 2001
From: tt <30398051+zhentang3@users.noreply.github.com>
Date: Sat, 23 Oct 2021 23:25:58 +0800
Subject: [PATCH 0053/1263] =?UTF-8?q?:art:=20#2354=20=E3=80=90=E5=B0=8F?=
=?UTF-8?q?=E7=A8=8B=E5=BA=8F=E3=80=91urlscheme=E5=A2=9E=E5=8A=A0=E8=A6=81?=
=?UTF-8?q?=E6=89=93=E5=BC=80=E7=9A=84=E5=B0=8F=E7=A8=8B=E5=BA=8F=E7=89=88?=
=?UTF-8?q?=E6=9C=AC=E5=AD=97=E6=AE=B5=EF=BC=8C=E9=BB=98=E8=AE=A4=E5=80=BC?=
=?UTF-8?q?=E6=AD=A3=E5=BC=8F=E7=89=88=E6=9C=AC?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java
index 799a7390a6..80c5f90347 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/bean/scheme/WxMaGenerateSchemeRequest.java
@@ -39,6 +39,12 @@ public class WxMaGenerateSchemeRequest {
@SerializedName("expire_time")
private Long expireTime;
+ /**
+ * 要打开的小程序版本。正式版为"release",体验版为"trial",开发版为"develop"默认值:release
+ */
+ @SerializedName("env_version")
+ private String envVersion = "release";
+
@Data
@Builder(builderMethodName = "newBuilder")
public static class JumpWxa {
From 44e4ee44160e1a85723c0c93e0ad107ff1286892 Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Sat, 23 Oct 2021 08:26:45 -0700
Subject: [PATCH 0054/1263] :art: modifier order
---
.../weixin/common/util/http/WxDnsResolver.java | 2 +-
.../cp/config/impl/WxCpRedissonConfigImpl.java | 8 ++++----
.../config/impl/WxMaRedissonConfigImpl.java | 8 ++++----
.../wx/miniapp/util/WxMaConfigHolder.java | 2 +-
.../weixin/mp/util/WxMpConfigStorageHolder.java | 2 +-
.../impl/AbstractWxOpenInRedisConfigStorage.java | 14 +++++++-------
.../wxpay/bean/request/BaseWxPayRequest.java | 2 +-
.../qidian/util/WxQidianConfigStorageHolder.java | 2 +-
8 files changed, 20 insertions(+), 20 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
index d0321af097..ff0977e8d8 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/WxDnsResolver.java
@@ -18,7 +18,7 @@
*/
public class WxDnsResolver implements DnsResolver {
- private final static String WECHAT_API_URL = "api.weixin.qq.com";
+ private static final String WECHAT_API_URL = "api.weixin.qq.com";
private static Map MAPPINGS = new HashMap<>();
protected final Logger log = LoggerFactory.getLogger(WxDnsResolver.class);
private String wxApiIp;
diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java
index 61894b7599..a449348ad7 100644
--- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java
+++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpRedissonConfigImpl.java
@@ -20,19 +20,19 @@ public class WxCpRedissonConfigImpl extends WxCpDefaultConfigImpl {
/**
* The constant LOCK_KEY.
*/
- protected final static String LOCK_KEY = "wechat_cp_lock:";
+ protected static final String LOCK_KEY = "wechat_cp_lock:";
/**
* The constant CP_ACCESS_TOKEN_KEY.
*/
- protected final static String CP_ACCESS_TOKEN_KEY = "wechat_cp_access_token_key:";
+ protected static final String CP_ACCESS_TOKEN_KEY = "wechat_cp_access_token_key:";
/**
* The constant CP_JSAPI_TICKET_KEY.
*/
- protected final static String CP_JSAPI_TICKET_KEY = "wechat_cp_jsapi_ticket_key:";
+ protected static final String CP_JSAPI_TICKET_KEY = "wechat_cp_jsapi_ticket_key:";
/**
* The constant CP_AGENT_JSAPI_TICKET_KEY.
*/
- protected final static String CP_AGENT_JSAPI_TICKET_KEY = "wechat_cp_agent_jsapi_ticket_key:";
+ protected static final String CP_AGENT_JSAPI_TICKET_KEY = "wechat_cp_agent_jsapi_ticket_key:";
private final WxRedisOps redisOps;
/**
* redis 存储的 key 的前缀,可为空
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java
index c45ad50946..b2d115fd26 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/config/impl/WxMaRedissonConfigImpl.java
@@ -18,10 +18,10 @@
*/
public class WxMaRedissonConfigImpl extends WxMaDefaultConfigImpl {
- protected final static String LOCK_KEY = "wechat_ma_lock:";
- protected final static String MA_ACCESS_TOKEN_KEY = "wechat_ma_access_token_key:";
- protected final static String MA_JSAPI_TICKET_KEY = "wechat_ma_jsapi_ticket_key:";
- protected final static String MA_CARD_API_TICKET_KEY = "wechat_ma_card_api_ticket_key:";
+ protected static final String LOCK_KEY = "wechat_ma_lock:";
+ protected static final String MA_ACCESS_TOKEN_KEY = "wechat_ma_access_token_key:";
+ protected static final String MA_JSAPI_TICKET_KEY = "wechat_ma_jsapi_ticket_key:";
+ protected static final String MA_CARD_API_TICKET_KEY = "wechat_ma_card_api_ticket_key:";
/**
* redis 存储的 key 的前缀,可为空
diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java
index e73cb2282d..f99e9616d8 100644
--- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java
+++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/util/WxMaConfigHolder.java
@@ -7,7 +7,7 @@
* @date 2020-08-16
*/
public class WxMaConfigHolder {
- private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
@Override
protected String initialValue() {
return "default";
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java
index e844c4866b..bb3d8eb43c 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/util/WxMpConfigStorageHolder.java
@@ -5,7 +5,7 @@
* @date 2019-03-20 22:06
*/
public class WxMpConfigStorageHolder {
- private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
@Override
protected String initialValue() {
return "default";
diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java
index 52799da57c..5f21a94af3 100644
--- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java
+++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/AbstractWxOpenInRedisConfigStorage.java
@@ -8,16 +8,16 @@
* @date 2020/01/09
**/
public abstract class AbstractWxOpenInRedisConfigStorage extends WxOpenInMemoryConfigStorage {
- protected final static String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:";
- protected final static String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:";
+ protected static final String COMPONENT_VERIFY_TICKET_KEY = "wechat_component_verify_ticket:";
+ protected static final String COMPONENT_ACCESS_TOKEN_KEY = "wechat_component_access_token:";
- protected final static String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:";
- protected final static String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:";
+ protected static final String AUTHORIZER_REFRESH_TOKEN_KEY = "wechat_authorizer_refresh_token:";
+ protected static final String AUTHORIZER_ACCESS_TOKEN_KEY = "wechat_authorizer_access_token:";
- protected final static String LOCK_KEY = "wechat_lock:";
+ protected static final String LOCK_KEY = "wechat_lock:";
- protected final static String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:";
- protected final static String CARD_API_TICKET_KEY = "wechat_card_api_ticket:";
+ protected static final String JSAPI_TICKET_KEY = "wechat_jsapi_ticket:";
+ protected static final String CARD_API_TICKET_KEY = "wechat_card_api_ticket:";
/**
* redis 存储的 key 的前缀,可为空
diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
index 394bc8969b..fde7f7150f 100644
--- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
+++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
@@ -322,7 +322,7 @@ public Map getSignParams() {
*
* @param map 传入的属性Map
*/
- abstract protected void storeMap(Map map);
+ protected abstract void storeMap(Map map);
/**
*
diff --git a/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java b/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java
index 1177ce4ac6..9ce4366b99 100644
--- a/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java
+++ b/weixin-java-qidian/src/main/java/me/chanjar/weixin/qidian/util/WxQidianConfigStorageHolder.java
@@ -5,7 +5,7 @@
* @date 2020年12月26日
*/
public class WxQidianConfigStorageHolder {
- private final static ThreadLocal THREAD_LOCAL = new ThreadLocal() {
+ private static final ThreadLocal THREAD_LOCAL = new ThreadLocal() {
@Override
protected String initialValue() {
return "default";
From 3039dd018e3faa11230a44f842b43db9b3fabbda Mon Sep 17 00:00:00 2001
From: Kyle Scully
Date: Sat, 23 Oct 2021 08:27:14 -0700
Subject: [PATCH 0055/1263] :art: Use explicit types on lambda arguments
---
.../common/util/http/apache/ApacheHttpDnsClientBuilder.java | 2 +-
.../chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java | 2 +-
.../test/java/me/chanjar/weixin/cp/demo/WxCpDemoServer.java | 6 +++---
.../binarywang/wx/miniapp/api/impl/WxMaServiceImplTest.java | 2 +-
.../chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
index af3a32ff71..698eb47bb9 100644
--- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
+++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/util/http/apache/ApacheHttpDnsClientBuilder.java
@@ -48,7 +48,7 @@ public class ApacheHttpDnsClientBuilder implements ApacheHttpClientBuilder {
private DnsResolver dnsResover;
- private HttpRequestRetryHandler httpRequestRetryHandler = (exception, executionCount, context) -> false;
+ private HttpRequestRetryHandler httpRequestRetryHandler = (IOException exception, int executionCount, HttpContext context) -> false;
private SSLConnectionSocketFactory sslConnectionSocketFactory = SSLConnectionSocketFactory.getSocketFactory();
private PlainConnectionSocketFactory plainConnectionSocketFactory = PlainConnectionSocketFactory.getSocketFactory();
private String httpProxyHost;
diff --git a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
index 739470a2d7..2e91aacbf4 100644
--- a/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
+++ b/weixin-java-cp/src/test/java/me/chanjar/weixin/cp/api/impl/BaseWxCpServiceImplTest.java
@@ -92,7 +92,7 @@ public WxCpConfigStorage getWxCpConfigStorage() {
RequestExecutor