diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java index 686c86f20d..998939ca84 100644 --- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java +++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/WxMpMaterialService.java @@ -88,6 +88,22 @@ public interface WxMpMaterialService { */ File mediaDownload(String mediaId) throws WxErrorException; + /** + *
+   * 获取高清语音素材
+   * 公众号可以使用本接口获取从JSSDK的uploadVoice接口上传的临时语音素材,格式为speex,16K采样率。
+   * 该音频比上文的临时素材获取接口(格式为amr,8K采样率)更加清晰,适合用作语音识别等对音质要求较高的业务。
+   * 详情请见: 
+   * 获取高清语音素材
+   * 接口url格式:https://api.weixin.qq.com/cgi-bin/media/get/jssdk?access_token=ACCESS_TOKEN&media_id=MEDIA_ID
+   * 
+ * + * @param mediaId 媒体文件Id + * @return 保存到本地的临时文件 + * @throws WxErrorException + */ + File jssdkMediaDownload(String mediaId) throws WxErrorException; + /** *
    * 上传图文消息内的图片获取URL
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
index 2ceec219f7..4b852c03fe 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImpl.java
@@ -65,6 +65,14 @@ public File mediaDownload(String mediaId) throws WxErrorException {
       "media_id=" + mediaId);
   }
 
+  @Override
+  public File jssdkMediaDownload(String mediaId) throws WxErrorException {
+    return this.wxMpService.execute(
+      BaseMediaDownloadRequestExecutor.create(this.wxMpService.getRequestHttp(), this.wxMpService.getWxMpConfigStorage().getTmpDirFile()),
+      JSSDK_MEDIA_GET_URL,
+      "media_id=" + mediaId);
+  }
+
   @Override
   public WxMediaImgUploadResult mediaImgUpload(File file) throws WxErrorException {
     return this.wxMpService.execute(MediaImgUploadRequestExecutor.create(this.wxMpService.getRequestHttp()), IMG_UPLOAD_URL, file);
diff --git a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
index 442f0305ff..5963af929d 100644
--- a/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
+++ b/weixin-java-mp/src/main/java/me/chanjar/weixin/mp/enums/WxMpApiUrl.java
@@ -819,6 +819,10 @@ enum Material implements WxMpApiUrl {
      * get.
      */
     MEDIA_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/get"),
+    /**
+     * jssdk media get.
+     */
+    JSSDK_MEDIA_GET_URL(API_DEFAULT_HOST_URL, "/cgi-bin/media/get/jssdk"),
     /**
      * upload.
      */
diff --git a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
index 024697cb70..6d14b336f5 100644
--- a/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
+++ b/weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/WxMpMaterialServiceImplTest.java
@@ -44,6 +44,8 @@ public class WxMpMaterialServiceImplTest {
   private WxMpMaterialCountResult wxMaterialCountResultBeforeTest;
   // 以下为media接口的测试
   private List mediaIdsToDownload = new ArrayList<>();
+  // 以下为高清语音接口的测试
+  private List voiceMediaIdsToDownload = new ArrayList<>();
 
   @DataProvider
   public Object[][] mediaFiles() {
@@ -289,6 +291,11 @@ public void testUploadMedia(String mediaType, String fileType, String fileName)
       if (res.getMediaId() != null && !mediaType.equals(WxConsts.MediaFileType.VIDEO)) {
         //video 不支持下载,所以不加入
         this.mediaIdsToDownload.add(res.getMediaId());
+
+        // 音频media, 用于测试下载高清语音接口
+        if (mediaType.equals(WxConsts.MediaFileType.VOICE)) {
+          this.voiceMediaIdsToDownload.add(res.getMediaId());
+        }
       }
 
       if (res.getThumbMediaId() != null) {
@@ -308,10 +315,26 @@ public Object[][] downloadMedia() {
     return params;
   }
 
+  @DataProvider
+  public Object[][] downloadJssdkMedia() {
+    Object[][] params = new Object[this.voiceMediaIdsToDownload.size()][];
+    for (int i = 0; i < this.voiceMediaIdsToDownload.size(); i++) {
+      params[i] = new Object[]{this.voiceMediaIdsToDownload.get(i)};
+    }
+    return params;
+  }
+
   @Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadMedia")
   public void testDownloadMedia(String mediaId) throws WxErrorException {
     File file = this.wxService.getMaterialService().mediaDownload(mediaId);
     assertNotNull(file);
     System.out.println(file.getAbsolutePath());
   }
+
+  @Test(dependsOnMethods = {"testUploadMedia"}, dataProvider = "downloadJssdkMedia")
+  public void testDownloadJssdkMedia(String mediaId) throws WxErrorException {
+    File file = this.wxService.getMaterialService().jssdkMediaDownload(mediaId);
+    assertNotNull(file);
+    System.out.println(file.getAbsolutePath());
+  }
 }