* 增加 微信第三方平台 接口 * WxOpenXmlMessage 消息处理 * 增加 摇周边部分接口 * fix * fix * rebase * 增加 摇周边部分接口 * fix * fix * unix 换行符 * fix 三方接口BUG * fix URL 错误 * WxOpenMpServiceImpl 修改为包可见,防止用户混淆 WxOpenXmlMessage 增加 加密 WxMpXmlOutMessage接口 MpConfigStorage 返回aeskey和token MpService可以直接加密 增加 全网发布用例master
@@ -1,4 +1,6 @@ | |||||
消息机制未实现,下面为通知回调中设置的代码部分 | 消息机制未实现,下面为通知回调中设置的代码部分 | ||||
以下代码可通过腾讯全网发布测试用例 | |||||
``` | ``` | ||||
@RestController | @RestController | ||||
@RequestMapping("notify") | @RequestMapping("notify") | ||||
@@ -55,7 +57,31 @@ public class NotifyController extends WechatThridBaseController { | |||||
// aes加密的消息 | // aes加密的消息 | ||||
WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); | WxMpXmlMessage inMessage = WxOpenXmlMessage.fromEncryptedMpXml(requestBody, wxOpenService.getWxOpenConfigStorage(), timestamp, nonce, msgSignature); | ||||
this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); | this.logger.debug("\n消息解密后内容为:\n{} ", inMessage.toString()); | ||||
//wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId); | |||||
// 全网发布测试用例 | |||||
if (StringUtils.equalsAnyIgnoreCase(appId, "wxd101a85aa106f53e", "wx570bc396a51b8ff8")) { | |||||
try { | |||||
if (StringUtils.equals(inMessage.getMsgType(), "text")) { | |||||
if (StringUtils.equals(inMessage.getContent(), "TESTCOMPONENT_MSG_TYPE_TEXT")) { | |||||
out = new WxOpenCryptUtil(wxOpenService.getWxOpenConfigStorage()).encrypt( | |||||
WxMpXmlOutMessage.TEXT().content("TESTCOMPONENT_MSG_TYPE_TEXT_callback") | |||||
.fromUser(inMessage.getToUser()) | |||||
.toUser(inMessage.getFromUser()) | |||||
.build() | |||||
.toXml() | |||||
); | |||||
} else if (StringUtils.startsWith(inMessage.getContent(), "QUERY_AUTH_CODE:")) { | |||||
String msg = inMessage.getContent().replace("QUERY_AUTH_CODE:", "") + "_from_api"; | |||||
WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(msg).toUser(inMessage.getFromUser()).build(); | |||||
wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage); | |||||
} | |||||
} else if (StringUtils.equals(inMessage.getMsgType(), "event")) { | |||||
WxMpKefuMessage kefuMessage = WxMpKefuMessage.TEXT().content(inMessage.getEvent() + "from_callback").toUser(inMessage.getFromUser()).build(); | |||||
wxOpenService.getWxOpenComponentService().getWxMpServiceByAppid(appId).getKefuService().sendKefuMessage(kefuMessage); | |||||
} | |||||
} catch (WxErrorException e) { | |||||
logger.error("callback", e); | |||||
} | |||||
} | |||||
return out; | return out; | ||||
} | } | ||||
} | } | ||||
@@ -29,11 +29,11 @@ public interface WxOpenComponentService { | |||||
/** | /** | ||||
* 用code换取oauth2的access token | * 用code换取oauth2的access token | ||||
*/ | */ | ||||
String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=%s&code=%s&grant_type=authorization_code&component_appid=%s"; | |||||
String OAUTH2_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/access_token?appid=%s&code=%s&grant_type=authorization_code&component_appid=%s"; | |||||
/** | /** | ||||
* 刷新oauth2的access token | * 刷新oauth2的access token | ||||
*/ | */ | ||||
String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s&component_appid==%s"; | |||||
String OAUTH2_REFRESH_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/component/refresh_token?appid=%s&grant_type=refresh_token&refresh_token=%s&component_appid==%s"; | |||||
WxMpService getWxMpServiceByAppid(String appid); | WxMpService getWxMpServiceByAppid(String appid); | ||||
@@ -329,7 +329,7 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
@Override | @Override | ||||
public String getToken() { | public String getToken() { | ||||
return null; | |||||
return wxOpenConfigStorage.getComponentToken(); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -340,7 +340,7 @@ public class WxOpenInMemoryConfigStorage implements WxOpenConfigStorage { | |||||
@Override | @Override | ||||
public String getAesKey() { | public String getAesKey() { | ||||
return null; | |||||
return wxOpenConfigStorage.getComponentAesKey(); | |||||
} | } | ||||
@Override | @Override | ||||
@@ -9,7 +9,7 @@ import me.chanjar.weixin.open.api.WxOpenComponentService; | |||||
/** | /** | ||||
* @author <a href="https://github.com/007gzs">007</a> | * @author <a href="https://github.com/007gzs">007</a> | ||||
*/ | */ | ||||
public class WxOpenMpServiceImpl extends WxMpServiceImpl { | |||||
/* package */ class WxOpenMpServiceImpl extends WxMpServiceImpl { | |||||
private WxOpenComponentService wxOpenComponentService; | private WxOpenComponentService wxOpenComponentService; | ||||
private WxMpConfigStorage wxMpConfigStorage; | private WxMpConfigStorage wxMpConfigStorage; | ||||
private String appId; | private String appId; | ||||
@@ -5,6 +5,7 @@ import com.thoughtworks.xstream.annotations.XStreamConverter; | |||||
import lombok.Data; | import lombok.Data; | ||||
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | import me.chanjar.weixin.common.util.xml.XStreamCDataConverter; | ||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | import me.chanjar.weixin.mp.bean.message.WxMpXmlMessage; | ||||
import me.chanjar.weixin.mp.bean.message.WxMpXmlOutMessage; | |||||
import me.chanjar.weixin.open.api.WxOpenConfigStorage; | import me.chanjar.weixin.open.api.WxOpenConfigStorage; | ||||
import me.chanjar.weixin.open.util.WxOpenCryptUtil; | import me.chanjar.weixin.open.util.WxOpenCryptUtil; | ||||
import me.chanjar.weixin.open.util.xml.XStreamTransformer; | import me.chanjar.weixin.open.util.xml.XStreamTransformer; | ||||
@@ -52,6 +53,12 @@ public class WxOpenXmlMessage implements Serializable { | |||||
@XStreamConverter(value = XStreamCDataConverter.class) | @XStreamConverter(value = XStreamCDataConverter.class) | ||||
private String preAuthCode; | private String preAuthCode; | ||||
public static String wxMpOutXmlMessageToEncryptedXml(WxMpXmlOutMessage message, WxOpenConfigStorage wxOpenConfigStorage){ | |||||
String plainXml = message.toXml(); | |||||
WxOpenCryptUtil pc = new WxOpenCryptUtil(wxOpenConfigStorage); | |||||
return pc.encrypt(plainXml); | |||||
} | |||||
public static WxOpenXmlMessage fromXml(String xml) { | public static WxOpenXmlMessage fromXml(String xml) { | ||||
//修改微信变态的消息内容格式,方便解析 | //修改微信变态的消息内容格式,方便解析 | ||||
xml = xml.replace("</PicList><PicList>", ""); | xml = xml.replace("</PicList><PicList>", ""); | ||||