@@ -2,9 +2,7 @@ package me.chanjar.weixin.mp.api; | |||
import me.chanjar.weixin.common.bean.WxCardApiSignature; | |||
import me.chanjar.weixin.common.error.WxErrorException; | |||
import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateRequest; | |||
import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateResult; | |||
import me.chanjar.weixin.mp.bean.card.WxMpCardQrcodeCreateResult; | |||
import me.chanjar.weixin.mp.bean.card.*; | |||
import me.chanjar.weixin.mp.bean.result.WxMpCardResult; | |||
/** | |||
@@ -14,6 +12,7 @@ import me.chanjar.weixin.mp.bean.result.WxMpCardResult; | |||
* @author yuanqixun 2018-08-29 | |||
*/ | |||
public interface WxMpCardService { | |||
String CARD_CREATE = "https://api.weixin.qq.com/card/create"; | |||
String CARD_GET = "https://api.weixin.qq.com/card/get"; | |||
String CARD_GET_TICKET = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=wx_card"; | |||
String CARD_CODE_DECRYPT = "https://api.weixin.qq.com/card/code/decrypt"; | |||
@@ -142,6 +141,14 @@ public interface WxMpCardService { | |||
*/ | |||
String addTestWhiteList(String openid) throws WxErrorException; | |||
/** | |||
* | |||
* @param cardCreateMessage | |||
* @return | |||
* @throws WxErrorException | |||
*/ | |||
WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException; | |||
/** | |||
* 创建卡券二维码 | |||
* | |||
@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl; | |||
import java.util.Arrays; | |||
import java.util.concurrent.locks.Lock; | |||
import me.chanjar.weixin.mp.bean.card.*; | |||
import org.apache.commons.lang3.StringUtils; | |||
import org.slf4j.Logger; | |||
import org.slf4j.LoggerFactory; | |||
@@ -22,9 +23,6 @@ import me.chanjar.weixin.common.util.crypto.SHA1; | |||
import me.chanjar.weixin.common.util.http.SimpleGetRequestExecutor; | |||
import me.chanjar.weixin.mp.api.WxMpCardService; | |||
import me.chanjar.weixin.mp.api.WxMpService; | |||
import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateRequest; | |||
import me.chanjar.weixin.mp.bean.card.WxMpCardLandingPageCreateResult; | |||
import me.chanjar.weixin.mp.bean.card.WxMpCardQrcodeCreateResult; | |||
import me.chanjar.weixin.mp.bean.result.WxMpCardResult; | |||
import me.chanjar.weixin.mp.enums.TicketType; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
@@ -265,6 +263,13 @@ public class WxMpCardServiceImpl implements WxMpCardService { | |||
return respone; | |||
} | |||
@Override | |||
public WxMpCardCreateResult createCard(WxMpCardCreateMessage cardCreateMessage) throws WxErrorException { | |||
String response = this.wxMpService.post(CARD_CREATE, GSON.toJson(cardCreateMessage)); | |||
return WxMpCardCreateResult.fromJson(response); | |||
} | |||
/** | |||
* 创建卡券二维码. | |||
*/ | |||
@@ -0,0 +1,31 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class Card implements Serializable { | |||
private static final long serialVersionUID = -3697110761983756780L; | |||
/** | |||
* 基本信息. | |||
*/ | |||
@SerializedName("base_info") | |||
private BaseInfo baseInfo; | |||
/** | |||
* 创建优惠券特有的高级字段. | |||
*/ | |||
@SerializedName("advanced_info") | |||
private AdvancedInfo advancedInfo; | |||
} |
@@ -0,0 +1,13 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import lombok.Data; | |||
import java.io.Serializable; | |||
/** | |||
* @Author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class CardCreateRequest implements Serializable { | |||
} |
@@ -0,0 +1,39 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public final class CashCard extends Card implements Serializable { | |||
private static final long serialVersionUID = 6965491956462769745L; | |||
/** | |||
* 代金券专用,表示起用金额(单位为分),如果无起用门槛则填0 | |||
*/ | |||
@SerializedName("least_cost") | |||
private int leastCost; | |||
/** | |||
* 代金券专用,表示减免金额。(单位为分) | |||
*/ | |||
@SerializedName("reduce_cost") | |||
private int reduceCost; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
public static CashCard fromJson(String json) { | |||
return WxMpGsonBuilder.create().fromJson(json, CashCard.class); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class CashCardCreateRequest extends CardCreateRequest implements Serializable { | |||
@SerializedName("card_type") | |||
private String cardType = "CASH"; | |||
private CashCard cash; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public final class DiscountCard extends Card implements Serializable { | |||
private static final long serialVersionUID = 1704610082472315077L; | |||
/** | |||
* 折扣券专用,表示打折额度(百分比)。填30就是七折。 | |||
*/ | |||
private int discount; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
public static DiscountCard fromJson(String json) { | |||
return WxMpGsonBuilder.create().fromJson(json, DiscountCard.class); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class DiscountCardCreateRequest extends CardCreateRequest implements Serializable { | |||
@SerializedName("card_type") | |||
private String cardType = "DISCOUNT"; | |||
private DiscountCard discount; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public final class GeneralCard extends Card implements Serializable { | |||
private static final long serialVersionUID = -1577656733441132585L; | |||
/** | |||
* 兑换券专用,填写兑换内容的名称。 | |||
*/ | |||
@SerializedName("default_detail") | |||
private String defaultDetail; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
public static GeneralCard fromJson(String json) { | |||
return WxMpGsonBuilder.create().fromJson(json, GeneralCard.class); | |||
} | |||
} |
@@ -0,0 +1,26 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class GeneralCardCreateRequest extends CardCreateRequest implements Serializable { | |||
@SerializedName("card_type") | |||
private String cardType = "GENERAL_COUPON"; | |||
@SerializedName("general_coupon") | |||
private GeneralCard generalCoupon; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
} |
@@ -0,0 +1,32 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public final class GiftCard extends Card implements Serializable { | |||
private static final long serialVersionUID = -6168739707511792266L; | |||
/** | |||
* 兑换券专用,填写兑换内容的名称。 | |||
*/ | |||
private String gift; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
public static GiftCard fromJson(String json) { | |||
return WxMpGsonBuilder.create().fromJson(json, GiftCard.class); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class GiftCardCreateRequest extends CardCreateRequest implements Serializable { | |||
@SerializedName("card_type") | |||
private String cardType = "GIFT"; | |||
private GiftCard gift; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
} |
@@ -0,0 +1,33 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public final class GrouponCard extends Card implements Serializable { | |||
private static final long serialVersionUID = 3221312561666697005L; | |||
/** | |||
* 团购券专用,团购详情 | |||
*/ | |||
@SerializedName("deal_detail") | |||
private String dealDetail; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
public static GrouponCard fromJson(String json) { | |||
return WxMpGsonBuilder.create().fromJson(json, GrouponCard.class); | |||
} | |||
} |
@@ -0,0 +1,25 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* . | |||
* @author leeis | |||
* @Date 2018/12/29 | |||
*/ | |||
@Data | |||
public class GrouponCardCreateRequest extends CardCreateRequest implements Serializable { | |||
@SerializedName("card_type") | |||
private String cardType = "GROUPON"; | |||
private GrouponCard groupon; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
} |
@@ -0,0 +1,23 @@ | |||
package me.chanjar.weixin.mp.bean.card; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import me.chanjar.weixin.mp.util.json.WxMpGsonBuilder; | |||
import java.io.Serializable; | |||
@Data | |||
public final class WxMpCardCreateMessage implements Serializable { | |||
@SerializedName("card") | |||
private CardCreateRequest cardCreateRequest; | |||
@Override | |||
public String toString() { | |||
return WxMpGsonBuilder.create().toJson(this); | |||
} | |||
public static WxMpCardCreateMessage fromJson(String json) { | |||
return WxMpGsonBuilder.create().fromJson(json, WxMpCardCreateMessage.class); | |||
} | |||
} |
@@ -2,8 +2,10 @@ package me.chanjar.weixin.mp.api.impl; | |||
import com.google.inject.Inject; | |||
import me.chanjar.weixin.common.bean.WxCardApiSignature; | |||
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.card.*; | |||
import me.chanjar.weixin.mp.bean.result.WxMpCardResult; | |||
import org.testng.annotations.*; | |||
@@ -100,4 +102,98 @@ public class WxMpCardServiceImplTest { | |||
assertNotNull(result); | |||
System.out.println(result); | |||
} | |||
@Test | |||
public void testCreateGrouponCard() throws WxErrorException { | |||
BaseInfo base = new BaseInfo(); | |||
base.setLogoUrl("http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZJkmG8xXhiaHqkKSVMMWeN3hLut7X7hicFNjakmxibMLGWpXrEXB33367o7zHN0CwngnQY7zb7g/0"); | |||
base.setBrandName("测试优惠券"); | |||
base.setCodeType("CODE_TYPE_QRCODE"); | |||
base.setTitle("测试标题"); | |||
base.setColor("Color010"); | |||
base.setNotice("测试Notice"); | |||
base.setServicePhone("020-88888888"); | |||
base.setDescription("不可与其他优惠同享\\n如需团购券发票,请在消费时向商户提出\\n店内均可使用,仅限堂食"); | |||
DateInfo info = new DateInfo(); | |||
info.setType("DATE_TYPE_FIX_TERM"); | |||
info.setFixedBeginTerm(0); | |||
info.setFixedTerm(30); | |||
base.setDateInfo(info); | |||
Sku sku = new Sku(); | |||
sku.setQuantity(100); | |||
base.setSku(sku); | |||
base.setGetLimit(1); | |||
base.setCanShare(true); | |||
base.setCanGiveFriend(true); | |||
base.setUseAllLocations(true); | |||
base.setCenterTitle("顶部居中按钮"); | |||
base.setCenterSubTitle("按钮下方的wording"); | |||
base.setCenterUrl("www.qq.com"); | |||
base.setCustomUrl("http://www.qq.com"); | |||
base.setCustomUrlName("立即使用"); | |||
base.setCustomUrlSubTitle("副标题tip"); | |||
base.setPromotionUrlName("更多优惠"); | |||
base.setPromotionUrl("http://www.qq.com"); | |||
base.setLocationIdList("1234"); | |||
//团购券 | |||
WxMpCardCreateMessage grouponMessage = new WxMpCardCreateMessage(); | |||
GrouponCardCreateRequest grouponCardCreateRequest = new GrouponCardCreateRequest(); | |||
GrouponCard grouponCard = new GrouponCard(); | |||
grouponCard.setBaseInfo(base); | |||
grouponCard.setDealDetail("deal detail"); | |||
grouponCardCreateRequest.setGroupon(grouponCard); | |||
grouponMessage.setCardCreateRequest(grouponCardCreateRequest); | |||
System.out.println(this.wxService.getCardService().createCard(grouponMessage)); | |||
//现金券 | |||
WxMpCardCreateMessage cashMessage = new WxMpCardCreateMessage(); | |||
CashCardCreateRequest cashCardCreateRequest = new CashCardCreateRequest(); | |||
CashCard cashCard = new CashCard(); | |||
cashCard.setBaseInfo(base); | |||
cashCard.setLeastCost(1000); | |||
cashCard.setReduceCost(100); | |||
cashCardCreateRequest.setCash(cashCard); | |||
cashMessage.setCardCreateRequest(cashCardCreateRequest); | |||
System.out.println(this.wxService.getCardService().createCard(cashMessage)); | |||
//折扣券 | |||
WxMpCardCreateMessage discountMessage = new WxMpCardCreateMessage(); | |||
DiscountCardCreateRequest discountCardCreateRequest = new DiscountCardCreateRequest(); | |||
DiscountCard discountCard = new DiscountCard(); | |||
discountCard.setBaseInfo(base); | |||
discountCard.setDiscount(30); | |||
discountCardCreateRequest.setDiscount(discountCard); | |||
discountMessage.setCardCreateRequest(discountCardCreateRequest); | |||
System.out.println(this.wxService.getCardService().createCard(discountMessage)); | |||
//兑换券 | |||
WxMpCardCreateMessage giftMessage = new WxMpCardCreateMessage(); | |||
GiftCardCreateRequest giftCardCreateRequest = new GiftCardCreateRequest(); | |||
GiftCard giftCard = new GiftCard(); | |||
giftCard.setBaseInfo(base); | |||
giftCard.setGift("星巴克雪瑞纳咖啡大杯"); | |||
giftCardCreateRequest.setGift(giftCard); | |||
giftMessage.setCardCreateRequest(giftCardCreateRequest); | |||
System.out.println(this.wxService.getCardService().createCard(giftMessage)); | |||
//普通兑换券 | |||
WxMpCardCreateMessage generalMessage = new WxMpCardCreateMessage(); | |||
GeneralCardCreateRequest generalCardCreateRequest = new GeneralCardCreateRequest(); | |||
GeneralCard generalCard = new GeneralCard(); | |||
generalCard.setBaseInfo(base); | |||
generalCard.setDefaultDetail("音乐木盒"); | |||
generalCardCreateRequest.setGeneralCoupon(generalCard); | |||
generalMessage.setCardCreateRequest(generalCardCreateRequest); | |||
System.out.println(this.wxService.getCardService().createCard(generalMessage)); | |||
} | |||
} |
@@ -4,6 +4,7 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; | |||
import me.chanjar.weixin.common.error.WxErrorException; | |||
import me.chanjar.weixin.mp.api.WxMpService; | |||
import me.chanjar.weixin.mp.bean.result.WxMpOAuth2AccessToken; | |||
import me.chanjar.weixin.open.bean.WxOpenCreateResult; | |||
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; | |||
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; | |||
import me.chanjar.weixin.open.bean.result.WxOpenAuthorizerInfoResult; | |||
@@ -42,6 +43,8 @@ public interface WxOpenComponentService { | |||
String MINIAPP_JSCODE_2_SESSION = "https://api.weixin.qq.com/sns/component/jscode2session?appid=%s&js_code=%s&grant_type=authorization_code&component_appid=%s"; | |||
String CREATE_OPEN_URL= "https://api.weixin.qq.com/cgi-bin/open/create"; | |||
WxMpService getWxMpServiceByAppid(String appid); | |||
/** | |||
@@ -168,4 +171,15 @@ public interface WxOpenComponentService { | |||
* @see #getTemplateList | |||
*/ | |||
void deleteTemplate(long templateId) throws WxErrorException; | |||
/** | |||
* https://open.weixin.qq.com/cgi-bin/showdocument?action=dir_list&t=resource/res_list&verify=1&id=open1498704199_1bcax&token=6df5e3650041eff2cd3ec3662425ad8d7beec8d9&lang=zh_CN | |||
* 创建 开放平台帐号并绑定公众号/小程序 | |||
* | |||
* https://api.weixin.qq.com/cgi-bin/open/create | |||
* | |||
* @param appId 公众号/小程序的appId | |||
* @return | |||
*/ | |||
WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException; | |||
} |
@@ -17,6 +17,7 @@ import me.chanjar.weixin.open.api.WxOpenMaService; | |||
import me.chanjar.weixin.open.api.WxOpenService; | |||
import me.chanjar.weixin.open.bean.WxOpenAuthorizerAccessToken; | |||
import me.chanjar.weixin.open.bean.WxOpenComponentAccessToken; | |||
import me.chanjar.weixin.open.bean.WxOpenCreateResult; | |||
import me.chanjar.weixin.open.bean.WxOpenMaCodeTemplate; | |||
import me.chanjar.weixin.open.bean.auth.WxOpenAuthorizationInfo; | |||
import me.chanjar.weixin.open.bean.message.WxOpenXmlMessage; | |||
@@ -387,4 +388,14 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService { | |||
param.addProperty("template_id", templateId); | |||
post(DELETE_TEMPLATE_URL, param.toString(), "access_token"); | |||
} | |||
@Override | |||
public WxOpenCreateResult createOpenAccount(String appId) throws WxErrorException { | |||
JsonObject param = new JsonObject(); | |||
param.addProperty("appid", appId); | |||
String json = post(CREATE_OPEN_URL, param.toString(), "access_token"); | |||
return WxOpenCreateResult.fromJson(json); | |||
} | |||
} |
@@ -0,0 +1,36 @@ | |||
package me.chanjar.weixin.open.bean; | |||
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder; | |||
import com.google.gson.annotations.SerializedName; | |||
import lombok.Data; | |||
import lombok.EqualsAndHashCode; | |||
import me.chanjar.weixin.common.util.json.WxGsonBuilder; | |||
import java.io.Serializable; | |||
/** | |||
* <pre> | |||
* code换取session_key接口的响应 | |||
* 文档地址:https://mp.weixin.qq.com/debug/wxadoc/dev/api/api-login.html#wxloginobject | |||
* 微信返回报文:{"session_key":"nzoqhc3OnwHzeTxJs+inbQ==","openid":"oVBkZ0aYgDMDIywRdgPW8-joxXc4"} | |||
* </pre> | |||
* @author <a href="https://github.com/binarywang">Binary Wang</a> | |||
*/ | |||
@Data | |||
@EqualsAndHashCode(callSuper = false) | |||
public class WxOpenCreateResult implements Serializable { | |||
@SerializedName("open_appid") | |||
private String openAppid; | |||
@SerializedName("errcode") | |||
private String errcode; | |||
@SerializedName("errmsg") | |||
private String errmsg; | |||
public static WxOpenCreateResult fromJson(String json) { | |||
return WxGsonBuilder.create().fromJson(json, WxOpenCreateResult.class); | |||
} | |||
} |