From bdf63e3fc412736d1bd143f2a9aa11b5fc3fdde0 Mon Sep 17 00:00:00 2001 From: fengyapeng Date: Thu, 22 Dec 2016 09:44:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8F=90=E4=BA=A4=E4=BC=9A=E5=91=98=E5=8D=A1?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../weixin4j/model/card/CardCoupons.java | 3 + .../weixin4j/model/card/MemberInitInfo.java | 171 ++++++++++++++ .../weixin4j/model/card/MemberUpdateInfo.java | 210 ++++++++++++++++++ .../weixin4j/model/card/MemberUserForm.java | 159 +++++++++++++ .../weixin4j/model/card/MemberUserInfo.java | 165 ++++++++++++++ .../type/card/ActivateCommonField.java | 66 ++++++ .../type/card/ActivateFormFieldType.java | 16 ++ .../weixin4j/type/card/UserCardStatus.java | 19 ++ .../com/foxinmy/weixin4j/mp/api/CardApi.java | 77 ++++++- .../weixin4j/mp/api/MemberCardApi.java | 95 ++++++++ .../foxinmy/weixin4j/mp/api/weixin.properties | 20 +- .../weixin4j/mp/test/MemberCardTest.java | 16 ++ 12 files changed, 1013 insertions(+), 4 deletions(-) create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberInitInfo.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUpdateInfo.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserForm.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserInfo.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateCommonField.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateFormFieldType.java create mode 100644 weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/UserCardStatus.java create mode 100644 weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MemberCardApi.java create mode 100644 weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MemberCardTest.java diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CardCoupons.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CardCoupons.java index 88c75578..41508381 100644 --- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CardCoupons.java +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CardCoupons.java @@ -35,6 +35,9 @@ public final class CardCoupons { return new CouponAdvanceInfo.Builder(); } + public static MemberCard.Builder customMemberCard(){ + return new MemberCard.Builder(); + } /** * 创建代金券 * diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberInitInfo.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberInitInfo.java new file mode 100644 index 00000000..66ebe3d5 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberInitInfo.java @@ -0,0 +1,171 @@ +package com.foxinmy.weixin4j.model.card; + +import com.alibaba.fastjson.annotation.JSONField; + +import java.util.Date; + +/** + * 会员初始化的信息 + * + * @auther: Feng Yapeng + * @since: 2016/12/20 15:00 + */ +public class MemberInitInfo { + + /** + * 会员卡编号,由开发者填入,作为序列号显示在用户的卡包里。可与Code码保持等值。 + */ + @JSONField(name = "membership_number") + private String membershipNumber; + /** + * 领取会员卡用户获得的code + */ + private String code; + /** + * 卡券ID【自定义code卡券必填】 + */ + @JSONField(name = "card_id") + private String cardId; + /** + * 商家自定义会员卡背景图,须 先调用上传图片接口将背景图上传至CDN,否则报错, + * 卡面设计请遵循微信会员卡自定义背景设计规范 + */ + @JSONField(name = "background_pic_url") + private String backgroundPicUrl; + + /** + * 激活后的有效起始时间。若不填写默认以创建时的 date_info 为准。Unix时间戳格式 + */ + @JSONField(name = "activate_begin_time") + private long activateBeginTime; + /** + * 激活后的有效截至时间。 + */ + @JSONField(name = "activate_end_time") + private long activateEndTime; + /** + * 初始积分,不填为0。 + */ + @JSONField(name = "init_bonus") + private Integer initBonus; + /** + * 积分同步说明。 + */ + @JSONField(name = "init_bonus_record") + private String initBonusRecord; + + + /** + * 初始余额,不填为0。 + */ + @JSONField(name = "init_balance") + private Integer initBalance; + /** + * 创建时字段custom_field1定义类型的初始值,限制为4个汉字,12字节。 + */ + private String init_custom_field_value1; + /** + * 创建时字段custom_field2定义类型的初始值,限制为4个汉字,12字节。 + */ + private String init_custom_field_value2; + /** + * 创建时字段custom_field3定义类型的初始值,限制为4个汉字,12字节。 + */ + private String init_custom_field_value3; + + public String getMembershipNumber() { + return membershipNumber; + } + + public void setMembershipNumber(String membershipNumber) { + this.membershipNumber = membershipNumber; + } + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getBackgroundPicUrl() { + return backgroundPicUrl; + } + + public void setBackgroundPicUrl(String backgroundPicUrl) { + this.backgroundPicUrl = backgroundPicUrl; + } + + public long getActivateBeginTime() { + return activateBeginTime; + } + + public void setActivateBeginTime(Date activateBeginTime) { + this.activateBeginTime = activateBeginTime.getTime() / 1000; + } + + public long getActivateEndTime() { + return activateEndTime; + } + + public void setActivateEndTime(Date activateEndTime) { + this.activateEndTime = activateEndTime.getTime() / 1000; + } + + public Integer getInitBonus() { + return initBonus; + } + + public void setInitBonus(Integer initBonus) { + this.initBonus = initBonus; + } + + public String getInitBonusRecord() { + return initBonusRecord; + } + + public void setInitBonusRecord(String initBonusRecord) { + this.initBonusRecord = initBonusRecord; + } + + public Integer getInitBalance() { + return initBalance; + } + + public void setInitBalance(Integer initBalance) { + this.initBalance = initBalance; + } + + public String getInit_custom_field_value1() { + return init_custom_field_value1; + } + + public void setInit_custom_field_value1(String init_custom_field_value1) { + this.init_custom_field_value1 = init_custom_field_value1; + } + + public String getInit_custom_field_value2() { + return init_custom_field_value2; + } + + public void setInit_custom_field_value2(String init_custom_field_value2) { + this.init_custom_field_value2 = init_custom_field_value2; + } + + public String getInit_custom_field_value3() { + return init_custom_field_value3; + } + + public void setInit_custom_field_value3(String init_custom_field_value3) { + this.init_custom_field_value3 = init_custom_field_value3; + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUpdateInfo.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUpdateInfo.java new file mode 100644 index 00000000..9d5a58ca --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUpdateInfo.java @@ -0,0 +1,210 @@ +package com.foxinmy.weixin4j.model.card; + +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; + +/** + * 会员更新的信息 + * + * @auther: Feng Yapeng + * @since: 2016/12/20 15:01 + */ +public class MemberUpdateInfo { + + /** + * 卡券Code码。 + */ + private String code; + /** + * 卡券ID。 + */ + @JSONField(name = "card_id") + private String cardId; + /** + * 支持商家激活时针对单个会员卡分配自定义的会员卡背景。 + */ + @JSONField(name = "background_pic_url") + private String backgroundPicUrl; + /** + * 需要设置的积分全量值,传入的数值会直接显示 + */ + private Integer bonus; + /** + * 本次积分变动值,传负数代表减少 + */ + @JSONField(name = "add_bonus") + private Integer addBonus; + /** + * 商家自定义积分消耗记录,不超过14个汉字 + */ + @JSONField(name = "record_bonus") + private String recordBonus; + /* + * 需要设置的余额全量值,传入的数值会直接显示在卡面 + */ + private Integer balance; + + /** + * 本次余额变动值,传负数代表减少 + */ + @JSONField(name = "add_balance") + private Integer addBalance; + /** + * 商家自定义金额消耗记录,不超过14个汉字。 + */ + @JSONField(name = "record_balance") + private String recordBalance; + /** + * 创建时字段custom_field1定义类型的最新数值,限制为4个汉字,12字节。 + */ + @JSONField(name = "custom_field_value1") + private String customFieldValue1; + /** + * 同上 + */ + @JSONField(name = "custom_field_value2") + private String customFieldValue2; + /** + * 同上 + */ + @JSONField(name = "custom_field_value3") + private String customFieldValue3; + + /** + * + */ + @JSONField(name = "notifyOptional") + private JSONObject notifyOptional; + + + public String getCode() { + return code; + } + + public void setCode(String code) { + this.code = code; + } + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public String getBackgroundPicUrl() { + return backgroundPicUrl; + } + + public void setBackgroundPicUrl(String backgroundPicUrl) { + this.backgroundPicUrl = backgroundPicUrl; + } + + public Integer getBonus() { + return bonus; + } + + public void setBonus(Integer bonus) { + this.bonus = bonus; + } + + public Integer getAddBonus() { + return addBonus; + } + + public void setAddBonus(Integer addBonus) { + this.addBonus = addBonus; + } + + public String getRecordBonus() { + return recordBonus; + } + + public void setRecordBonus(String recordBonus) { + this.recordBonus = recordBonus; + } + + public Integer getBalance() { + return balance; + } + + public void setBalance(Integer balance) { + this.balance = balance; + } + + public Integer getAddBalance() { + return addBalance; + } + + public void setAddBalance(Integer addBalance) { + this.addBalance = addBalance; + } + + public String getRecordBalance() { + return recordBalance; + } + + public void setRecordBalance(String recordBalance) { + this.recordBalance = recordBalance; + } + + public String getCustomFieldValue1() { + return customFieldValue1; + } + + public void setCustomFieldValue1(String customFieldValue1) { + this.customFieldValue1 = customFieldValue1; + } + + public void setCustomFieldValue1(String customFieldValue1, boolean notify) { + this.customFieldValue1 = customFieldValue1; + if (notifyOptional == null) { + notifyOptional = new JSONObject(); + } + notifyOptional.put("is_notify_custom_field1", notify); + } + + + public String getCustomFieldValue2() { + return customFieldValue2; + } + + public void setCustomFieldValue2(String customFieldValue2) { + this.customFieldValue2 = customFieldValue2; + + } + + public void setCustomFieldValue2(String customFieldValue2, boolean notify) { + this.customFieldValue2 = customFieldValue2; + if (notifyOptional == null) { + notifyOptional = new JSONObject(); + } + notifyOptional.put("is_notify_custom_field2", notify); + + } + + public String getCustomFieldValue3() { + return customFieldValue3; + } + + public void setCustomFieldValue3(String customFieldValue3) { + this.customFieldValue3 = customFieldValue3; + } + + public void setCustomFieldValue3(String customFieldValue3, boolean notify) { + this.customFieldValue3 = customFieldValue3; + if (notifyOptional == null) { + notifyOptional = new JSONObject(); + } + notifyOptional.put("is_notify_custom_field3", notify); + } + + public void setNOtify(boolean notifyBonus, boolean notifyBalance) { + if (notifyOptional == null) { + notifyOptional = new JSONObject(); + } + notifyOptional.put("is_notify_bonus", notifyBonus); + notifyOptional.put("is_notify_balance", notifyBalance); + } +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserForm.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserForm.java new file mode 100644 index 00000000..5dc69e59 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserForm.java @@ -0,0 +1,159 @@ +package com.foxinmy.weixin4j.model.card; + +import com.alibaba.fastjson.JSONArray; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.annotation.JSONField; +import com.foxinmy.weixin4j.type.card.ActivateCommonField; +import com.foxinmy.weixin4j.type.card.ActivateFormFieldType; + +import java.util.HashSet; + +/** + * 普通一键激活 中设置会员卡 + * + * @auther: Feng Yapeng + * @since: 2016/12/20 16:25 + */ +public class MemberUserForm { + + /** + * 卡券ID。 + */ + @JSONField(name = "card_id") + private String cardId; + + /** + * 服务声明,用于放置商户会员卡守则 + */ + @JSONField(name = "service_statement") + private JSONObject serviceStatement; + /** + * 绑定老会员链接 + */ + @JSONField(name = "bind_old_card") + private JSONObject bindOldCard; + + /** + *设置必填的from + */ + @JSONField(name = "required_form") + private FormBudiler requiredForm; + + /** + * 设置选填的form + */ + @JSONField(name = "optional_form") + private FormBudiler optionalForm; + + + public String getCardId() { + return cardId; + } + + public void setCardId(String cardId) { + this.cardId = cardId; + } + + public JSONObject getServiceStatement() { + return serviceStatement; + } + + public void setServiceStatement(String name,String url) { + JSONObject serviceStatement = new JSONObject(); + serviceStatement.put("name",name); + serviceStatement.put("url",url); + this.serviceStatement = serviceStatement; + } + + public JSONObject getBindOldCard() { + return bindOldCard; + } + + public void setBindOldCard(String name,String url) { + JSONObject bindOldCard = new JSONObject(); + bindOldCard.put("name",name); + bindOldCard.put("url",url); + this.bindOldCard = bindOldCard; + } + + public void setRequiredForm(FormBudiler formBudiler) { + this.requiredForm = formBudiler; + } + + public void setOptionalForm(FormBudiler formBudiler) { + this.optionalForm = formBudiler; + } + + public final static class FormBudiler { + + /** + * 当前结构(required_form或者optional_form )内 + * 的字段是否允许用户激活后再次修改,商户设置为true + * 时,需要接收相应事件通知处理修改事件 + */ + private boolean canModify; + /** + * 自定义富文本类型,包含以下三个字段 + */ + @JSONField(name = "rich_field_list") + private JSONArray richFieldList; + + /** + * 微信格式化的选项类型 + */ + @JSONField(name = "common_field_id_list") + private HashSet commonFieldIdList; + + /** + * 自定义选项名称。 + */ + @JSONField(name = "custom_field_list") + private HashSet customFieldList; + + /** + * 自定义富文本类型 + */ + private FormBudiler addRichField(ActivateFormFieldType fieldType, String name, String... values) { + if (richFieldList == null) { + richFieldList = new JSONArray(); + } + JSONObject obj = new JSONObject(); + obj.put("type", fieldType); + obj.put("name", name); + obj.put("values", values); + richFieldList.add(obj); + return this; + } + + /** + * 自定义公共字段 + */ + public FormBudiler addCommonField(ActivateCommonField... fields) { + if (commonFieldIdList == null) { + commonFieldIdList = new HashSet(); + } + for (ActivateCommonField field : fields) { + commonFieldIdList.add(field); + } + return this; + } + + /** + * 增加自定义的内容 + * @param names + */ + public FormBudiler addCustomField(String... names) { + if (customFieldList == null) { + customFieldList = new HashSet(); + } + for (String name : names) { + customFieldList.add(name); + } + return this; + } + + + + } + +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserInfo.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserInfo.java new file mode 100644 index 00000000..fc4b4070 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberUserInfo.java @@ -0,0 +1,165 @@ +package com.foxinmy.weixin4j.model.card; + +import com.alibaba.fastjson.annotation.JSONField; +import com.alibaba.fastjson.annotation.JSONType; +import com.foxinmy.weixin4j.type.Gender; +import com.foxinmy.weixin4j.type.card.UserCardStatus; +import com.foxinmy.weixin4j.util.NameValue; +import com.foxinmy.weixin4j.xml.ListsuffixResult; + +import java.util.ArrayList; +import java.util.Map; + +/** + * 会员卡的基本信息 + * + * @auther: Feng Yapeng + * @since: 2016/12/21 11:33 + */ +public class MemberUserInfo { + + /** + * openId + */ + @JSONField(name = "openid") + private String openId; + /** + * 昵称 + */ + @JSONField(name = "nickname") + private String nickName; + + /** + * 会员卡编号 + */ + @JSONField(name = "mmebership_number") + private String membershipNumber; + /** + * 积分 + */ + private Integer bonus; + /** + * 余额 + */ + private Integer balance; + /** + * 性别 + */ + private String sex; + /** + * 用户会员卡状态 + */ + @JSONField(name = "user_card_status") + private UserCardStatus userCardStatus; + + /** + * 是否已经被激活,true表示已经被激活,false表示未被激活 + */ + @JSONField(name = "has_active") + private boolean hasActive; + + /** + * 用户信息 + */ + @JSONField(name = "user_info") + private UserInfo userInfo; + + public String getOpenId() { + return openId; + } + + public void setOpenId(String openId) { + this.openId = openId; + } + + public String getNickName() { + return nickName; + } + + public void setNickName(String nickName) { + this.nickName = nickName; + } + + public String getMembershipNumber() { + return membershipNumber; + } + + public void setMembershipNumber(String membershipNumber) { + this.membershipNumber = membershipNumber; + } + + public Integer getBonus() { + return bonus; + } + + public void setBonus(Integer bonus) { + this.bonus = bonus; + } + + public Integer getBalance() { + return balance; + } + + public void setBalance(Integer balance) { + this.balance = balance; + } + + public String getSex() { + return sex; + } + + public void setSex(String sex) { + this.sex = sex; + } + + public UserCardStatus getUserCardStatus() { + return userCardStatus; + } + + public void setUserCardStatus(UserCardStatus userCardStatus) { + this.userCardStatus = userCardStatus; + } + + public boolean isHasActive() { + return hasActive; + } + + public void setHasActive(boolean hasActive) { + this.hasActive = hasActive; + } + + public UserInfo getUserInfo() { + return userInfo; + } + + public void setUserInfo(UserInfo userInfo) { + this.userInfo = userInfo; + } + + public static final class UserInfo { + + @JSONField(name = "common_field_list") + private ArrayList commonFieldValues; + + @JSONField(name = "custom_field_list") + private ArrayList customFieldValues; + + public ArrayList getCommonFieldValues() { + return commonFieldValues; + } + + public void setCommonFieldValues(ArrayList commonFieldValues) { + this.commonFieldValues = commonFieldValues; + } + + public ArrayList getCustomFieldValues() { + return customFieldValues; + } + + public void setCustomFieldValues(ArrayList customFieldValues) { + this.customFieldValues = customFieldValues; + } + } + + +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateCommonField.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateCommonField.java new file mode 100644 index 00000000..a9f1611f --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateCommonField.java @@ -0,0 +1,66 @@ +package com.foxinmy.weixin4j.type.card; + +/** + * 会员卡激活设置公共字段类型 + * + * @auther: Feng Yapeng + * @since: 2016/12/20 14:49 + */ +public enum ActivateCommonField { + + /** + * 手机号 + */ + USER_FORM_INFO_FLAG_MOBILE, + + /** + * 性别 + */ + USER_FORM_INFO_FLAG_SEX, + + /** + * 姓名 + */ + USER_FORM_INFO_FLAG_NAME, + + /** + * 生日 + */ + USER_FORM_INFO_FLAG_BIRTHDAY, + + /** + * 身份证 + */ + USER_FORM_INFO_FLAG_IDCARD, + + /** + * 邮箱 + */ + USER_FORM_INFO_FLAG_EMAIL, + + /** + * 详细地址 + */ + USER_FORM_INFO_FLAG_LOCATION, + + /** + * 教育背景 + */ + USER_FORM_INFO_FLAG_EDUCATION_BACKGRO, + + /** + * 行业 + */ + USER_FORM_INFO_FLAG_INDUSTRY, + + /** + * 收入 + */ + USER_FORM_INFO_FLAG_INCOME, + + /** + * 兴趣爱好 + */ + USER_FORM_INFO_FLAG_HABIT; + +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateFormFieldType.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateFormFieldType.java new file mode 100644 index 00000000..e70c35e9 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/ActivateFormFieldType.java @@ -0,0 +1,16 @@ +package com.foxinmy.weixin4j.type.card; + +/** + * 激活form表单字段类型 + * + * @auther: Feng Yapeng + * @since: 2016/12/20 15:34 + */ +public enum ActivateFormFieldType { + + FORM_FIELD_RADIO,/*自定义单选 */ + + FORM_FIELD_SELECT,/*自定义选择项 */ + + FORM_FIELD_CHECK_BOX,/*自定义多选*/; +} diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/UserCardStatus.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/UserCardStatus.java new file mode 100644 index 00000000..2fcdef87 --- /dev/null +++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/type/card/UserCardStatus.java @@ -0,0 +1,19 @@ +package com.foxinmy.weixin4j.type.card; + +/** + * 用户的会员卡状态 + * + * @auther: Feng Yapeng + * @since: 2016/12/21 11:42 + */ +public enum UserCardStatus { + + NORMAL,//正常 + EXPIRE,//已过期 + GIFTING,// 转赠中 + GIFT_SUCC,// 转赠成功 + GIFT_TIMEOUT,// 转赠超时 + DELETE,//已删除 + UNAVAILABLE,//已失效 + ; +} diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java index a3fc98b4..9d4f17fd 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/CardApi.java @@ -1,6 +1,7 @@ package com.foxinmy.weixin4j.mp.api; import java.io.IOException; +import java.util.List; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; @@ -15,6 +16,7 @@ import com.foxinmy.weixin4j.model.card.CardQR; import com.foxinmy.weixin4j.model.qr.QRParameter; import com.foxinmy.weixin4j.model.qr.QRResult; import com.foxinmy.weixin4j.token.TokenManager; +import com.foxinmy.weixin4j.type.card.CardType; import com.foxinmy.weixin4j.util.IOUtil; /** @@ -28,7 +30,7 @@ import com.foxinmy.weixin4j.util.IOUtil; * href="https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1451025056&token=&lang=zh_CN">卡券说明 */ public class CardApi extends MpApi { - private final TokenManager tokenManager; + protected final TokenManager tokenManager; public CardApi(TokenManager tokenManager) { this.tokenManager = tokenManager; @@ -155,4 +157,77 @@ public class CardApi extends MpApi { } return result; } + + /** + * 由于卡券有审核要求,为方便公众号调试,可以设置一些测试帐号,这些帐号可领取未通过审核的卡券,体验整个流程。 + * 1.同时支持“openid”、“username”两种字段设置白名单,总数上限为10个。 + * 2.设置测试白名单接口为全量设置,即测试名单发生变化时需调用该接口重新传入所有测试人员的ID. + * 3.白名单用户领取该卡券时将无视卡券失效状态,请开发者注意。 + * @param openIds the open ids + * @param userNames the user names + * @author fengyapeng + * @since 2016 -12-20 11:22:57 + * @see 设置测试白名单 + */ + public void setTestWhiteList(List openIds, List userNames) throws WeixinException { + JSONObject requestObj = new JSONObject(); + if (openIds != null && openIds.size() > 0) { + requestObj.put("openid", openIds); + } + if (userNames != null && userNames.size() > 0) { + requestObj.put("username", userNames); + } + String card_set_test_whitelist_uri = getRequestUri("card_set_test_whitelist_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor.post( + String.format(card_set_test_whitelist_uri, token.getAccessToken()), + requestObj.toJSONString()); + } + + /** + * 查看获取卡券的审核状态 + * @see 查看卡券详情 + * + * @author fengyapeng + * @since 2016 -12-20 11:48:23 + */ + public void getCardStatus(String cardId) throws WeixinException { + JSONObject requestObj = new JSONObject(); + requestObj.put("card_id",cardId); + String card_get_uri = getRequestUri("card_get_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor.post(String.format(card_get_uri, token.getAccessToken()),requestObj.toJSONString()); + JSONObject responseAsJson = response.getAsJson(); + JSONObject card = responseAsJson.getJSONObject("card"); + String cardType = card.getString("card_type"); + JSONObject baseInfo = card.getJSONObject(cardType.toLowerCase()).getJSONObject("base_info"); + baseInfo.get("status"); + } + + /** + * 支持更新所有卡券类型的部分通用字段及特殊卡券(会员卡、飞机票、电影票、会议门票)中特定字段的信息。 + * + * @param cardId the card id + * @param card the card + * @return 是否提交审核,false为修改后不会重新提审,true为修改字段后重新提审,该卡券的状态变为审核中 + * @throws WeixinException the weixin exception + * @author fengyapeng + * @see + * @since 2016 -12-21 15:29:10 + */ + public Boolean updateCardCoupon(String cardId, CardCoupon card) throws WeixinException { + JSONObject request = new JSONObject(); + request.put("card_id", cardId); + CardType cardType = card.getCardType(); + request.put(cardType.name().toLowerCase(), card); + String card_update_uri = getRequestUri("card_update_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor.post(String.format(card_update_uri,token.getAccessToken()),JSON.toJSONString(request)); + JSONObject jsonObject= response.getAsJson(); + return jsonObject.getBoolean("send_check"); + } + + + + } diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MemberCardApi.java b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MemberCardApi.java new file mode 100644 index 00000000..c3b2e925 --- /dev/null +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/MemberCardApi.java @@ -0,0 +1,95 @@ +package com.foxinmy.weixin4j.mp.api; + +import com.alibaba.fastjson.JSON; +import com.alibaba.fastjson.JSONObject; +import com.alibaba.fastjson.TypeReference; +import com.foxinmy.weixin4j.exception.WeixinException; +import com.foxinmy.weixin4j.http.weixin.ApiResult; +import com.foxinmy.weixin4j.http.weixin.WeixinResponse; +import com.foxinmy.weixin4j.model.Token; +import com.foxinmy.weixin4j.model.card.MemberInitInfo; +import com.foxinmy.weixin4j.model.card.MemberUpdateInfo; +import com.foxinmy.weixin4j.model.card.MemberUserForm; +import com.foxinmy.weixin4j.model.card.MemberUserInfo; +import com.foxinmy.weixin4j.token.TokenManager; + +/** + * 会员卡的api + * + * @auther: Feng Yapeng + * @since: 2016/12/20 14:43 + * @see 创建会员卡&会员卡管理 + */ +public class MemberCardApi extends CardApi { + + + public MemberCardApi(TokenManager tokenManager) { + super(tokenManager); + } + + /** + * 激活方式说明 + * 接口激活通常需要开发者开发用户填写资料的网页。通常有两种激活流程: + * 1. 用户必须在填写资料后才能领卡,领卡后开发者调用激活接口为用户激活会员卡; + * 2. 是用户可以先领取会员卡,点击激活会员卡跳转至开发者设置的资料填写页面,填写完成后开发者调用激活接口为用户激活会员卡。 + * + * @see 接口激活 + */ + public ApiResult activate(MemberInitInfo memberInitInfo) throws WeixinException { + String card_member_card_activate_uri = getRequestUri("card_member_card_activate_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor + .post(String.format(card_member_card_activate_uri, token.getAccessToken()), JSON.toJSONString(memberInitInfo)); + return response.getAsResult(); + } + + /** + * 设置开卡字段接口 + * 开发者在创建时填入wx_activate字段后, + * 需要调用该接口设置用户激活时需要填写的选项,否则一键开卡设置不生效。 + * + * @see 一键激活 + */ + public ApiResult setActivateUserForm(MemberUserForm memberUserForm) throws WeixinException { + String user_form_uri = getRequestUri("card_member_card_activate_user_form_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor + .post(String.format(user_form_uri, token.getAccessToken()), JSON.toJSONString(memberUserForm)); + return response.getAsResult(); + } + + /** + * 拉取会员信息接口。 + * + * @param cardId the card id + * @param code the code + * @author fengyapeng + * @since 2016 -12-21 11:28:45 + */ + public MemberUserInfo getMemberUserInfo(String cardId, String code) throws WeixinException { + String user_info_uri = getRequestUri("card_member_card_user_info_uri"); + Token token = tokenManager.getCache(); + JSONObject jsonObject = new JSONObject(); + jsonObject.put("card_id", cardId); + jsonObject.put("code", code); + WeixinResponse response = weixinExecutor.post(String.format(user_info_uri, token.getAccessToken()), JSON.toJSONString(jsonObject)); + return response.getAsObject(new TypeReference() { + }); + } + + /** + * 更新会员 + * @param updateInfo + * @return + * @throws WeixinException + */ + public JSONObject updateUserInfo(MemberUpdateInfo updateInfo) throws WeixinException { + String card_member_card_update_user_uri = getRequestUri("card_member_card_update_user_uri"); + Token token = tokenManager.getCache(); + WeixinResponse response = weixinExecutor + .post(String.format(card_member_card_update_user_uri, token.getAccessToken()), JSON.toJSONString(updateInfo)); + return response.getAsJson(); + } + + +} diff --git a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties index faf57280..f7550e60 100644 --- a/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties +++ b/weixin4j-mp/src/main/java/com/foxinmy/weixin4j/mp/api/weixin.properties @@ -190,11 +190,11 @@ tag_untagging_uri={api_cgi_url}/tags/members/batchuntagging?access_token=%s tag_userids_uri={api_cgi_url}/tags/getidlist?access_token=%s # \u83B7\u53D6\u6807\u7B7E\u4E0B\u7C89\u4E1D\u5217\u8868 tag_user_uri={api_cgi_url}/user/tag/get?access_token=%s -# \u83b7\u53d6\u9ed1\u540d\u5355\u5217\u8868 +# \u83B7\u53D6\u9ED1\u540D\u5355\u5217\u8868 getblacklist_uri={api_cgi_url}/tags/members/getblacklist?access_token=%s -# \u62c9\u9ed1\u7528\u6237 +# \u62C9\u9ED1\u7528\u6237 batchblacklist_uri={api_cgi_url}/tags/members/batchblacklist?access_token=%s -# \u53d6\u6d88\u62c9\u9ed1\u7528\u6237 +# \u53D6\u6D88\u62C9\u9ED1\u7528\u6237 batchunblacklist_uri={api_cgi_url}/tags/members/batchunblacklist?access_token=%s # \u521B\u5EFA\u5361\u5238 @@ -205,6 +205,20 @@ card_paycell_uri={api_base_url}/card/paycell/set?access_token=%s card_selfconsumecell_uri={api_base_url}/card/selfconsumecell/set?access_token=%s # \u521B\u5EFA\u5361\u5238\u4E8C\u7EF4\u7801\u63A5\u53E3 card_qr_ticket_uri={api_base_url}/card/qrcode/create?access_token=%s +# \u4FEE\u6539\u5361\u5238 +card_update_uri={api_base_url}/card/update?access_token=%s +#\u8BBE\u7F6E\u6D4B\u8BD5\u767D\u540D\u5355\u63A5\u53E3 +card_set_test_whitelist_uri={api_base_url}/card/testwhitelist/set?access_token=%s +#\u67E5\u770B\u5361\u5238\u8BE6\u60C5\u63A5\u53E3 +card_get_uri={api_base_url}/card/get?access_token=%s +#\u4F1A\u5458\u5361\u6FC0\u6D3B\u63A5\u53E3 +card_member_card_activate_uri={api_base_url}/card/membercard/activate?access_token=%s +#\u8BBE\u7F6E\u4F1A\u5458\u5361\u5F00\u5361\u5B57\u6BB5 +card_member_card_activate_user_form_uri={api_base_url}/card/membercard/activateuserform/set?access_token=%s +#\u4F1A\u5458\u5361\u7528\u6237\u4FE1\u606F +card_member_card_user_info_uri={api_base_url}/card/membercard/userinfo/get?access_token=%s +#\u66F4\u65B0\u4F1A\u5458\u4FE1\u606F +card_member_card_update_user_uri={api_base_url}/card/membercard/updateuser?access_token=%s # \u4F7F\u7528\u6388\u6743\u7801\u6362\u53D6\u516C\u4F17\u53F7\u7684\u63A5\u53E3\u8C03\u7528\u51ED\u636E\u548C\u6388\u6743\u4FE1\u606F component_exchange_authorizer_uri={api_cgi_url}/component/api_query_auth?component_access_token=%s diff --git a/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MemberCardTest.java b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MemberCardTest.java new file mode 100644 index 00000000..be7d8619 --- /dev/null +++ b/weixin4j-mp/src/test/java/com/foxinmy/weixin4j/mp/test/MemberCardTest.java @@ -0,0 +1,16 @@ +package com.foxinmy.weixin4j.mp.test; + +/** + * 会员卡测试 + * + * @auther: Feng Yapeng + * @since: 2016/12/21 16:37 + */ +public class MemberCardTest extends TokenTest { + + + public void create(){ + + } + +}