All Downloads are FREE. Search and download functionalities are using the official Maven repository.

me.chanjar.weixin.open.bean.message.WxOpenXmlMessage Maven / Gradle / Ivy

The newest version!
package me.chanjar.weixin.open.bean.message;

import com.thoughtworks.xstream.annotations.XStreamAlias;
import com.thoughtworks.xstream.annotations.XStreamConverter;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxRuntimeException;
import me.chanjar.weixin.common.util.xml.XStreamCDataConverter;
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.util.WxOpenCryptUtil;
import me.chanjar.weixin.open.util.xml.XStreamTransformer;
import org.apache.commons.io.IOUtils;

import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;

/**
 * @author 007
 */
@Data
@Slf4j
@XStreamAlias("xml")
public class WxOpenXmlMessage implements Serializable {
  private static final long serialVersionUID = -5641769554709507771L;

  /**
   * 第三方平台的APPID
   */
  @XStreamAlias("AppId")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String appId;

  @XStreamAlias("CreateTime")
  private Long createTime;

  @XStreamAlias("InfoType")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String infoType;

  @XStreamAlias("ComponentVerifyTicket")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String componentVerifyTicket;

  @XStreamAlias("AuthorizerAppid")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String authorizerAppid;

  @XStreamAlias("AuthorizationCode")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String authorizationCode;

  @XStreamAlias("AuthorizationCodeExpiredTime")
  private Long authorizationCodeExpiredTime;

  @XStreamAlias("PreAuthCode")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String preAuthCode;

  /**
   * 子平台APPID(公众号/小程序的APPID) 快速创建小程序、小程序认证中
   */
  @XStreamAlias("appid")
  private String subAppId;

  // 以下为快速创建小程序接口推送的的信息

  @XStreamAlias("status")
  private int status;

  @XStreamAlias("auth_code")
  private String authCode;

  @XStreamAlias("msg")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String msg;

  @XStreamAlias("info")
  private Info info = new Info();

  // 以下为小程序认证(年审)申请审核流程 推送的消息 infoType=notify_3rd_wxa_auth
  /**
   * 任务ID
   */
  @XStreamAlias("taskid")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String taskId;

  /**
   * 认证任务状态 0初始 1超24小时 2用户拒绝 3用户同意 4发起人脸 5人脸失败 6人脸ok 7人脸认证后手机验证码 8手机验证失败 9手机验证成功 11创建审核单失败 12创建审核单成功 14验证失败 15等待支付
   */
  @XStreamAlias("task_status")
  private Integer taskStatus;

  /**
   * 审核单状态,创建审核单成功后有效 0审核单不存在 1待支付 2审核中 3打回重填 4认证通过 5认证最终失败(不能再修改)
   */
  @XStreamAlias("apply_status")
  private Integer applyStatus;

  /**
   * 审核消息或失败原因
   */
  @XStreamAlias("message")
  @XStreamConverter(value = XStreamCDataConverter.class)
  private String message;


  /**
   * 审核提供商分配信息
   */
  @XStreamAlias("dispatch_info")
  private DispatchInfo dispatchInfo;


  // 以下为小程序认证(年审)即将到期通知(过期当天&过期30天&过期60) infoType=notify_3rd_wxa_wxverify,并会附带message
  /**
   * 过期时间戳(秒数)
   */
  @XStreamAlias("expired")
  private Long expired;

  //region 以下为小程序管理员人脸核身完成事件 推送的消息 infoType=notify_icpfiling_verify_result

  /**
   * 人脸核验任务id
   */
  @XStreamAlias("task_id")
  private String IcpVerifyTaskId;
  /**
   * 小程序唯一id
   */
  @XStreamAlias("verify_appid")
  private String verifyAppId;
  /**
   * 人脸核验结果: 2-核验失败;3-核验成功
   */
  @XStreamAlias("result")
  private Integer result;
  //endregion

  //region 当备案审核被驳回或通过时会推送该事件 推送的消息 infoType=notify_apply_icpfiling_result
  /**
   * 小程序唯一id
   */
  @XStreamAlias("authorizer_appid")
  private String beianAuthorizerAppId;
  /**
   * 备案状态,参考“获取小程序备案状态及驳回原因”接口的备案状态枚举¬
   */
  @XStreamAlias("beian_status")
  private Integer beianStatus;
  //endregion

