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 35a1a26e..a1e3c073 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 @@ -82,7 +82,7 @@ public class WxConsts { /** * 小程序卡片(要求小程序与公众号已关联) */ - public static final String MINIPROGRAMPAGE="miniprogrampage"; + public static final String MINIPROGRAMPAGE = "miniprogrampage"; } /** @@ -181,6 +181,76 @@ public class WxConsts { * 微信小店 订单付款通知. */ public static final String MERCHANT_ORDER = "merchant_order"; + + /** + * 卡券事件:卡券通过审核 + */ + public static final String CARD_PASS_CHECK = "card_pass_check"; + + /** + * 卡券事件:卡券未通过审核 + */ + public static final String CARD_NOT_PASS_CHECK = "card_not_pass_check"; + + /** + * 卡券事件:用户领取卡券 + */ + public static final String CARD_USER_GET_CARD = "user_get_card"; + + /** + * 卡券事件:用户转赠卡券 + */ + public static final String CARD_USER_GIFTING_CARD = "user_gifting_card"; + + + /** + * 卡券事件:用户核销卡券 + */ + public static final String CARD_USER_CONSUME_CARD = "user_consume_card"; + + + /** + * 卡券事件:用户通过卡券的微信买单完成时推送 + */ + public static final String CARD_USER_PAY_FROM_PAY_CELL = "user_pay_from_pay_cell"; + + + /** + * 卡券事件:用户提交会员卡开卡信息 + */ + public static final String CARD_SUBMIT_MEMBERCARD_USER_INFO = "submit_membercard_user_info"; + + /** + * 卡券事件:用户打开查看卡券 + */ + public static final String CARD_USER_VIEW_CARD = "user_view_card"; + + /** + * 卡券事件:用户删除卡券 + */ + public static final String CARD_USER_DEL_CARD = "user_del_card"; + + /** + * 卡券事件:用户在卡券里点击查看公众号进入会话时(需要用户已经关注公众号) + */ + public static final String CARD_USER_ENTER_SESSION_FROM_CARD = "user_enter_session_from_card"; + + /** + * 卡券事件:当用户的会员卡积分余额发生变动时 + */ + public static final String CARD_UPDATE_MEMBER_CARD = "update_member_card"; + + /** + * 卡券事件:当某个card_id的初始库存数大于200且当前库存小于等于100时,用户尝试领券会触发发送事件给商户,事件每隔12h发送一次 + */ + public static final String CARD_SKU_REMIND = "card_sku_remind"; + + /** + * 卡券事件:当商户朋友的券券点发生变动时 + */ + public static final String CARD_PAY_ORDER = "card_pay_order"; + + } /** @@ -280,4 +350,5 @@ public class WxConsts { public static final String IMAGE = "image"; public static final String VIDEO = "video"; } + } diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java index 8089f03b..4cb755f4 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpCardService.java @@ -145,6 +145,15 @@ public interface WxMpCardService { */ WxMpCardQrcodeCreateResult createQrcodeCard(String cardId, String outerStr) throws WxErrorException; + /** + * 创建卡券二维码 + * @param cardId 卡券编号 + * @param outerStr 二维码标识 + * @param expiresIn 失效时间,单位秒,不填默认365天 + * @return WxMpCardQrcodeCreateResult + */ + WxMpCardQrcodeCreateResult createQrcodeCard(String cardId, String outerStr,int expiresIn) throws WxErrorException; + /** * 创建卡券货架 * @param createRequest 货架创建参数 diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java index 15e5bd49..d9bbdfbc 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMemberCardService.java @@ -1,17 +1,28 @@ package me.chanjar.weixin.mp.api; import me.chanjar.weixin.common.error.WxErrorException; +import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormRequest; +import me.chanjar.weixin.mp.bean.card.MemberCardActivateUserFormResult; import me.chanjar.weixin.mp.bean.card.WxMpCardCreateResult; -import me.chanjar.weixin.mp.bean.card.WxMpCardQrcodeCreateResult; import me.chanjar.weixin.mp.bean.membercard.*; /** * 会员卡相关接口 * - * @author YuJian(mgcnrx11@gmail.com) + * @author YuJian(mgcnrx11 @ gmail.com) + * @author yuanqixun * @version 2017/7/8 + * @date 2018-08-30 */ public interface WxMpMemberCardService { + String MEMBER_CARD_CREAET = "https://api.weixin.qq.com/card/create"; + String MEMBER_CARD_ACTIVATE = "https://api.weixin.qq.com/card/membercard/activate"; + String MEMBER_CARD_USER_INFO_GET = "https://api.weixin.qq.com/card/membercard/userinfo/get"; + String MEMBER_CARD_UPDATE_USER = "https://api.weixin.qq.com/card/membercard/updateuser"; + /** + * 会员卡激活之微信开卡接口(wx_activate=true情况调用) + */ + String MEMBER_CARD_ACTIVATEUSERFORM = "https://api.weixin.qq.com/card/membercard/activateuserform/set"; /** * 得到WxMpService @@ -20,6 +31,7 @@ public interface WxMpMemberCardService { /** * 会员卡创建接口 + * * @param createJson * @return * @throws WxErrorException @@ -28,6 +40,7 @@ public interface WxMpMemberCardService { /** * 会员卡创建接口 + * * @param createMessageMessage * @return WxMpCardCreateResult * @throws WxErrorException @@ -47,7 +60,7 @@ public interface WxMpMemberCardService { * 拉取会员信息接口 * * @param cardId 会员卡的CardId,微信分配 - * @param code 领取会员的会员卡Code + * @param code 领取会员的会员卡Code * @return 会员信息的结果对象 * @throws WxErrorException 接口调用失败抛出的异常 */ @@ -55,7 +68,7 @@ public interface WxMpMemberCardService { /** * 当会员持卡消费后,支持开发者调用该接口更新会员信息。会员卡交易后的每次信息变更需通过该接口通知微信,便于后续消息通知及其他扩展功能。 - * + *
* 1.开发者可以同时传入add_bonus和bonus解决由于同步失败带来的幂等性问题。同时传入add_bonus和bonus时
* add_bonus作为积分变动消息中的变量值,而bonus作为卡面上的总积分额度显示。余额变动同理。
* 2.开发者可以传入is_notify_bonus控制特殊的积分对账变动不发送消息,余额变动同理。
@@ -66,4 +79,13 @@ public interface WxMpMemberCardService {
*/
WxMpMemberCardUpdateResult updateUserMemberCard(WxMpMemberCardUpdateMessage updateUserMessage) throws WxErrorException;
+ /**
+ * 设置会员卡激活的字段(会员卡设置:wx_activate=true 时需要)
+ *
+ * @param userFormRequest
+ * @return
+ * @throws WxErrorException
+ */
+ MemberCardActivateUserFormResult setActivateUserForm(MemberCardActivateUserFormRequest userFormRequest) throws WxErrorException;
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
index 5895a680..28a7d5cc 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpCardServiceImpl.java
@@ -256,14 +256,29 @@ public class WxMpCardServiceImpl implements WxMpCardService {
/**
* 创建卡券二维码
+ *
* @param cardId
* @param outerStr
* @return
*/
public WxMpCardQrcodeCreateResult createQrcodeCard(String cardId, String outerStr) throws WxErrorException {
+ return createQrcodeCard(cardId, outerStr, 0);
+ }
+
+ /**
+ * 创建卡券二维码
+ * @param cardId 卡券编号
+ * @param outerStr 二维码标识
+ * @param expiresIn 失效时间,单位秒,不填默认365天
+ * @return
+ * @throws WxErrorException
+ */
+ public WxMpCardQrcodeCreateResult createQrcodeCard(String cardId, String outerStr, int expiresIn) throws WxErrorException {
JsonObject jsonObject = new JsonObject();
jsonObject.addProperty("action_name", "QR_CARD");
- jsonObject.addProperty("expire_seconds", 1800);
+ if (expiresIn > 0) {
+ jsonObject.addProperty("expire_seconds", expiresIn);
+ }
JsonObject actionInfoJson = new JsonObject();
JsonObject cardJson = new JsonObject();
cardJson.addProperty("card_id", cardId);
@@ -276,13 +291,14 @@ public class WxMpCardServiceImpl implements WxMpCardService {
/**
* 创建卡券货架接口
+ *
* @param request
* @return
* @throws WxErrorException
*/
@Override
public WxMpCardLandingPageCreateResult createLandingPage(WxMpCardLandingPageCreateRequest request) throws WxErrorException {
- String response = this.wxMpService.post(CARD_LANDING_PAGE_CREAET,GSON.toJson(request));
+ String response = this.wxMpService.post(CARD_LANDING_PAGE_CREAET, GSON.toJson(request));
return WxMpCardLandingPageCreateResult.fromJson(response);
}
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java
index 7b4e3778..800f4a17 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImpl.java
@@ -1,12 +1,18 @@
package me.chanjar.weixin.mp.api.impl;
-import com.google.gson.*;
+import com.google.gson.Gson;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.json.WxGsonBuilder;
import me.chanjar.weixin.mp.api.WxMpMemberCardService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.bean.card.*;
+import me.chanjar.weixin.mp.bean.card.enums.BusinessServiceType;
+import me.chanjar.weixin.mp.bean.card.enums.CardColor;
+import me.chanjar.weixin.mp.bean.card.enums.DateInfoType;
import me.chanjar.weixin.mp.bean.membercard.*;
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
import org.apache.commons.lang3.StringUtils;
@@ -23,11 +29,6 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService {
private final Logger log = LoggerFactory.getLogger(WxMpMemberCardServiceImpl.class);
- private static final String MEMBER_CARD_CREAET = "https://api.weixin.qq.com/card/create";
- private static final String MEMBER_CARD_ACTIVATE = "https://api.weixin.qq.com/card/membercard/activate";
- private static final String MEMBER_CARD_USER_INFO_GET = "https://api.weixin.qq.com/card/membercard/userinfo/get";
- private static final String MEMBER_CARD_UPDATE_USER = "https://api.weixin.qq.com/card/membercard/updateuser";
-
private WxMpService wxMpService;
private static final Gson GSON = new Gson();
@@ -265,4 +266,17 @@ public class WxMpMemberCardServiceImpl implements WxMpMemberCardService {
}.getType());
}
+ /**
+ * 设置会员卡激活的字段(会员卡设置:wx_activate=true 时需要)
+ *
+ * @param userFormRequest
+ * @return
+ * @throws WxErrorException
+ */
+ @Override
+ public MemberCardActivateUserFormResult setActivateUserForm(MemberCardActivateUserFormRequest userFormRequest) throws WxErrorException {
+ String responseContent = this.getWxMpService().post(MEMBER_CARD_ACTIVATEUSERFORM, GSON.toJson(userFormRequest));
+ return MemberCardActivateUserFormResult.fromJson(responseContent);
+ }
+
}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AdvancedInfo.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AdvancedInfo.java
index d27d0bab..0e01e50d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AdvancedInfo.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/AdvancedInfo.java
@@ -2,6 +2,7 @@ package me.chanjar.weixin.mp.bean.card;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
+import me.chanjar.weixin.mp.bean.card.enums.BusinessServiceType;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormRequest.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormRequest.java
new file mode 100644
index 00000000..3d9a9687
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormRequest.java
@@ -0,0 +1,70 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.JsonObject;
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import org.apache.commons.lang3.StringUtils;
+
+import java.io.Serializable;
+
+/**
+ * 会员卡激活,用户字段提交请求
+ *
+ * @author yuanqixun
+ * @date 2018-08-30
+ */
+@Data
+public class MemberCardActivateUserFormRequest implements Serializable {
+ @SerializedName("card_id")
+ private String cardId;
+
+ @SerializedName("service_statement")
+ private JsonObject serviceStatement;
+
+ @SerializedName("bind_old_card")
+ private JsonObject bindOldCard;
+
+ /**
+ * 必填项
+ */
+ @SerializedName("required_form")
+ private MemberCardUserForm requiredForm;
+
+ /**
+ * 可选项
+ */
+ @SerializedName("optional_form")
+ private MemberCardUserForm optionalForm;
+
+ /**
+ * 绑定老会员卡信息
+ *
+ * @param name
+ * @param url
+ */
+ public void setBindOldCard(String name, String url) {
+ if (StringUtils.isAnyEmpty(name, url)) {
+ return;
+ }
+ if (bindOldCard == null)
+ bindOldCard = new JsonObject();
+ bindOldCard.addProperty("name", name);
+ bindOldCard.addProperty("url", url);
+ }
+
+ /**
+ * 设置服务声明,用于放置商户会员卡守则
+ *
+ * @param name
+ * @param url
+ */
+ public void setServiceStatement(String name, String url) {
+ if (StringUtils.isAnyEmpty(name, url)) {
+ return;
+ }
+ if (serviceStatement == null)
+ serviceStatement = new JsonObject();
+ serviceStatement.addProperty("name", name);
+ serviceStatement.addProperty("url", url);
+ }
+}
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormResult.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormResult.java
new file mode 100644
index 00000000..c961676d
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardActivateUserFormResult.java
@@ -0,0 +1,29 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import lombok.Data;
+import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+
+@Data
+public class MemberCardActivateUserFormResult implements Serializable {
+ private Integer errcode;
+ private String errmsg;
+
+ public boolean isSuccess() {
+ return 0 == errcode;
+ }
+
+ public static MemberCardActivateUserFormResult fromJson(String json) {
+ return WxMpGsonBuilder.create().fromJson(json, MemberCardActivateUserFormResult.class);
+ }
+
+ @Override
+ public String toString() {
+ return ToStringBuilder.reflectionToString(this, ToStringStyle.JSON_STYLE);
+ }
+
+}
+
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserForm.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserForm.java
new file mode 100644
index 00000000..14ef9f37
--- /dev/null
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/bean/card/MemberCardUserForm.java
@@ -0,0 +1,92 @@
+package me.chanjar.weixin.mp.bean.card;
+
+import com.google.gson.annotations.SerializedName;
+import lombok.Data;
+import me.chanjar.weixin.mp.bean.card.enums.CardWechatFieldType;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import java.io.Serializable;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 用户表单对象
+ *
+ * @author yuanqixun
+ * @date 2018-08-30
+ */
+@Data
+public class MemberCardUserForm implements Serializable {
+
+ /**
+ * 当前结构(required_form或者optional_form )内的字段是否允许用户激活后再次修改,
+ * 商户设置为true 时,需要接收相应事件通知处理修改事件
+ */
+ @SerializedName("can_modify")
+ private boolean canModify;
+
+ /**
+ * 富文本类型字段列表
+ */
+ @SerializedName("rich_field_list")
+ List
+ * 所要拉取的订单类型 ORDER_TYPE_SYS_ADD 平台赠送券点 ORDER_TYPE_WXPAY 充值券点 ORDER_TYPE_REFUND 库存未使用回退券点
+ * ORDER_TYPE_REDUCE 券点兑换库存 ORDER_TYPE_SYS_REDUCE 平台扣减
+ *
+ */
+ @XStreamAlias("OrderType")
+ private String orderType;
+
+ /**
+ * 系统备注,说明此次变动的缘由,如开通账户奖励、门店奖励、核销奖励以及充值、扣减。
+ */
+ @XStreamAlias("Memo")
+ private String memo;
+
+ /**
+ * 所开发票的详情
+ */
+ @XStreamAlias("ReceiptInfo")
+ private String receiptInfo;
+
+
///////////////////////////////////////
// 门店审核事件推送
///////////////////////////////////////
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java
index 31cac098..0e1502f2 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMemberCardServiceImplTest.java
@@ -5,6 +5,7 @@ import me.chanjar.weixin.mp.api.WxMpCardService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.api.test.ApiTestModule;
import me.chanjar.weixin.mp.bean.card.*;
+import me.chanjar.weixin.mp.bean.card.enums.CardSceneType;
import me.chanjar.weixin.mp.bean.membercard.*;
import org.testng.annotations.Guice;
import org.testng.annotations.Test;