mirror of
https://gitee.com/binary/weixin-java-tools.git
synced 2025-04-05 17:38:05 +08:00
parent
eec3f78ec6
commit
c60fda48d2
@ -0,0 +1,123 @@
|
||||
package cn.binarywang.wx.miniapp.api;
|
||||
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 直播间商品相关操作接口
|
||||
* 文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/liveplayer/commodity-api.html
|
||||
* Created by lipengjun on 2020/6/29.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
|
||||
*/
|
||||
public interface WxMaLiveGoodsService {
|
||||
String ADD_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/add";
|
||||
String RESET_AUDIT_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/resetaudit";
|
||||
String AUDIT_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/audit";
|
||||
String DELETE_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/delete";
|
||||
String UPDATE_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/update";
|
||||
String GET_GOODS_WARE_HOUSE = "https://api.weixin.qq.com/wxa/business/getgoodswarehouse";
|
||||
String GET_APPROVED_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/goods/getapproved";
|
||||
|
||||
/**
|
||||
* 商品添加并提审
|
||||
* <pre>
|
||||
* 调用此接口上传并提审需要直播的商品信息,审核通过后商品录入【小程序直播】商品库
|
||||
* 注意:开发者必须保存【商品ID】与【审核单ID】,如果丢失,则无法调用其他相关接口
|
||||
* 调用额度:500次/一天
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/add?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
* @param goods 商品
|
||||
* @return 返回auditId、goodsId
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 撤回审核
|
||||
* <pre>
|
||||
* 调用此接口,可撤回直播商品的提审申请,消耗的提审次数不返还
|
||||
* 调用额度:500次/一天
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/resetaudit?access_token=ACCESS_TOKEN
|
||||
* <pre>
|
||||
* @param auditId 审核单ID
|
||||
* @param goodsId 商品ID
|
||||
* @return 撤回审核是否成功
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
boolean resetAudit(Integer auditId, Integer goodsId) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 重新提交审核
|
||||
* <pre>
|
||||
* 调用此接口,可撤回直播商品的提审申请,消耗的提审次数不返还
|
||||
* 调用额度:500次/一天(与接口'商品添加并提审'共用500次限制)
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/audit?access_token=ACCESS_TOKEN
|
||||
* <pre>
|
||||
* @param goodsId 商品ID
|
||||
* @return 审核单ID
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
String auditGoods(Integer goodsId) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 删除商品
|
||||
* <pre>
|
||||
* 调用此接口,可删除【小程序直播】商品库中的商品,删除后直播间上架的该商品也将被同步删除,不可恢复;
|
||||
* 调用额度:1000次/一天
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/delete?access_token=ACCESS_TOKEN
|
||||
* <pre>
|
||||
* @param goodsId 商品ID
|
||||
* @return 删除商品是否成功
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
boolean deleteGoods(Integer goodsId) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 更新商品
|
||||
* <pre>
|
||||
* 调用此接口可以更新商品信息,审核通过的商品仅允许更新价格类型与价格,审核中的商品不允许更新,未审核的商品允许更新所有字段, 只传入需要更新的字段。
|
||||
* 调用额度:1000次/一天
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/goods/update?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
* @param goods 商品
|
||||
* @return 更新商品是否成功
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
boolean updateGoods(WxMaLiveInfo.Goods goods) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 获取商品状态
|
||||
* <pre>
|
||||
* 调用此接口可获取商品的信息与审核状态
|
||||
* 调用额度:1000次/一天
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxa/business/getgoodswarehouse?access_token=ACCESS_TOKEN
|
||||
* <pre>
|
||||
* @param goodsIds 商品ID集
|
||||
* @return 商品状态信息
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxMaLiveResult getGoodsWareHouse(List<Integer> goodsIds) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 获取商品列表
|
||||
* <pre>
|
||||
* 调用此接口可获取商品列表
|
||||
* 调用额度:10000次/一天
|
||||
* http请求方式:GET https://api.weixin.qq.com/wxaapi/broadcast/goods/getapproved?access_token=ACCESS_TOKEN
|
||||
* <pre>
|
||||
* @param offset 分页条数起点
|
||||
* @param limit 分页大小,默认30,不超过100
|
||||
* @param status 商品状态,0:未审核。1:审核中,2:审核通过,3:审核驳回
|
||||
* @return 商品列表
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxMaLiveResult getApprovedGoods(Integer offset, Integer limit, Integer status) throws WxErrorException;
|
||||
}
|
@ -1,6 +1,7 @@
|
||||
package cn.binarywang.wx.miniapp.api;
|
||||
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaGetLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
|
||||
import java.util.List;
|
||||
@ -15,6 +16,22 @@ import java.util.List;
|
||||
*/
|
||||
public interface WxMaLiveService {
|
||||
String GET_LIVE_INFO = "https://api.weixin.qq.com/wxa/business/getliveinfo";
|
||||
String CREATE_ROOM = "https://api.weixin.qq.com/wxaapi/broadcast/room/create";
|
||||
String ADD_GOODS = "https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods";
|
||||
|
||||
/**
|
||||
* 创建直播间
|
||||
* <pre>
|
||||
* 调用此接口创建直播间,创建成功后将在直播间列表展示,调用额度:10000次/一天
|
||||
* 文档地址:https://developers.weixin.qq.com/miniprogram/dev/framework/liveplayer/studio-api.html#1
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/room/create?access_token=ACCESS_TOKEN
|
||||
* </pre>
|
||||
*
|
||||
* @param roomInfo 直播间信息
|
||||
* @return .
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 获取直播房间列表.(分页)
|
||||
@ -24,39 +41,54 @@ public interface WxMaLiveService {
|
||||
* @return .
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
WxMaGetLiveInfo getLiveInfo(Integer start, Integer limit) throws WxErrorException;
|
||||
WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 获取所有直播间信息(没有分页直接获取全部)
|
||||
*
|
||||
* @return
|
||||
* @throws WxErrorException
|
||||
*/
|
||||
List<WxMaGetLiveInfo.RoomInfo> getLiveinfos() throws WxErrorException;
|
||||
List<WxMaLiveResult.RoomInfo> getLiveinfos() throws WxErrorException;
|
||||
|
||||
/**
|
||||
*
|
||||
* 获取直播房间回放数据信息.
|
||||
*
|
||||
* @param action 获取回放
|
||||
* @param action 获取回放
|
||||
* @param room_id 直播间 id
|
||||
* @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取
|
||||
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
|
||||
* @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取
|
||||
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
|
||||
* @return
|
||||
* @throws WxErrorException
|
||||
*/
|
||||
WxMaGetLiveInfo getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException;
|
||||
WxMaLiveResult getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException;
|
||||
|
||||
/**
|
||||
*
|
||||
* 获取直播房间回放数据信息.
|
||||
* <p>
|
||||
* 获取回放 (默认:get_replay)
|
||||
*
|
||||
* 获取回放 (默认:get_replay)
|
||||
* @param room_id 直播间 id
|
||||
* @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取
|
||||
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
|
||||
* @param start 起始拉取视频,start = 0 表示从第 1 个视频片段开始拉取
|
||||
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
|
||||
* @return
|
||||
* @throws WxErrorException
|
||||
*/
|
||||
WxMaGetLiveInfo getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException;
|
||||
WxMaLiveResult getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException;
|
||||
|
||||
/**
|
||||
* 直播间导入商品
|
||||
* <p>
|
||||
* 调用接口往指定直播间导入已入库的商品
|
||||
* 调用频率
|
||||
* 调用额度:10000次/一天
|
||||
* <p>
|
||||
* http请求方式:POST https://api.weixin.qq.com/wxaapi/broadcast/room/addgoods?access_token=ACCESS_TOKEN
|
||||
* <pre>
|
||||
* @param roomId 房间ID
|
||||
* @param goodsIds 数组列表,可传入多个,里面填写 商品 ID
|
||||
* @return 导入商品是否成功
|
||||
* @throws WxErrorException .
|
||||
*/
|
||||
boolean addGoodsToRoom(Integer roomId, List<Integer> goodsIds) throws WxErrorException;
|
||||
}
|
||||
|
@ -0,0 +1,46 @@
|
||||
package cn.binarywang.wx.miniapp.api;
|
||||
|
||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* 素材管理的相关接口
|
||||
* 文档地址:https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html
|
||||
* Created by lipengjun on 2020/6/29.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
|
||||
*/
|
||||
public interface WxMaMaterialService {
|
||||
String MEDIA_UPLOAD_URL = "https://api.weixin.qq.com/cgi-bin/media/upload?type=%s";
|
||||
/**
|
||||
* <pre>
|
||||
* 新增临时素材
|
||||
* 小程序获取临时素材,用于直播间商品
|
||||
* 素材管理接口对所有认证的订阅号和服务号开放。通过本接口,小程序可以新增临时素材(即上传临时多媒体文件),返回的mediaId用于直播间商品使用。
|
||||
* 请注意:
|
||||
* 1、对于临时素材,每个素材(media_id)会在开发者上传或粉丝发送到微信服务器3天后自动删除(所以用户发送给开发者的素材,若开发者需要,应尽快下载到本地),以节省服务器资源。
|
||||
* 2、media_id是可复用的。
|
||||
* 3、素材的格式大小等要求与公众平台官网一致。具体是,图片大小不超过2M,支持png/jpeg/jpg/gif格式,语音大小不超过5M,长度不超过60秒,支持mp3/amr格式
|
||||
* 4、需使用https调用本接口。
|
||||
* 本接口即为原“上传多媒体文件”接口。
|
||||
* 注意事项:
|
||||
* 上传的临时多媒体文件有格式和大小限制,如下:
|
||||
* 图片(image): 2M,支持PNG\JPEG\JPG\GIF格式
|
||||
* 语音(voice):2M,播放长度不超过60s,支持AMR\MP3格式
|
||||
* 视频(video):10MB,支持MP4格式
|
||||
* 缩略图(thumb):64KB,支持JPG格式
|
||||
* 媒体文件在后台保存时间为3天,即3天后media_id失效。
|
||||
* 详情请见: <a href="http://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1444738726&token=&lang=zh_CN">新增临时素材</a>
|
||||
* 接口url格式:https://api.weixin.qq.com/cgi-bin/media/upload?access_token=ACCESS_TOKEN&type=TYPE
|
||||
* </pre>
|
||||
*
|
||||
* @param mediaType 媒体类型, 请看{@link me.chanjar.weixin.common.api.WxConsts}
|
||||
* @param file 文件对象
|
||||
* @throws WxErrorException
|
||||
*/
|
||||
WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException;
|
||||
}
|
@ -280,4 +280,18 @@ public interface WxMaService extends WxService {
|
||||
* @return .
|
||||
*/
|
||||
WxMaLiveService getLiveService();
|
||||
|
||||
/**
|
||||
* 获取直播间商品服务对象
|
||||
*
|
||||
* @return .
|
||||
*/
|
||||
WxMaLiveGoodsService getLiveGoodsService();
|
||||
|
||||
/**
|
||||
* 获取小程序素材管理服务对象
|
||||
*
|
||||
* @return .
|
||||
*/
|
||||
WxMaMaterialService getMaterialService();
|
||||
}
|
||||
|
@ -56,6 +56,8 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
|
||||
private final WxMaSubscribeService subscribeService = new WxMaSubscribeServiceImpl(this);
|
||||
private final WxMaCloudService cloudService = new WxMaCloudServiceImpl(this);
|
||||
private final WxMaLiveService liveService = new WxMaLiveServiceImpl(this);
|
||||
private final WxMaLiveGoodsService liveGoodsService = new WxMaLiveGoodsServiceImpl(this);
|
||||
private final WxMaMaterialService maMaterialService = new WxMaMaterialServiceImpl(this);
|
||||
|
||||
private int retrySleepMillis = 1000;
|
||||
private int maxRetryTimes = 5;
|
||||
@ -394,4 +396,14 @@ public abstract class BaseWxMaServiceImpl<H, P> implements WxMaService, RequestH
|
||||
public WxMaLiveService getLiveService() {
|
||||
return this.liveService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaLiveGoodsService getLiveGoodsService() {
|
||||
return this.liveGoodsService;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaMaterialService getMaterialService() {
|
||||
return this.maMaterialService;
|
||||
}
|
||||
}
|
||||
|
@ -0,0 +1,132 @@
|
||||
package cn.binarywang.wx.miniapp.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaLiveGoodsService;
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
|
||||
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
|
||||
import com.google.common.base.Joiner;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.gson.JsonArray;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
import lombok.AllArgsConstructor;
|
||||
import me.chanjar.weixin.common.WxType;
|
||||
import me.chanjar.weixin.common.error.WxError;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* Created by lipengjun on 2020/6/29.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
|
||||
*/
|
||||
@AllArgsConstructor
|
||||
public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
|
||||
private WxMaService wxMaService;
|
||||
|
||||
@Override
|
||||
public WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("goodsInfo", goods);
|
||||
String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return WxMaLiveResult.fromJson(jsonObject.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean resetAudit(Integer auditId, Integer goodsId) throws WxErrorException {
|
||||
Map<String, Integer> map = new HashMap<>(4);
|
||||
map.put("auditId", auditId);
|
||||
map.put("goodsId", goodsId);
|
||||
String responseContent = this.wxMaService.post(RESET_AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String auditGoods(Integer goodsId) throws WxErrorException {
|
||||
Map<String, Integer> map = new HashMap<>(2);
|
||||
map.put("goodsId", goodsId);
|
||||
String responseContent = this.wxMaService.post(AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return jsonObject.get("auditId").getAsString();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean deleteGoods(Integer goodsId) throws WxErrorException {
|
||||
Map<String, Integer> map = new HashMap<>(2);
|
||||
map.put("goodsId", goodsId);
|
||||
String responseContent = this.wxMaService.post(DELETE_GOODS, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean updateGoods(WxMaLiveInfo.Goods goods) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("goodsInfo", goods);
|
||||
String responseContent = this.wxMaService.post(UPDATE_GOODS, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaLiveResult getGoodsWareHouse(List<Integer> goodsIds) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("goods_ids", goodsIds);
|
||||
String responseContent = this.wxMaService.post(GET_GOODS_WARE_HOUSE, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return WxMaLiveResult.fromJson(jsonObject.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaLiveResult getApprovedGoods(Integer offset, Integer limit, Integer status) throws WxErrorException {
|
||||
ImmutableMap<String, ? extends Serializable> params = ImmutableMap.of("status", status, "offset", offset, "limit", limit);
|
||||
String responseContent = wxMaService.get(GET_APPROVED_GOODS, Joiner.on("&").withKeyValueSeparator("=").join(params));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
JsonArray goodsArr = jsonObject.getAsJsonArray("goods");
|
||||
if (goodsArr.size() > 0) {
|
||||
for (int i = 0; i < goodsArr.size(); i++) {
|
||||
// 接口返回key是驼峰
|
||||
JsonObject goods = (JsonObject) goodsArr.get(i);
|
||||
goods.addProperty("goods_id", goods.get("goodsId").getAsInt());
|
||||
goods.addProperty("cover_img_url", goods.get("coverImgUrl").getAsString());
|
||||
goods.addProperty("price_type", goods.get("priceType").getAsInt());
|
||||
goods.addProperty("third_party_tag", goods.get("thirdPartyTag").getAsInt());
|
||||
goods.addProperty("audit_status", status);
|
||||
}
|
||||
}
|
||||
return WxMaLiveResult.fromJson(jsonObject.toString());
|
||||
}
|
||||
|
||||
}
|
@ -2,7 +2,8 @@ package cn.binarywang.wx.miniapp.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaLiveService;
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaGetLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
|
||||
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.gson.JsonParser;
|
||||
@ -26,21 +27,31 @@ import java.util.Map;
|
||||
@AllArgsConstructor
|
||||
public class WxMaLiveServiceImpl implements WxMaLiveService {
|
||||
private static final JsonParser JSON_PARSER = new JsonParser();
|
||||
private WxMaService service;
|
||||
private WxMaService wxMaService;
|
||||
|
||||
@Override
|
||||
public WxMaGetLiveInfo getLiveInfo(Integer start, Integer limit) throws WxErrorException {
|
||||
JsonObject jsonObject = getJsonObject(start, limit, null);
|
||||
return WxMaGetLiveInfo.fromJson(jsonObject.toString());
|
||||
public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException {
|
||||
String responseContent = this.wxMaService.post(CREATE_ROOM, WxMaGsonBuilder.create().toJson(roomInfo));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return jsonObject.get("roomId").getAsInt();
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxMaGetLiveInfo.RoomInfo> getLiveinfos() throws WxErrorException {
|
||||
List<WxMaGetLiveInfo.RoomInfo> results = new ArrayList<>();
|
||||
public WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException {
|
||||
JsonObject jsonObject = getJsonObject(start, limit, null);
|
||||
return WxMaLiveResult.fromJson(jsonObject.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public List<WxMaLiveResult.RoomInfo> getLiveinfos() throws WxErrorException {
|
||||
List<WxMaLiveResult.RoomInfo> results = new ArrayList<>();
|
||||
Integer start = 0;
|
||||
Integer limit = 80;
|
||||
Integer tatal = 0;
|
||||
WxMaGetLiveInfo liveInfo = null;
|
||||
WxMaLiveResult liveInfo = null;
|
||||
do {
|
||||
if (tatal != 0 && tatal <= start) {
|
||||
break;
|
||||
@ -62,19 +73,32 @@ public class WxMaLiveServiceImpl implements WxMaLiveService {
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaGetLiveInfo getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException {
|
||||
public WxMaLiveResult getLiveReplay(String action, Integer room_id, Integer start, Integer limit) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap(4);
|
||||
map.put("action", action);
|
||||
map.put("room_id", room_id);
|
||||
JsonObject jsonObject = getJsonObject(start, limit, map);
|
||||
return WxMaGetLiveInfo.fromJson(jsonObject.toString());
|
||||
return WxMaLiveResult.fromJson(jsonObject.toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
public WxMaGetLiveInfo getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException {
|
||||
public WxMaLiveResult getLiveReplay(Integer room_id, Integer start, Integer limit) throws WxErrorException {
|
||||
return getLiveReplay("get_replay", room_id, start, limit);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean addGoodsToRoom(Integer roomId, List<Integer> goodsIds) throws WxErrorException {
|
||||
Map<String, Object> map = new HashMap<>(2);
|
||||
map.put("roomId", roomId);
|
||||
map.put("ids", goodsIds);
|
||||
String responseContent = this.wxMaService.post(ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* 包装一下
|
||||
*
|
||||
@ -90,7 +114,7 @@ public class WxMaLiveServiceImpl implements WxMaLiveService {
|
||||
}
|
||||
map.put("start", start);
|
||||
map.put("limit", limit);
|
||||
String responseContent = service.post(GET_LIVE_INFO, WxMaGsonBuilder.create().toJson(map));
|
||||
String responseContent = wxMaService.post(GET_LIVE_INFO, WxMaGsonBuilder.create().toJson(map));
|
||||
JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
|
||||
if (jsonObject.get("errcode").getAsInt() != 0) {
|
||||
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
|
||||
|
@ -0,0 +1,28 @@
|
||||
package cn.binarywang.wx.miniapp.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaMaterialService;
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
import me.chanjar.weixin.common.util.http.MediaUploadRequestExecutor;
|
||||
|
||||
import java.io.File;
|
||||
|
||||
/**
|
||||
* <pre>
|
||||
* Created by lipengjun on 2020/6/29.
|
||||
* </pre>
|
||||
*
|
||||
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
|
||||
*/
|
||||
@RequiredArgsConstructor
|
||||
public class WxMaMaterialServiceImpl implements WxMaMaterialService {
|
||||
private final WxMaService wxMaService;
|
||||
|
||||
@Override
|
||||
public WxMediaUploadResult mediaUpload(String mediaType, File file) throws WxErrorException {
|
||||
String url = String.format(MEDIA_UPLOAD_URL, mediaType);
|
||||
return this.wxMaService.execute(MediaUploadRequestExecutor.create(this.wxMaService.getRequestHttp()), url, file);
|
||||
}
|
||||
}
|
@ -0,0 +1,60 @@
|
||||
package cn.binarywang.wx.miniapp.bean;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 直播接口入参
|
||||
*
|
||||
* @author yjwang
|
||||
* @date 2020/4/5
|
||||
*/
|
||||
@Data
|
||||
public class WxMaLiveInfo implements Serializable {
|
||||
private static final long serialVersionUID = 7285263767524755887L;
|
||||
|
||||
/**
|
||||
* 直播列表
|
||||
*/
|
||||
@Data
|
||||
public static class RoomInfo implements Serializable {
|
||||
private static final long serialVersionUID = 7745775280267417154L;
|
||||
private String name;
|
||||
private Integer roomid;
|
||||
private String coverImg;
|
||||
private String shareImg;
|
||||
private Integer liveStatus;
|
||||
private Long startTime;
|
||||
private Long endTime;
|
||||
private String anchorName;
|
||||
private String anchorWechat;
|
||||
private String anchorImg;
|
||||
private Integer type;
|
||||
private Integer screenType;
|
||||
private Integer closeLike;
|
||||
private Integer closeGoods;
|
||||
private Integer closeComment;
|
||||
private List<Goods> goods;
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品列表
|
||||
*/
|
||||
@Data
|
||||
public static class Goods implements Serializable {
|
||||
private static final long serialVersionUID = 5769245932149287574L;
|
||||
private Integer goodsId;
|
||||
private String coverImgUrl;
|
||||
private String url;
|
||||
private Integer priceType;
|
||||
private String price;
|
||||
private String price2;
|
||||
private String name;
|
||||
/**
|
||||
* 1, 2:表示是为api添加商品,否则是在MP添加商品
|
||||
*/
|
||||
private String thirdPartyTag;
|
||||
}
|
||||
}
|
@ -8,30 +8,65 @@ import java.io.Serializable;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* 获取直播房间列表
|
||||
* <pre>
|
||||
* 直播间操作返回结果
|
||||
* Created by lipengjun on 2020/6/29.
|
||||
* </pre>
|
||||
*
|
||||
* @author yjwang
|
||||
* @date 2020/4/5
|
||||
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
|
||||
*/
|
||||
@Data
|
||||
public class WxMaGetLiveInfo implements Serializable {
|
||||
private static final long serialVersionUID = 7285263767524755887L;
|
||||
public class WxMaLiveResult implements Serializable {
|
||||
private static final long serialVersionUID = 1L;
|
||||
private Integer errcode;
|
||||
private String errmsg;
|
||||
private Integer total;
|
||||
private Integer auditId;
|
||||
private Integer goodsId;
|
||||
private List<Goods> goods;
|
||||
|
||||
/**
|
||||
* 直播间列表
|
||||
*/
|
||||
@SerializedName("room_info")
|
||||
private List<RoomInfo> roomInfos;
|
||||
|
||||
/**
|
||||
* 获取回放源视频列表
|
||||
*/
|
||||
@SerializedName("live_replay")
|
||||
private List<LiveReplay> liveReplay;
|
||||
|
||||
public static WxMaGetLiveInfo fromJson(String json) {
|
||||
return WxMaGsonBuilder.create().fromJson(json, WxMaGetLiveInfo.class);
|
||||
public static WxMaLiveResult fromJson(String json) {
|
||||
return WxMaGsonBuilder.create().fromJson(json, WxMaLiveResult.class);
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品列表
|
||||
*/
|
||||
@Data
|
||||
public static class Goods implements Serializable {
|
||||
private static final long serialVersionUID = 5769245932149287574L;
|
||||
@SerializedName("goods_id")
|
||||
private Integer goodsId;
|
||||
@SerializedName("cover_img_url")
|
||||
private String coverImgUrl;
|
||||
private String name;
|
||||
private String url;
|
||||
@SerializedName("price_type")
|
||||
private Integer priceType;
|
||||
/**
|
||||
* 0:未审核,1:审核中,2:审核通过,3审核失败
|
||||
*/
|
||||
@SerializedName("audit_status")
|
||||
private Integer auditStatus;
|
||||
private String price;
|
||||
private String price2;
|
||||
/**
|
||||
* 1, 2:表示是为api添加商品,否则是在MP添加商品
|
||||
*/
|
||||
@SerializedName("third_party_tag")
|
||||
private String thirdPartyTag;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -54,22 +89,20 @@ public class WxMaGetLiveInfo implements Serializable {
|
||||
private Long endTime;
|
||||
@SerializedName("anchor_name")
|
||||
private String anchorName;
|
||||
@SerializedName("anchor_wechat")
|
||||
private String anchorWechat;
|
||||
@SerializedName("anchor_img")
|
||||
private String anchorImg;
|
||||
private List<Goods> goods;
|
||||
}
|
||||
|
||||
/**
|
||||
* 商品列表
|
||||
*/
|
||||
@Data
|
||||
public static class Goods implements Serializable {
|
||||
private static final long serialVersionUID = 5769245932149287574L;
|
||||
@SerializedName("cover_img")
|
||||
private String coverImg;
|
||||
private String url;
|
||||
private String price;
|
||||
private String name;
|
||||
private Integer type;
|
||||
@SerializedName("screen_type")
|
||||
private Integer screenType;
|
||||
@SerializedName("close_like")
|
||||
private Integer closeLike;
|
||||
@SerializedName("closeGoods")
|
||||
private Integer closeGoods;
|
||||
@SerializedName("close_comment")
|
||||
private Integer closeComment;
|
||||
private List<WxMaLiveInfo.Goods> goods;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -85,6 +118,4 @@ public class WxMaGetLiveInfo implements Serializable {
|
||||
@SerializedName("media_url")
|
||||
private String mediaUrl;
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -0,0 +1,92 @@
|
||||
package cn.binarywang.wx.miniapp.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
|
||||
import cn.binarywang.wx.miniapp.test.ApiTestModule;
|
||||
import com.google.inject.Inject;
|
||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||
import org.testng.annotations.Guice;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
|
||||
/**
|
||||
* 测试直播商品管理相关的接口
|
||||
*
|
||||
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
|
||||
*/
|
||||
@Test
|
||||
@Guice(modules = ApiTestModule.class)
|
||||
public class WxMaLiveGoodsServiceImplTest {
|
||||
|
||||
@Inject
|
||||
private WxMaService wxService;
|
||||
|
||||
@Test
|
||||
public void addGoods() throws Exception {
|
||||
//上传临时素材
|
||||
WxMediaUploadResult mediaUpload = this.wxService.getMaterialService().mediaUpload("image", new File("E:\\1.png"));
|
||||
|
||||
WxMaLiveInfo.Goods goods = new WxMaLiveInfo.Goods();
|
||||
goods.setCoverImgUrl(mediaUpload.getMediaId());
|
||||
goods.setName("宫廷奢华真丝四件套");
|
||||
goods.setPrice("1599");
|
||||
goods.setPrice2("0");
|
||||
goods.setPriceType(1);
|
||||
goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad");
|
||||
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().addGoods(goods);
|
||||
assertNotNull(liveResult);
|
||||
System.out.println(liveResult.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void resetAudit() throws Exception {
|
||||
boolean result = this.wxService.getLiveGoodsService().resetAudit(715138516, 9);
|
||||
System.out.println(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void auditGoods() throws Exception {
|
||||
String result = this.wxService.getLiveGoodsService().auditGoods(9);
|
||||
System.out.println(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void deleteGoods() throws Exception {
|
||||
boolean result = this.wxService.getLiveGoodsService().deleteGoods(9);
|
||||
System.out.println(result);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void updateGoods() throws Exception {
|
||||
|
||||
WxMaLiveInfo.Goods goods = new WxMaLiveInfo.Goods();
|
||||
goods.setGoodsId(8);
|
||||
goods.setName("宫廷奢华真丝四件套");
|
||||
goods.setCoverImgUrl("http://mmbiz.qpic.cn/mmbiz_png/omYktZNGamuUQE0WPVfqdnLV61JDhluXOac7PiaoZeticFpcR7wvicC0aXUC2VXkl7r1gN0QSKosv2satn6oCFeiaQ/0");
|
||||
goods.setPrice("2299");
|
||||
goods.setPrice2("0");
|
||||
goods.setPriceType(1);
|
||||
goods.setUrl("pages/goods/goods?id=b7c4fbf95493bd294054fe4296d0d9ad");
|
||||
boolean maLiveInfo = this.wxService.getLiveGoodsService().updateGoods(goods);
|
||||
System.out.println(maLiveInfo);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getGoodsWareHouse() throws Exception {
|
||||
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().getGoodsWareHouse(Arrays.asList(1, 2));
|
||||
assertNotNull(liveResult);
|
||||
System.out.println(liveResult.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getApprovedGoods() throws Exception {
|
||||
WxMaLiveResult liveResult = this.wxService.getLiveGoodsService().getApprovedGoods(0, 4, 2);
|
||||
assertNotNull(liveResult);
|
||||
System.out.println(liveResult.toString());
|
||||
}
|
||||
}
|
@ -1,23 +1,20 @@
|
||||
package cn.binarywang.wx.miniapp.api.impl;
|
||||
|
||||
import cn.binarywang.wx.miniapp.api.WxMaService;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaGetLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaUserInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
|
||||
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
|
||||
import cn.binarywang.wx.miniapp.test.ApiTestModule;
|
||||
import cn.binarywang.wx.miniapp.test.TestConfig;
|
||||
import com.google.common.collect.ImmutableMap;
|
||||
import com.google.gson.JsonObject;
|
||||
import com.google.inject.Inject;
|
||||
import me.chanjar.weixin.common.error.WxErrorException;
|
||||
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
|
||||
import org.testng.annotations.Guice;
|
||||
import org.testng.annotations.Test;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.Arrays;
|
||||
import java.util.Calendar;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import static org.testng.Assert.assertNotNull;
|
||||
import static org.testng.Assert.assertTrue;
|
||||
|
||||
/**
|
||||
* 测试直播相关的接口
|
||||
@ -31,9 +28,34 @@ public class WxMaLiveServiceImplTest {
|
||||
@Inject
|
||||
private WxMaService wxService;
|
||||
|
||||
@Test
|
||||
public void createRoom() throws Exception {
|
||||
//上传临时素材
|
||||
WxMediaUploadResult mediaUpload = this.wxService.getMaterialService().mediaUpload("image", new File("E:\\1.png"));
|
||||
|
||||
WxMaLiveInfo.RoomInfo roomInfo = new WxMaLiveInfo.RoomInfo();
|
||||
roomInfo.setName("订阅通知直播间");
|
||||
roomInfo.setCoverImg(mediaUpload.getMediaId());
|
||||
Calendar c = Calendar.getInstance();
|
||||
c.set(2020, Calendar.SEPTEMBER, 10, 8, 0);
|
||||
roomInfo.setStartTime(c.getTimeInMillis() / 1000);
|
||||
c.set(2020, Calendar.SEPTEMBER, 10, 12, 0);
|
||||
roomInfo.setEndTime(c.getTimeInMillis() / 1000);
|
||||
roomInfo.setAnchorName("鹏军_专业小程序开发");
|
||||
roomInfo.setAnchorWechat("pengjun939961241");
|
||||
roomInfo.setShareImg(mediaUpload.getMediaId());
|
||||
roomInfo.setType(1);
|
||||
roomInfo.setScreenType(1);
|
||||
roomInfo.setCloseLike(0);
|
||||
roomInfo.setCloseGoods(0);
|
||||
roomInfo.setCloseComment(0);
|
||||
Integer roomId = this.wxService.getLiveService().createRoom(roomInfo);
|
||||
System.out.println(roomId);
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLiveInfo() throws Exception {
|
||||
WxMaGetLiveInfo list = this.wxService.getLiveService().getLiveInfo(0,10);
|
||||
WxMaLiveResult list = this.wxService.getLiveService().getLiveInfo(0, 10);
|
||||
assertNotNull(list);
|
||||
System.out.println(list.toString());
|
||||
}
|
||||
@ -41,15 +63,21 @@ public class WxMaLiveServiceImplTest {
|
||||
@Test
|
||||
public void getLiveReplay() throws Exception {
|
||||
// [12, 11, 10, 9, 8, 7, 6, 5, 3, 2]
|
||||
WxMaGetLiveInfo list = this.wxService.getLiveService().getLiveReplay(11,0,10);
|
||||
WxMaLiveResult list = this.wxService.getLiveService().getLiveReplay(3, 0, 10);
|
||||
assertNotNull(list);
|
||||
System.out.println(list.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void getLiveinfos() throws Exception {
|
||||
List<WxMaGetLiveInfo.RoomInfo> list = this.wxService.getLiveService().getLiveinfos();
|
||||
List<WxMaLiveResult.RoomInfo> list = this.wxService.getLiveService().getLiveinfos();
|
||||
assertNotNull(list);
|
||||
System.out.println(list.toString());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void addGoodsToRoom() throws Exception {
|
||||
boolean result = this.wxService.getLiveService().addGoodsToRoom(5, Arrays.asList(8, 7, 5, 4, 10));
|
||||
System.out.println(result);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user