  /**
   * 快速创建的小程序appId,已弃用,未来将删除
   *
   * @see #getSubAppId() 应使用此方法
   */
  @Deprecated
  public String getRegistAppId() {
    return subAppId;
  }

  /**
   * 快速创建的小程序appId,已弃用,未来将删除
   *
   * @see #setSubAppId(String) 应使用此方法
   */
  @Deprecated
  public void setRegistAppId(String value) {
    subAppId = value;
  }


  @XStreamAlias("info")
  @Data
  public static class Info implements Serializable {
    private static final long serialVersionUID = 7706235740094081194L;

    @XStreamAlias("name")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String name;

    @XStreamAlias("code")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String code;

    @XStreamAlias("code_type")
    private int codeType;

    @XStreamAlias("legal_persona_wechat")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String legalPersonaWechat;

    @XStreamAlias("legal_persona_name")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String legalPersonaName;

    @XStreamAlias("component_phone")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String componentPhone;

    // 创建个人小程序审核通知数据
    @XStreamAlias("wxuser")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String wxuser;

    @XStreamAlias("idname")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String idname;

    // 创建试用小程序成功/失败的通知数据
    @XStreamAlias("unique_id")
    @XStreamConverter(value = XStreamCDataConverter.class)
    private String uniqueId;

  }

  /**
   * 审核提供商分配信息
   */
  @Data
  public static class DispatchInfo {

    /**
     * 提供商,如:上海倍通企业信用征信有限公司
     */
    @XStreamConverter(value = XStreamCDataConverter.class)
    @XStreamAlias("provider")
    private String provider;

    /**
     * 联系方式,如:咨询电话:0411-84947888,咨询时间:周一至周五(工作日)8:30-17:30
     */
    @XStreamConverter(value = XStreamCDataConverter.class)
    @XStreamAlias("contact")
    private String contact;

    /**
     * 派遣时间戳(秒),如:1704952913
     */
    @XStreamAlias("dispatch_time")
    private Long dispatchTime;
  }

  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) {
    //修改微信变态的消息内容格式,方便解析
    xml = xml.replace("", "");
    return XStreamTransformer.fromXml(WxOpenXmlMessage.class, xml);
  }

  public static WxOpenXmlMessage fromXml(InputStream is) {
    return XStreamTransformer.fromXml(WxOpenXmlMessage.class, is);
  }

  /**
   * 从加密字符串转换
   *
   * @param encryptedXml        密文
   * @param wxOpenConfigStorage 配置存储器对象
   * @param timestamp           时间戳
   * @param nonce               随机串
   * @param msgSignature        签名串
   */
  public static WxOpenXmlMessage fromEncryptedXml(String encryptedXml, WxOpenConfigStorage wxOpenConfigStorage,
                                                  String timestamp, String nonce, String msgSignature) {
    WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage);
    String plainText = cryptUtil.decryptXml(msgSignature, timestamp, nonce, encryptedXml);
    log.debug("解密后的原始xml消息内容:{}", plainText);
    return fromXml(plainText);
  }

  public static WxMpXmlMessage fromEncryptedMpXml(String encryptedXml, WxOpenConfigStorage wxOpenConfigStorage,
                                                  String timestamp, String nonce, String msgSignature) {
    WxOpenCryptUtil cryptUtil = new WxOpenCryptUtil(wxOpenConfigStorage);
    String plainText = cryptUtil.decryptXml(msgSignature, timestamp, nonce, encryptedXml);
    return WxMpXmlMessage.fromXml(plainText);
  }

  public static WxOpenXmlMessage fromEncryptedXml(InputStream is, WxOpenConfigStorage wxOpenConfigStorage,
                                                  String timestamp, String nonce, String msgSignature) {
    try {
      return fromEncryptedXml(IOUtils.toString(is, StandardCharsets.UTF_8),
        wxOpenConfigStorage, timestamp, nonce, msgSignature);
    } catch (IOException e) {
      throw new WxRuntimeException(e);
    }
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy