升级wxjava版本为3.9.0

This commit is contained in:
xuwenbo
2020-08-27 17:01:00 +08:00
parent 966e153f88
commit a18ec80f46
12 changed files with 21 additions and 807 deletions

View File

@ -180,8 +180,8 @@ public class AuthService {
public YxUser wechatLogin(String code,String spread){ public YxUser wechatLogin(String code,String spread){
try { try {
WxMpService wxService = WxMpConfiguration.getWxMpService(); WxMpService wxService = WxMpConfiguration.getWxMpService();
WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxService.oauth2getAccessToken(code); WxMpOAuth2AccessToken wxMpOAuth2AccessToken = wxService.getOAuth2Service().getAccessToken(code);
WxMpUser wxMpUser = wxService.oauth2getUserInfo(wxMpOAuth2AccessToken, null); WxMpUser wxMpUser = wxService.getOAuth2Service().getUserInfo(wxMpOAuth2AccessToken, null);
String openid = wxMpUser.getOpenId(); String openid = wxMpUser.getOpenId();
//如果开启了UnionId //如果开启了UnionId

View File

@ -1,8 +1,8 @@
package co.yixiang.test; package co.yixiang.test;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo; import cn.binarywang.wx.miniapp.api.WxMaLiveService;
import co.yixiang.modules.wechat.service.WxMaLiveService; import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest; import org.springframework.boot.test.context.SpringBootTest;

View File

@ -12,7 +12,7 @@
<artifactId>yshop-common</artifactId> <artifactId>yshop-common</artifactId>
<name>公共模块</name> <name>公共模块</name>
<properties> <properties>
<weixin-java.version>3.8.0</weixin-java.version> <weixin-java.version>3.9.0</weixin-java.version>
</properties> </properties>
<dependencies> <dependencies>
<dependency> <dependency>

View File

@ -1,124 +0,0 @@
package co.yixiang.modules.wechat.service;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo;
import co.yixiang.modules.wechat.service.dto.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;
}

View File

@ -1,94 +0,0 @@
package co.yixiang.modules.wechat.service;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo;
import co.yixiang.modules.wechat.service.dto.WxMaLiveResult;
import me.chanjar.weixin.common.error.WxErrorException;
import java.util.List;
/**
* <pre>
* 直播相关操作接口.
* Created by yjwang on 2020/4/5.
* </pre>
*
* @author <a href="https://github.com/yjwang3300300">yjwang</a>
*/
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;
/**
* 获取直播房间列表.(分页)
*
* @param start 起始拉取房间start = 0 表示从第 1 个房间开始拉取
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
* @return .
* @throws WxErrorException .
*/
WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException;
/**
* 获取所有直播间信息(没有分页直接获取全部)
*
* @return .
* @throws WxErrorException .
*/
List<WxMaLiveResult.RoomInfo> getLiveInfos() throws WxErrorException;
/**
* 获取直播房间回放数据信息.
*
* @param action 获取回放
* @param roomId 直播间 id
* @param start 起始拉取视频start = 0 表示从第 1 个视频片段开始拉取
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
* @return .
* @throws WxErrorException .
*/
WxMaLiveResult getLiveReplay(String action, Integer roomId, Integer start, Integer limit) throws WxErrorException;
/**
* 获取直播房间回放数据信息.
* <p>
* 获取回放 默认get_replay
*
* @param roomId 直播间 id
* @param start 起始拉取视频start = 0 表示从第 1 个视频片段开始拉取
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
* @return .
* @throws WxErrorException .
*/
WxMaLiveResult getLiveReplay(Integer roomId, 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;
}

View File

@ -1,131 +0,0 @@
package co.yixiang.modules.wechat.service.dto;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* 直播接口入参
*/
@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;
/**
* 直播间名字最短3个汉字最长17个汉字1个汉字相当于2个字符
*/
private String name;
/**
* 直播房间id
*/
private Integer roomid;
/**
* 背景图填入mediaIDmediaID获取后三天内有效图片mediaID的获取
* 请参考以下文档: https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html
* 直播间背景图图片规则建议像素1080*1920大小不超过2M
*/
private String coverImg;
/**
* 分享图填入mediaIDmediaID获取后三天内有效图片mediaID的获取请参考以下文档 https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html直播间分享图图片规则建议像素800*640大小不超过1M
*/
private String shareImg;
/**
* 101直播中102未开始103已结束104禁播105暂停106异常107已过期
*/
private Integer liveStatus;
/**
* 直播计划开始时间开播时间需要在当前时间的10分钟后 并且 开始时间不能在 6 个月后)
*/
private Long startTime;
/**
* 直播计划结束时间开播时间和结束时间间隔不得短于30分钟不得超过24小时
*/
private Long endTime;
/**
* 主播昵称最短2个汉字最长15个汉字1个汉字相当于2个字符
*/
private String anchorName;
/**
* 主播微信号,如果未实名认证,需要先前往“小程序直播”小程序进行实名验证, 小程序二维码链接https://res.wx.qq.com/op_res/BbVNeczA1XudfjVqCVoKgfuWe7e3aUhokktRVOqf_F0IqS6kYR--atCpVNUUC3zr
*/
private String anchorWechat;
/**
* 主播头像
*/
private String anchorImg;
/**
* 直播间类型 【1: 推流0手机直播】
*/
private Integer type;
/**
* 横屏、竖屏 【1横屏0竖屏】横屏视频宽高比为16:9、4:3、1.85:1 竖屏视频宽高比为9:16、2:3
*/
private Integer screenType;
/**
* 是否关闭点赞 【0开启1关闭】若关闭直播开始后不允许开启
*/
private Integer closeLike;
/**
* 是否关闭货架 【0开启1关闭】若关闭直播开始后不允许开启
*/
private Integer closeGoods;
/**
* 是否关闭评论 【0开启1关闭】若关闭直播开始后不允许开启
*/
private Integer closeComment;
/**
*
*/
private List<Goods> goods;
}
/**
* 商品列表
*/
@Data
public static class Goods implements Serializable {
private static final long serialVersionUID = 5769245932149287574L;
/**
* 商品id
*/
private Integer goodsId;
/**
* 填入mediaIDmediaID获取后三天内有效图片mediaID的获取请参考以下文档 https://developers.weixin.qq.com/doc/offiaccount/Asset_Management/New_temporary_materials.html图片规则图片尺寸最大300像素*300像素
*/
private String coverImgUrl;
/**
* 商品详情页的小程序路径,路径参数存在 url 的,该参数的值需要进行 encode 处理再填入
*/
private String url;
/**
* 价格类型1一口价只需要传入priceprice2不传 2价格区间price字段为左边界price2字段为右边界price和price2必传 3显示折扣价price字段为原价price2字段为现价 price和price2必传
*/
private Integer priceType;
/**
* 数字,最多保留两位小数,单位元
*/
private String price;
/**
* 数字,最多保留两位小数,单位元
*/
private String price2;
/**
* 商品名称最长14个汉字1个汉字相当于2个字符
*/
private String name;
/**
* 1, 2表示是为api添加商品否则是在MP添加商品
*/
private String thirdPartyTag;
}
}

View File

@ -1,135 +0,0 @@
package co.yixiang.modules.wechat.service.dto;
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
import com.google.gson.annotations.SerializedName;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
* <pre>
* 直播间操作返回结果
* Created by lipengjun on 2020/6/29.
* </pre>
*
* @author <a href="https://github.com/lipengjun92">lipengjun (939961241@qq.com)</a>
*/
@Data
public class WxMaLiveResult implements Serializable {
private static final long serialVersionUID = 1L;
private Integer errcode;
private String errmsg;
private Integer total;
/**
* 审核单ID
*/
private Integer auditId;
/**
* 商品ID
*/
private Integer goodsId;
private List<Goods> goods;
/**
* 直播间列表
*/
@SerializedName("room_info")
private List<RoomInfo> roomInfos;
/**
* 获取回放源视频列表
*/
@SerializedName("live_replay")
private List<LiveReplay> liveReplay;
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;
/**
* 获取直播间列表返回的商品图片
*/
@SerializedName("cover_img")
private String coverImg;
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;
}
/**
* 直播列表
*/
@Data
public static class RoomInfo implements Serializable {
private static final long serialVersionUID = 7745775280267417154L;
private String name;
@SerializedName("roomid")
private Integer roomid;
@SerializedName("cover_img")
private String coverImg;
@SerializedName("share_img")
private String shareImg;
@SerializedName("live_status")
private Integer liveStatus;
@SerializedName("start_time")
private Long startTime;
@SerializedName("end_time")
private Long endTime;
@SerializedName("anchor_name")
private String anchorName;
@SerializedName("anchor_wechat")
private String anchorWechat;
@SerializedName("anchor_img")
private String anchorImg;
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<Goods> goods;
}
/**
* 回放数据列表
*/
@Data
public static class LiveReplay implements Serializable {
private static final long serialVersionUID = 7683927205627536320L;
@SerializedName("expire_time")
private String expireTime;
@SerializedName("create_time")
private String createTime;
@SerializedName("media_url")
private String mediaUrl;
}
}

View File

@ -1,160 +0,0 @@
package co.yixiang.modules.wechat.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import co.yixiang.modules.wechat.service.WxMaLiveGoodsService;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo;
import co.yixiang.modules.wechat.service.dto.WxMaLiveResult;
import co.yixiang.tools.config.WxMaConfiguration;
import co.yixiang.utils.GsonParser;
import com.google.common.base.Joiner;
import com.google.common.collect.ImmutableMap;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.result.WxMediaUploadResult;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.File;
import java.io.Serializable;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class WxMaLiveGoodsServiceImpl implements WxMaLiveGoodsService {
@Value("${file.path}")
private String uploadDirStr;
@Override
public WxMaLiveResult addGoods(WxMaLiveInfo.Goods goods) throws WxErrorException {
Map<String, Object> map = new HashMap<>(2);
map.put("goodsInfo", goods);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveGoodsService.ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveGoodsService.RESET_AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveGoodsService.AUDIT_GOODS, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveGoodsService.DELETE_GOODS, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveGoodsService.UPDATE_GOODS, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveGoodsService.GET_GOODS_WARE_HOUSE, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.get(WxMaLiveGoodsService.GET_APPROVED_GOODS, Joiner.on("&").withKeyValueSeparator("=").join(params));
JsonObject jsonObject = GsonParser.parse(responseContent);
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());
}
/**
* 上传临时素材
* @param wxMaService WxMaService
* @param picPath 图片路径
* @return WxMpMaterialUploadResult
* @throws WxErrorException
*/
private WxMediaUploadResult uploadPhotoToWx(WxMaService wxMaService, String picPath) throws WxErrorException {
String filename = (int) System.currentTimeMillis() + ".png";
String downloadPath = uploadDirStr + filename;
long size = HttpUtil.downloadFile(picPath, cn.hutool.core.io.FileUtil.file(downloadPath));
picPath = downloadPath;
File picFile = new File( picPath );
log.info( "picFile name : {}", picFile.getName() );
WxMediaUploadResult wxMediaUploadResult = wxMaService.getMediaService().uploadMedia( WxConsts.MediaFileType.IMAGE, picFile );
log.info( "wxMpMaterialUploadResult : {}", JSONUtil.toJsonStr( wxMediaUploadResult ) );
return wxMediaUploadResult;
}
}

