diff --git a/pom.xml b/pom.xml
index 7ee01f65..8e290ca2 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
4.0.0
com.foxinmy
weixin4j
- 1.7.3-SNAPSHOT
+ 1.7.4-SNAPSHOT
pom
weixin4j
https://github.com/foxinmy/weixin4j
diff --git a/weixin4j-base/pom.xml b/weixin4j-base/pom.xml
index 1457cf0e..35f59332 100644
--- a/weixin4j-base/pom.xml
+++ b/weixin4j-base/pom.xml
@@ -5,7 +5,7 @@
com.foxinmy
weixin4j
- 1.7.3-SNAPSHOT
+ 1.7.4-SNAPSHOT
weixin4j-base
weixin4j-base
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java
index 5b74b367..10631632 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/api/BaseApi.java
@@ -20,6 +20,8 @@ public abstract class BaseApi {
protected final WeixinRequestExecutor weixinExecutor;
+ private final Pattern uriPattern = Pattern.compile("(\\{[^\\}]*\\})");
+
public BaseApi() {
this.weixinExecutor = new WeixinRequestExecutor();
}
@@ -28,8 +30,7 @@ public abstract class BaseApi {
protected String getRequestUri(String key) {
String url = weixinBundle().getString(key);
- Pattern p = Pattern.compile("(\\{[^\\}]*\\})");
- Matcher m = p.matcher(url);
+ Matcher m = uriPattern.matcher(url);
StringBuffer sb = new StringBuffer();
String sub = null;
while (m.find()) {
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml
index aa0ec8d8..81665ba5 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/http/weixin/error.xml
@@ -264,7 +264,7 @@
40073
- 不合法的openid
+ 不合法的cardid
40074
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 41508381..dab7f995 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
@@ -115,4 +115,11 @@ public final class CardCoupons {
GrouponCoupon coupon = new GrouponCoupon(couponBaseInfo, explain);
return coupon;
}
+
+
+ public static MemberCard createMemberCard(CouponBaseInfo.Builder baseBuilder, MemberCard.Builder memberCardBudiler) {
+ baseBuilder.build();
+ MemberCard memberCard = new MemberCard(baseBuilder.build(), memberCardBudiler);
+ return memberCard;
+ }
}
\ No newline at end of file
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CouponBaseInfo.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CouponBaseInfo.java
index 6933e86e..14b479b9 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CouponBaseInfo.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/CouponBaseInfo.java
@@ -432,9 +432,13 @@ public class CouponBaseInfo implements Serializable {
*/
private boolean canGiveFriend;
+ /**
+ * 默认永久有效
+ */
public Builder() {
this.sku = new JSONObject();
this.date = new JSONObject();
+ this.date.put("type",CardActiveType.DATE_TYPE_PERMANENT);
this.useAllLocation = true;
this.canShare = true;
this.canGiveFriend = true;
@@ -534,6 +538,7 @@ public class CouponBaseInfo implements Serializable {
* @return
*/
public Builder quantity(int quantity) {
+ quantity = quantity > 100000000 ? 100000000 : quantity;
this.sku.put("quantity", quantity);
return this;
}
@@ -807,7 +812,10 @@ public class CouponBaseInfo implements Serializable {
/**
* 表示固定时长 (自领取后按天算。
*/
- DATE_TYPE_FIX_TERM;
+ DATE_TYPE_FIX_TERM, /**
+ * 永久有效
+ */
+ DATE_TYPE_PERMANENT;
}
}
}
diff --git a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberCard.java b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberCard.java
index 2cb211fb..3c411df0 100644
--- a/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberCard.java
+++ b/weixin4j-base/src/main/java/com/foxinmy/weixin4j/model/card/MemberCard.java
@@ -53,7 +53,7 @@ public class MemberCard extends CardCoupon {
* 显示余额
*/
@JSONField(name = "supply_balance")
- private String supplyBalance;
+ private boolean supplyBalance;
/**
* 设置跳转外链查看余额详情。仅适用于余额无法通过激活接口同步的情况下使用该字段。
*/
@@ -134,6 +134,7 @@ public class MemberCard extends CardCoupon {
this.bonusRule = builder.bonusRule;
}
+ @JSONField(serialize = false)
@Override
public CardType getCardType() {
return CardType.MEMBER_CARD;
@@ -167,7 +168,7 @@ public class MemberCard extends CardCoupon {
return bonusUrl;
}
- public String getSupplyBalance() {
+ public boolean getSupplyBalance() {
return supplyBalance;
}
@@ -248,7 +249,7 @@ public class MemberCard extends CardCoupon {
/**
* 显示余额
*/
- private String supplyBalance;
+ private boolean supplyBalance;
/**
* 设置跳转外链查看余额详情。仅适用于余额无法通过激活接口同步的情况下使用该字段。
*/
@@ -291,92 +292,98 @@ public class MemberCard extends CardCoupon {
private MemCardBonusRule bonusRule;
- public Builder setBackgroundPicUrl(String backgroundPicUrl) {
+ public Builder backgroundPicUrl(String backgroundPicUrl) {
this.backgroundPicUrl = backgroundPicUrl;
return this;
}
- public Builder setPrerogative(String prerogative) {
+ public Builder prerogative(String prerogative) {
this.prerogative = prerogative;
return this;
}
- public Builder setAutoActivate(boolean autoActivate) {
+ public Builder activateWithAuto(boolean autoActivate) {
this.autoActivate = autoActivate;
+ this.activateUrl = null;
+ this.wxActivate = false;
return this;
}
- public Builder setWxActivate(boolean wxActivate) {
+ public Builder activateWithWx(boolean wxActivate) {
this.wxActivate = wxActivate;
+ this.autoActivate = false;
+ this.activateUrl = null;
return this;
}
- public Builder setActivateUrl(String activateUrl) {
+ public Builder activateUrl(String activateUrl) {
this.activateUrl = activateUrl;
+ this.autoActivate = false;
+ this.wxActivate = false;
return this;
}
- public Builder setSupplyBonus(boolean supplyBonus) {
+ public Builder supplyBonus(boolean supplyBonus) {
this.supplyBonus = supplyBonus;
return this;
}
- public Builder setBonusUrl(String bonusUrl) {
+ public Builder bonusUrl(String bonusUrl) {
this.bonusUrl = bonusUrl;
return this;
}
- public Builder setSupplyBalance(String supplyBalance) {
+ public Builder supplyBalance(boolean supplyBalance) {
this.supplyBalance = supplyBalance;
return this;
}
- public Builder setBalanceUrl(String balanceUrl) {
+ public Builder balanceUrl(String balanceUrl) {
this.balanceUrl = balanceUrl;
return this;
}
- public Builder setCustomField1(FieldNameType type, String name, String url) {
+ public Builder customField1(FieldNameType type, String name, String url) {
this.customField1 = new MemCardCustomField(type, name, url);
return this;
}
- public Builder setCustomField2(FieldNameType type, String name, String url) {
+ public Builder customField2(FieldNameType type, String name, String url) {
this.customField2 = new MemCardCustomField(type, name, url);
return this;
}
- public Builder setCustomField3(FieldNameType type, String name, String url) {
+ public Builder customField3(FieldNameType type, String name, String url) {
this.customField3 = new MemCardCustomField(type, name, url);
return this;
}
- public Builder setBonusRules(String bonusRules) {
+ public Builder bonusRules(String bonusRules) {
this.bonusRules = bonusRules;
return this;
}
- public Builder setBalanceRules(String balanceRules) {
+ public Builder balanceRules(String balanceRules) {
this.balanceRules = balanceRules;
return this;
}
- public Builder setBonusCleared(String bonusCleared) {
+ public Builder bonusCleared(String bonusCleared) {
this.bonusCleared = bonusCleared;
return this;
}
- public Builder setCustomCell1(String name, String url, String tips) {
+ public Builder customCell1(String name, String url, String tips) {
this.customCell1 = new MemCardCustomField(name, url, tips);
return this;
}
- public Builder setDiscount(int discount) {
+ public Builder discount(int discount) {
this.discount = discount;
return this;
}
- public Builder setBonusRule(MemCardBonusRule bonusRule) {
+ public Builder bonusRule(MemCardBonusRule bonusRule) {
this.bonusRule = bonusRule;
return this;
}
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
index 5dc69e59..efdb31be 100644
--- 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
@@ -84,6 +84,14 @@ public class MemberUserForm {
this.optionalForm = formBudiler;
}
+ public FormBudiler getRequiredForm() {
+ return requiredForm;
+ }
+
+ public FormBudiler getOptionalForm() {
+ return optionalForm;
+ }
+
public final static class FormBudiler {
/**
@@ -91,6 +99,7 @@ public class MemberUserForm {
* 的字段是否允许用户激活后再次修改,商户设置为true
* 时,需要接收相应事件通知处理修改事件
*/
+ @JSONField(name = "can_modify")
private boolean canModify;
/**
* 自定义富文本类型,包含以下三个字段
@@ -113,7 +122,7 @@ public class MemberUserForm {
/**
* 自定义富文本类型
*/
- private FormBudiler addRichField(ActivateFormFieldType fieldType, String name, String... values) {
+ public FormBudiler addRichField(ActivateFormFieldType fieldType, String name, String... values) {
if (richFieldList == null) {
richFieldList = new JSONArray();
}
@@ -125,6 +134,12 @@ public class MemberUserForm {
return this;
}
+ public FormBudiler canModify(boolean modify){
+ this.canModify = canModify;
+ return this;
+ }
+
+
/**
* 自定义公共字段
*/
@@ -152,8 +167,21 @@ public class MemberUserForm {
return this;
}
+ public boolean isCanModify() {
+ return canModify;
+ }
+ public JSONArray getRichFieldList() {
+ return richFieldList;
+ }
+ public HashSet getCommonFieldIdList() {
+ return commonFieldIdList;
+ }
+
+ public HashSet getCustomFieldList() {
+ return customFieldList;
+ }
}
}
diff --git a/weixin4j-mp/pom.xml b/weixin4j-mp/pom.xml
index 37a3f242..ff30b420 100644
--- a/weixin4j-mp/pom.xml
+++ b/weixin4j-mp/pom.xml
@@ -5,7 +5,7 @@
com.foxinmy
weixin4j
- 1.7.3-SNAPSHOT
+ 1.7.4-SNAPSHOT
weixin4j-mp
weixin4j-mp
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
index be7d8619..89452588 100644
--- 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
@@ -1,16 +1,134 @@
package com.foxinmy.weixin4j.mp.test;
+import com.foxinmy.weixin4j.exception.WeixinException;
+import com.foxinmy.weixin4j.http.weixin.ApiResult;
+import com.foxinmy.weixin4j.model.card.CardCoupon;
+import com.foxinmy.weixin4j.model.card.CardCoupons;
+import com.foxinmy.weixin4j.model.card.CardQR;
+import com.foxinmy.weixin4j.model.card.CouponBaseInfo;
+import com.foxinmy.weixin4j.model.card.MemberCard;
+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.model.qr.QRResult;
+import com.foxinmy.weixin4j.mp.api.CardApi;
+import com.foxinmy.weixin4j.mp.api.MemberCardApi;
+import com.foxinmy.weixin4j.type.card.ActivateCommonField;
+import com.foxinmy.weixin4j.type.card.ActivateFormFieldType;
+import com.foxinmy.weixin4j.type.card.CardCodeType;
+import com.foxinmy.weixin4j.type.card.CardColor;
+import com.foxinmy.weixin4j.type.card.FieldNameType;
+
+import org.junit.Before;
+import org.junit.Test;
+
/**
* 会员卡测试
*
* @auther: Feng Yapeng
* @since: 2016/12/21 16:37
*/
-public class MemberCardTest extends TokenTest {
+public class MemberCardTest extends TokenTest {
+
+ private CardApi cardApi;
+
+ private MemberCardApi memberCardApi;
+
+ @Before
+ public void init() {
+ cardApi = new CardApi(tokenManager);
+ memberCardApi = new MemberCardApi(tokenManager);
+ }
+
+ /**
+ * pn-YDwk59Ft0JSFdGqObxUccUQHw
+ */
+ @Test
+ public void create() throws WeixinException {
+ CouponBaseInfo.Builder builder = CardCoupons.customBase();
+ // 基础必填字段
+ builder.logoUrl(
+ "http://mmbiz.qpic.cn/mmbiz_jpg/LtkLicv5iclfqzGpaDqDoMibM6FcMVTrmYXjLu7bJ1tM5MzCxNONQiaZHqrYzs0fTk2T5bLAAXLpvx32hQLmJTGBxQ/0")
+ .codeType(CardCodeType.CODE_TYPE_BARCODE).brandName("***").title("***会员卡").cardColor(CardColor.Color010).notice("请出示会员卡")
+ .description("***的会员卡的描述").quantity(10000);
+ // 基础选填字段
+ builder.canShare(false).canGiveFriend(false);
+ builder.centerTitle("卡券居中按钮").centerSubTitle("显示在入口下方的提示语");
+ MemberCard.Builder memberCardBuilder = CardCoupons.customMemberCard();
+ //会员卡必填字段
+ // 会员卡选填字段
+ memberCardBuilder.prerogative("会员卡特权说明").supplyBalance(true).supplyBonus(false).activateWithWx(true);
+ memberCardBuilder.customField1(FieldNameType.FIELD_NAME_TYPE_LEVEL, "等级", null);
+ memberCardBuilder.backgroundPicUrl(
+ "https://mmbiz.qlogo.cn/mmbiz/2FyQ9TURqmdibM6nYBiagZT49lSlY9Aicw4P3vsoa7dEZIYfNkiaMyzNVYT9jmYhjBbeC8jnkibwbibB5tghC5XcgysQ/0?wx_fmt=jpeg");
+
+ MemberCard memberCard = CardCoupons.createMemberCard(builder, memberCardBuilder);
+ String cardId = memberCardApi.createCardCoupon(memberCard);
+ System.out.println(cardId);
+ }
- public void create(){
+ @Test
+ public void createCardQR() throws WeixinException {
+ CardQR.Builder builder = new CardQR.Builder("pn-YDwk59Ft0JSFdGqObxUccUQHw");
+ QRResult qrResult = memberCardApi.createCardQR(36000, builder.build());
+ String showUrl = qrResult.getShowUrl();
+ System.out.println(showUrl);
+ }
+
+ @Test
+ public void setMemberUserForm() throws WeixinException {
+ MemberUserForm memberUserForm = new MemberUserForm();
+ memberUserForm.setCardId("pn-YDwk59Ft0JSFdGqObxUccUQHw");
+ MemberUserForm.FormBudiler requiredForm = new MemberUserForm.FormBudiler();
+ requiredForm.canModify(false);
+ requiredForm.addCommonField(ActivateCommonField.USER_FORM_INFO_FLAG_EMAIL, ActivateCommonField.USER_FORM_INFO_FLAG_BIRTHDAY,
+ ActivateCommonField.USER_FORM_INFO_FLAG_MOBILE)
+ .addRichField(ActivateFormFieldType.FORM_FIELD_CHECK_BOX, "checkBox", "value1", "value2", "value3");
+
+ memberUserForm.setRequiredForm(requiredForm);
+ MemberUserForm.FormBudiler optionalFormBuilder = new MemberUserForm.FormBudiler();
+ optionalFormBuilder.canModify(false);
+ optionalFormBuilder.addCommonField(ActivateCommonField.USER_FORM_INFO_FLAG_IDCARD)
+ .addRichField(ActivateFormFieldType.FORM_FIELD_CHECK_BOX, "checkBoxOPt", "value1", "value2", "value3");
+ memberUserForm.setOptionalForm(optionalFormBuilder);
+ memberUserForm.setServiceStatement("会员守则","https://www.baidu.com");
+ ApiResult apiResult = memberCardApi.setActivateUserForm(memberUserForm);
+ }
+
+
+ @Test
+ public void getMemberUserInfo() throws WeixinException {
+ MemberUserInfo memberUserInfo = memberCardApi.getMemberUserInfo("pn-YDwk59Ft0JSFdGqObxUccUQHw", "270869833860");
+ System.out.println(memberUserInfo);
+ }
+
+ @Test
+ public void initMemberUser() throws WeixinException {
+ MemberInitInfo memberInitInfo = new MemberInitInfo();
+ memberInitInfo.setCardId("pn-YDwk59Ft0JSFdGqObxUccUQHw");
+ memberInitInfo.setCode("270869833860");
+ memberInitInfo.setBackgroundPicUrl("https://mmbiz.qlogo.cn/mmbiz/2FyQ9TURqmdibM6nYBiagZT49lSlY9Aicw4HnSKzouD9iaksVA8vIbFT3RuqnWDVMNZib21NDdwKn5OMVMwfSsULXGw/0?wx_fmt=jpeg");
+ memberInitInfo.setInit_custom_field_value1("铂金");
+ memberInitInfo.setInitBalance(2);
+ memberInitInfo.setInitBonus(2);
+ memberInitInfo.setInitBonusRecord("初始化积分");
+ ApiResult activate = memberCardApi.activate(memberInitInfo);
+ System.out.println(activate);
+ }
+
+ @Test
+ public void updateMmemberUser() throws WeixinException {
+ MemberUpdateInfo memberUpdateInfo = new MemberUpdateInfo();
+ memberUpdateInfo.setCardId("pn-YDwk59Ft0JSFdGqObxUccUQHw");
+ memberUpdateInfo.setCode("270869833860");
+ memberUpdateInfo.setAddBalance(20);
+ memberUpdateInfo.setRecordBalance("充值");
+ memberUpdateInfo.setNOtify(true,true);
+ memberUpdateInfo.setCustomFieldValue1("至尊铂金",true);
+ memberCardApi.updateUserInfo(memberUpdateInfo);
}
}
diff --git a/weixin4j-qy/pom.xml b/weixin4j-qy/pom.xml
index 893462bc..b10f053e 100644
--- a/weixin4j-qy/pom.xml
+++ b/weixin4j-qy/pom.xml
@@ -5,7 +5,7 @@
com.foxinmy
weixin4j
- 1.7.3-SNAPSHOT
+ 1.7.4-SNAPSHOT
weixin4j-qy
weixin4j-qy