View File

@ -1,137 +0,0 @@
package co.yixiang.modules.wechat.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.util.json.WxMaGsonBuilder;
import co.yixiang.modules.wechat.service.WxMaLiveService;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo;
import co.yixiang.modules.wechat.service.dto.WxMaLiveResult;
import co.yixiang.tools.config.WxMaConfiguration;
import co.yixiang.utils.GsonParser;
import com.google.gson.JsonObject;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <pre>
* Created by yjwang on 2020/4/5.
* </pre>
*
* @author <a href="https://github.com/yjwang3300300">yjwang</a>
*/
@Slf4j
@Service
public class WxMaLiveServiceImpl implements WxMaLiveService {
@Value("${file.path}")
private String uploadDirStr;
@Override
public Integer createRoom(WxMaLiveInfo.RoomInfo roomInfo) throws WxErrorException {
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveService.CREATE_ROOM, WxMaGsonBuilder.create().toJson(roomInfo));
JsonObject jsonObject = GsonParser.parse(responseContent);
if (jsonObject.get("errcode").getAsInt() != 0) {
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
}
return jsonObject.get("roomId").getAsInt();
}
/**
* 获取直播房间列表.(分页)
*
* @param start 起始拉取房间start = 0 表示从第 1 个房间开始拉取
* @param limit 每次拉取的个数上限,不要设置过大,建议 100 以内
* @return .
* @throws WxErrorException .
*/
@Override
public WxMaLiveResult getLiveInfo(Integer start, Integer limit) throws WxErrorException {
JsonObject jsonObject = getLiveInfo(start, limit, null);
return WxMaLiveResult.fromJson(jsonObject.toString());
}
/**
* 获取所有直播间信息(没有分页直接获取全部)
*
* @return .
* @throws WxErrorException .
*/
@Override
public List<WxMaLiveResult.RoomInfo> getLiveInfos() throws WxErrorException {
List<WxMaLiveResult.RoomInfo> results = new ArrayList<>();
int start = 0;
Integer limit = 80;
Integer total = 0;
WxMaLiveResult liveInfo;
do {
if (total != 0 && total <= start) {
break;
}
liveInfo = getLiveInfo(start, limit);
if (liveInfo == null) {
return null;
}
results.addAll(liveInfo.getRoomInfos());
total = liveInfo.getTotal();
start = results.size();
try {
Thread.sleep(100);
} catch (InterruptedException e) {
log.error("InterruptedException", e);
}
} while (results.size() <= total);
return results;
}
@Override
public WxMaLiveResult getLiveReplay(String action, Integer roomId, Integer start, Integer limit) throws WxErrorException {
Map<String, Object> map = new HashMap<>(4);
map.put("action", action);
map.put("room_id", roomId);
JsonObject jsonObject = getLiveInfo(start, limit, map);
return WxMaLiveResult.fromJson(jsonObject.toString());
}
@Override
public WxMaLiveResult getLiveReplay(Integer roomId, Integer start, Integer limit) throws WxErrorException {
return getLiveReplay("get_replay", roomId, 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);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveService.ADD_GOODS, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
if (jsonObject.get("errcode").getAsInt() != 0) {
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
}
return true;
}
private JsonObject getLiveInfo(Integer start, Integer limit, Map<String, Object> map) throws WxErrorException {
if (map == null) {
map = new HashMap(2);
}
map.put("start", start);
map.put("limit", limit);
WxMaService wxMaService = WxMaConfiguration.getWxMaService();
String responseContent = wxMaService.post(WxMaLiveService.GET_LIVE_INFO, WxMaGsonBuilder.create().toJson(map));
JsonObject jsonObject = GsonParser.parse(responseContent);
if (jsonObject.get("errcode").getAsInt() != 0) {
throw new WxErrorException(WxError.fromJson(responseContent, WxType.MiniApp));
}
return jsonObject;
}
}

View File

@ -9,6 +9,8 @@
package co.yixiang.modules.wechat.service.impl; package co.yixiang.modules.wechat.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
@ -18,10 +20,7 @@ import co.yixiang.dozer.service.IGenerator;
import co.yixiang.enums.LiveGoodsEnum; import co.yixiang.enums.LiveGoodsEnum;
import co.yixiang.exception.BadRequestException; import co.yixiang.exception.BadRequestException;
import co.yixiang.modules.wechat.domain.YxWechatLiveGoods; import co.yixiang.modules.wechat.domain.YxWechatLiveGoods;
import co.yixiang.modules.wechat.service.WxMaLiveGoodsService;
import co.yixiang.modules.wechat.service.YxWechatLiveGoodsService; import co.yixiang.modules.wechat.service.YxWechatLiveGoodsService;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo;
import co.yixiang.modules.wechat.service.dto.WxMaLiveResult;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsDto; import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsDto;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsQueryCriteria; import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsQueryCriteria;
import co.yixiang.modules.wechat.service.mapper.YxWechatLiveGoodsMapper; import co.yixiang.modules.wechat.service.mapper.YxWechatLiveGoodsMapper;
@ -59,10 +58,8 @@ public class YxWechatLiveGoodsServiceImpl extends BaseServiceImpl<YxWechatLiveGo
private final IGenerator generator; private final IGenerator generator;
@Value("${file.path}") @Value("${file.path}")
private String uploadDirStr; private String uploadDirStr;
private final WxMaLiveGoodsService wxMaLiveGoodsService; public YxWechatLiveGoodsServiceImpl(IGenerator generator) {
public YxWechatLiveGoodsServiceImpl(IGenerator generator, WxMaLiveGoodsService wxMaLiveGoodsService) {
this.generator = generator; this.generator = generator;
this.wxMaLiveGoodsService = wxMaLiveGoodsService;
} }
@ -74,7 +71,8 @@ public class YxWechatLiveGoodsServiceImpl extends BaseServiceImpl<YxWechatLiveGo
@Override @Override
public boolean synchroWxOlLive(List<Integer> goodsIds) { public boolean synchroWxOlLive(List<Integer> goodsIds) {
try { try {
WxMaLiveResult liveInfos = wxMaLiveGoodsService.getGoodsWareHouse(goodsIds); WxMaService wxMaService = WxMaConfiguration.getWxMaService();
WxMaLiveResult liveInfos = wxMaService.getLiveGoodsService().getGoodsWareHouse(goodsIds);
List<YxWechatLiveGoods> convert = generator.convert(liveInfos.getGoods(), YxWechatLiveGoods.class); List<YxWechatLiveGoods> convert = generator.convert(liveInfos.getGoods(), YxWechatLiveGoods.class);
this.saveOrUpdateBatch(convert); this.saveOrUpdateBatch(convert);
} catch (WxErrorException e) { } catch (WxErrorException e) {
@ -87,7 +85,8 @@ public class YxWechatLiveGoodsServiceImpl extends BaseServiceImpl<YxWechatLiveGo
public void removeGoods(Long id) { public void removeGoods(Long id) {
this.removeById(id); this.removeById(id);
try { try {
wxMaLiveGoodsService.deleteGoods(id.intValue()); WxMaService wxMaService = WxMaConfiguration.getWxMaService();
wxMaService.getLiveGoodsService().deleteGoods(id.intValue());
} catch (WxErrorException e) { } catch (WxErrorException e) {
e.printStackTrace(); e.printStackTrace();
} }
@ -113,7 +112,7 @@ public class YxWechatLiveGoodsServiceImpl extends BaseServiceImpl<YxWechatLiveGo
} }
} }
WxMaLiveInfo.Goods goods = generator.convert(resources, WxMaLiveInfo.Goods.class); WxMaLiveInfo.Goods goods = generator.convert(resources, WxMaLiveInfo.Goods.class);
boolean wxMaLiveResult = wxMaLiveGoodsService.updateGoods(goods); boolean wxMaLiveResult = wxMaService.getLiveGoodsService().updateGoods(goods);
this.saveOrUpdate(resources); this.saveOrUpdate(resources);
} catch (WxErrorException e) { } catch (WxErrorException e) {
throw new BadRequestException(e.toString()); throw new BadRequestException(e.toString());
@ -189,7 +188,7 @@ public class YxWechatLiveGoodsServiceImpl extends BaseServiceImpl<YxWechatLiveGo
try { try {
resources.setCoverImgUrl(uploadPhotoToWx(wxMaService,resources.getCoverImgeUrl()).getMediaId()); resources.setCoverImgUrl(uploadPhotoToWx(wxMaService,resources.getCoverImgeUrl()).getMediaId());
WxMaLiveInfo.Goods goods = generator.convert(resources, WxMaLiveInfo.Goods.class); WxMaLiveInfo.Goods goods = generator.convert(resources, WxMaLiveInfo.Goods.class);
WxMaLiveResult wxMaLiveResult = wxMaLiveGoodsService.addGoods(goods); WxMaLiveResult wxMaLiveResult = wxMaService.getLiveGoodsService().addGoods(goods);
resources.setGoodsId(Long.valueOf(wxMaLiveResult.getGoodsId())); resources.setGoodsId(Long.valueOf(wxMaLiveResult.getGoodsId()));
resources.setAuditId(Long.valueOf(wxMaLiveResult.getAuditId())); resources.setAuditId(Long.valueOf(wxMaLiveResult.getAuditId()));
this.save(resources); this.save(resources);

View File

@ -9,6 +9,8 @@
package co.yixiang.modules.wechat.service.impl; package co.yixiang.modules.wechat.service.impl;
import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.binarywang.wx.miniapp.bean.WxMaLiveInfo;
import cn.binarywang.wx.miniapp.bean.WxMaLiveResult;
import cn.hutool.http.HttpUtil; import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil; import cn.hutool.json.JSONUtil;
import co.yixiang.common.service.impl.BaseServiceImpl; import co.yixiang.common.service.impl.BaseServiceImpl;
@ -17,11 +19,8 @@ import co.yixiang.dozer.service.IGenerator;
import co.yixiang.exception.BadRequestException; import co.yixiang.exception.BadRequestException;
import co.yixiang.modules.wechat.domain.YxWechatLive; import co.yixiang.modules.wechat.domain.YxWechatLive;
import co.yixiang.modules.wechat.domain.YxWechatLiveGoods; import co.yixiang.modules.wechat.domain.YxWechatLiveGoods;
import co.yixiang.modules.wechat.service.WxMaLiveService;
import co.yixiang.modules.wechat.service.YxWechatLiveGoodsService; import co.yixiang.modules.wechat.service.YxWechatLiveGoodsService;
import co.yixiang.modules.wechat.service.YxWechatLiveService; import co.yixiang.modules.wechat.service.YxWechatLiveService;
import co.yixiang.modules.wechat.service.dto.WxMaLiveInfo;
import co.yixiang.modules.wechat.service.dto.WxMaLiveResult;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveDto; import co.yixiang.modules.wechat.service.dto.YxWechatLiveDto;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsDto; import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsDto;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveQueryCriteria; import co.yixiang.modules.wechat.service.dto.YxWechatLiveQueryCriteria;
@ -63,12 +62,10 @@ public class YxWechatLiveServiceImpl extends BaseServiceImpl<YxWechatLiveMapper,
private final IGenerator generator; private final IGenerator generator;
@Value("${file.path}") @Value("${file.path}")
private String uploadDirStr; private String uploadDirStr;
private final WxMaLiveService wxMaLiveService;
private final YxWechatLiveGoodsService wechatLiveGoodsService; private final YxWechatLiveGoodsService wechatLiveGoodsService;
public YxWechatLiveServiceImpl(IGenerator generator, WxMaLiveService wxMaLiveService, YxWechatLiveGoodsService wechatLiveGoodsService) { public YxWechatLiveServiceImpl(IGenerator generator, YxWechatLiveGoodsService wechatLiveGoodsService) {
this.generator = generator; this.generator = generator;
this.wxMaLiveService = wxMaLiveService;
this.wechatLiveGoodsService = wechatLiveGoodsService; this.wechatLiveGoodsService = wechatLiveGoodsService;
} }
@ -80,7 +77,8 @@ public class YxWechatLiveServiceImpl extends BaseServiceImpl<YxWechatLiveMapper,
@Override @Override
public boolean synchroWxOlLive() { public boolean synchroWxOlLive() {
try { try {
List<WxMaLiveResult.RoomInfo> liveInfos = wxMaLiveService.getLiveInfos(); WxMaService wxMaService = WxMaConfiguration.getWxMaService();
List<WxMaLiveResult.RoomInfo> liveInfos = wxMaService.getLiveService().getLiveInfos();
List<YxWechatLive> convert = generator.convert(liveInfos, YxWechatLive.class); List<YxWechatLive> convert = generator.convert(liveInfos, YxWechatLive.class);
this.saveOrUpdateBatch(convert); this.saveOrUpdateBatch(convert);
} catch (WxErrorException e) { } catch (WxErrorException e) {
@ -120,7 +118,7 @@ public class YxWechatLiveServiceImpl extends BaseServiceImpl<YxWechatLiveMapper,
resources.setCoverImg(uploadPhotoToWx(wxMaService,resources.getCoverImge()).getMediaId()); resources.setCoverImg(uploadPhotoToWx(wxMaService,resources.getCoverImge()).getMediaId());
resources.setShareImg(uploadPhotoToWx(wxMaService,resources.getShareImge()).getMediaId()); resources.setShareImg(uploadPhotoToWx(wxMaService,resources.getShareImge()).getMediaId());
WxMaLiveInfo.RoomInfo roomInfo = generator.convert(resources, WxMaLiveInfo.RoomInfo.class); WxMaLiveInfo.RoomInfo roomInfo = generator.convert(resources, WxMaLiveInfo.RoomInfo.class);
Integer status = wxMaLiveService.createRoom(roomInfo); Integer status = wxMaService.getLiveService().createRoom(roomInfo);
resources.setRoomid(Long.valueOf(status)); resources.setRoomid(Long.valueOf(status));
if(StringUtils.isNotBlank(resources.getProductId())){ if(StringUtils.isNotBlank(resources.getProductId())){
String[] productIds = resources.getProductId().split(","); String[] productIds = resources.getProductId().split(",");
@ -129,7 +127,7 @@ public class YxWechatLiveServiceImpl extends BaseServiceImpl<YxWechatLiveMapper,
pids.add(Integer.valueOf(productId)); pids.add(Integer.valueOf(productId));
} }
//添加商品 //添加商品
wxMaLiveService.addGoodsToRoom(status, pids); wxMaService.getLiveService().addGoodsToRoom(status, pids);
} }
this.save(resources); this.save(resources);
} catch (WxErrorException e) { } catch (WxErrorException e) {

View File

@ -11,7 +11,6 @@ package co.yixiang.modules.wechat.rest;
import co.yixiang.dozer.service.IGenerator; import co.yixiang.dozer.service.IGenerator;
import co.yixiang.logging.aop.log.Log; import co.yixiang.logging.aop.log.Log;
import co.yixiang.modules.wechat.domain.YxWechatLiveGoods; import co.yixiang.modules.wechat.domain.YxWechatLiveGoods;
import co.yixiang.modules.wechat.service.WxMaLiveGoodsService;
import co.yixiang.modules.wechat.service.YxWechatLiveGoodsService; import co.yixiang.modules.wechat.service.YxWechatLiveGoodsService;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsDto; import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsDto;
import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsQueryCriteria; import co.yixiang.modules.wechat.service.dto.YxWechatLiveGoodsQueryCriteria;
@ -47,7 +46,6 @@ public class YxWechatLiveGoodsController {
private final YxWechatLiveGoodsService yxWechatLiveGoodsService; private final YxWechatLiveGoodsService yxWechatLiveGoodsService;
private final IGenerator generator; private final IGenerator generator;
private final WxMaLiveGoodsService wxMaLiveGoodsService;
@Log("导出数据") @Log("导出数据")
@ApiOperation("导出数据") @ApiOperation("导出数据")