Visitar URL original
合并 Develop,发布3.1.0正式版 by binarywang · Pull Request #640 · binarywang/WxJava · GitHub
Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
76 commits
Select commit Hold shift + click to select a range
996c806
#519 修复小程序客服消息 URL 被转义的问题
ztmark Mar 30, 2018
d619848
优化单元测试提示信息
binarywang Mar 30, 2018
45cc5cc
Merge branch 'master' into develop
binarywang Mar 30, 2018
608b59e
网页授权url增加&connect_redirect=1参数解决两次重定向跳转问题: https://blog.csdn.net/jian…
binarywang Apr 8, 2018
b69a0b9
修复错误的feeToYuan方法名为fenToYuan
binarywang Apr 8, 2018
5295b26
#529 EntPayBankRequest增加默认构造函数
binarywang Apr 9, 2018
ae5267d
#529 EntPayBankResult中cmmsAmount的数据类型改为Integer
binarywang Apr 9, 2018
e1d2748
#528 WxMpUser类增加三个属性:subscribe_scene、 qr_scene 和qr_scene_str
binarywang Apr 9, 2018
dce4f6f
修复代码
binarywang Apr 10, 2018
a6ee082
发布3.0.1.BETA测试版本
binarywang Apr 10, 2018
617f861
#533 微信刷卡支付请求类增加缺少的三个参数
binarywang Apr 12, 2018
a0240e7
#536 企业号模块增加获取企业号应用相关接口
huansinho Apr 13, 2018
558f4e7
#535 修复Tomcat 不能正常关闭的问题,增加线程池shutdown相关的操作
gtyang Apr 16, 2018
74faa2a
#541 企业号增加实现管理标签的(获取标签成员)接口
huansinho Apr 16, 2018
7d688a3
#534 公众号发送模版消息中的小程序path改回pagepath
binarywang Apr 16, 2018
728c795
发布3.0.2.BETA测试版本
binarywang Apr 16, 2018
1386107
#547 开放平台模块 componentAccessToken 增加过期自动刷新
007gzs Apr 19, 2018
66b02d0
createOrder方法增加H5支付的支持
binarywang Apr 21, 2018
94b2803
#551 文本卡片消息增加btntext字段
binarywang Apr 21, 2018
b5c3b5e
#550 企业微信删除标签成员接口增加部门列表参数
binarywang Apr 21, 2018
2063dcf
清理无用代码
binarywang Apr 21, 2018
8b30615
#530 微信支付申请退款接口结果类增加单个代金券相关参数 ,并根据官方文档整理其他参数
binarywang Apr 21, 2018
61e3163
#531 小程序WxMaMessage类增加小程序卡片消息相关的几个属性
binarywang Apr 21, 2018
5b69d91
#520 企业微信网页授权增加使用user_ticket获取成员详情的接口
binarywang Apr 22, 2018
06e3a9c
发布3.0.3.BETA测试版本
binarywang Apr 22, 2018
80cf632
优化代码
binarywang Apr 23, 2018
445b47b
完善测试
binarywang Apr 23, 2018
3481cca
#559 微信开放平台:1. WxOpenInRedisConfigStorage 支持 JedisPool/JedisSentinelP…
charmingoh Apr 26, 2018
75c038d
#560 微信开放平台:增加小程序代码模板库管理
charmingoh Apr 26, 2018
0247486
#562 小程序增加代码管理相关 API
charmingoh Apr 26, 2018
ba93544
#563 小程序增加修改服务器地址、成员管理 API
charmingoh Apr 27, 2018
3c2249e
#565 小程序增加数据分析相关 API
charmingoh Apr 29, 2018
04ec788
#567 微信开放平台增加 HTTP proxy 机制
charmingoh May 1, 2018
9ff53a5
#568 修复三方平台多次授权时,RefreshToken 没有刷新的问题
007gzs May 2, 2018
1cea48b
发布3.0.4.BETA测试版本
binarywang May 2, 2018
a21fdf2
fix code
binarywang May 6, 2018
499750b
#569 微信支付几个查询关闭对账下载相关接口增加重载方法,以方便客户端指定更多参数
binarywang May 6, 2018
9558378
#578 微信开放平台增加 WxMaUserService 的实现
charmingoh May 8, 2018
329847e
修复小程序码的相关方法命名:WxCode->WxaCode, WxCodeLimit -> WxaCodeUnlimit
binarywang May 8, 2018
75069ba
#556 日志信息中如果含有secret值的,将其值隐藏掉
binarywang May 8, 2018
26eba6a
#585 小程序二维码支持is_hyaline参数生成透明背景二维码
scott-z May 11, 2018
d4cf220
发布3.0.5.BETA测试版本
binarywang May 12, 2018
adf3685
#584 修复企业付款到银行卡接口签名失败的问题
binarywang May 12, 2018
71f97c0
简化代码
binarywang May 13, 2018
06c356b
#586 微信支付 WxPayConfig增加支持byte数组方式设置证书
binarywang May 13, 2018
b698806
#581 增加微信公众号错误信息枚举类WxMpErrorMsg,并提供方法,方便根据错误代码查询错误信息内容
binarywang May 13, 2018
936b40c
#555 修复微信支付服务商模式支付验证签名失败的问题
binarywang May 13, 2018
08250aa
#521 微信支付回调通知类WxPayOrderNotifyResult增加version参数
binarywang May 13, 2018
01b1be3
#583 企业微信新增人员接口新增字段to_invite
binarywang May 13, 2018
bdbd92b
#583 企业微信通讯录管理增加邀请成员接口
binarywang May 13, 2018
7435f2d
#587 企业微信几个接口增加个人二维码字段
binarywang May 13, 2018
0e81206
修复字符
binarywang May 13, 2018
1322228
修复单元测试
binarywang May 13, 2018
a9d5527
发布3.0.6.BETA测试版本
binarywang May 13, 2018
ef97a30
重构WxError相关代码,自动根据代码补充错误中文说明
binarywang May 14, 2018
f796bfd
优化微信支付代码
binarywang May 14, 2018
ad2a5d3
#584 修复企业付款queryEntPay签名失败问题
binarywang May 18, 2018
f574403
#591 文件上传接口不自动关闭inputStream,由调用方自己控制
binarywang May 18, 2018
5b0022b
#595 优化WxPayException
binarywang May 18, 2018
4d863ee
发布3.0.7.BETA测试版本
binarywang May 21, 2018
535dd55
更新pom
binarywang May 31, 2018
f704b1a
优化代码
binarywang May 31, 2018
96e7310
#615 公众号客服消息添加 "发送小程序卡片" 类型
borisbao Jun 6, 2018
030ab99
优化XStreamTransformer
binarywang Jun 7, 2018
7852a58
微信支付模块jodd-http修改scope
binarywang Jun 7, 2018
c0938ff
发布3.0.8.BETA测试版本
binarywang Jun 7, 2018
1b759ea
#623 群发接口增加clientmsgid
binarywang Jun 9, 2018
499d12e
add author for some files
binarywang Jun 9, 2018
b901f73
clean code
binarywang Jun 9, 2018
0daaa01
重构规范RequestExecuter代码
binarywang Jun 9, 2018
5b5dada
#532 实现微信AI开放接口的三个接口:语音上传、查询识别结果和微信翻译功能
binarywang Jun 10, 2018
fa6fe78
发布3.0.9.BETA测试版本
binarywang Jun 10, 2018
ba7905a
#516 增加获取Wi-Fi门店列表接口
binarywang Jun 10, 2018
a10007a
#629 修复WxPayOrderNotifyResult解析xml报错问题
binarywang Jun 19, 2018
edb15cc
#639 修复小程序代码模版库管理 access_token key 错误
007gzs Jun 22, 2018
0cbd354
发布3.1.0正式版本
binarywang Jun 22, 2018
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
#532 实现微信AI开放接口的三个接口:语音上传、查询识别结果和微信翻译功能
  • Loading branch information
binarywang committed Jun 10, 2018
commit 5b5dada0fe012384c30ed6f357ec5b178b3420db
29 changes: 29 additions & 0 deletions weixin-java-mp/src/main/java/me/chanjar/weixin/mp/AiLangType.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
package me.chanjar.weixin.mp;

import lombok.Getter;

/**
* <pre>
* AI开放接口里的语言类型,目前只支持两种:中文和英文
* Created by BinaryWang on 2018/6/10.
* </pre>
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
*/
@Getter
public enum AiLangType {
/**
* 中文 汉语
*/
zh_CN("zh_CN"),
/**
* 英文 英语
*/
en_US("en_US");

private String code;

AiLangType(String code) {
this.code = code;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
package me.chanjar.weixin.mp.api;

import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.AiLangType;

import java.io.File;

/**
* <pre>
* 微信AI开放接口(语音识别,微信翻译).
* https://mp.weixin.qq.com/wiki?t=resource/res_main&id=21516712282KzWVE
* Created by BinaryWang on 2018/6/9.
* </pre>
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
*/
public interface WxMpAiOpenService {
String VOICE_UPLOAD_URL = "http://api.weixin.qq.com/cgi-bin/media/voice/addvoicetorecofortext?format=%s&voice_id=%s&lang=%s";
String VOICE_QUERY_RESULT_URL = "http://api.weixin.qq.com/cgi-bin/media/voice/queryrecoresultfortext";

/**
* <pre>
* 提交语音.
* 接口调用请求说明
*
* http请求方式: POST
* http://api.weixin.qq.com/cgi-bin/media/voice/addvoicetorecofortext?access_token=ACCESS_TOKEN&format=&voice_id=xxxxxx&lang=zh_CN
* 参数说明
*
* 参数 是否必须 说明
* access_token 是 接口调用凭证
* format 是 文件格式 (只支持mp3,16k,单声道,最大1M)
* voice_id 是 语音唯一标识
* lang 否 语言,zh_CN 或 en_US,默认中文
* 语音内容放body里或者上传文件的形式
* </pre>
*
* @param lang 语言,zh_CN 或 en_US,默认中文
* @param voiceFile 语音文件
* @param voiceId 语音唯一标识
*/
void uploadVoice(String voiceId, AiLangType lang, File voiceFile) throws WxErrorException;

/**
* <pre>
* 获取语音识别结果.
* 接口调用请求说明
*
* http请求方式: POST
* http://api.weixin.qq.com/cgi-bin/media/voice/queryrecoresultfortext?access_token=ACCESS_TOKEN&voice_id=xxxxxx&lang=zh_CN
* 请注意,添加完文件之后10s内调用这个接口
*
* 参数说明
*
* 参数 是否必须 说明
* access_token 是 接口调用凭证
* voice_id 是 语音唯一标识
* lang 否 语言,zh_CN 或 en_US,默认中文
* </pre>
*
* @param lang 语言,zh_CN 或 en_US,默认中文
* @param voiceId 语音唯一标识
*/
String queryRecognitionResult(String voiceId, AiLangType lang) throws WxErrorException;

/**
* 识别指定语音文件内容.
* 此方法揉合了前两两个方法:uploadVoice 和 queryRecognitionResult
*
* @param lang 语言,zh_CN 或 en_US,默认中文
* @param voiceFile 语音文件
* @param voiceId 语音唯一标识
*/
String recogniseVoice(String voiceId, AiLangType lang, File voiceFile) throws WxErrorException;

/**
* <pre>
* 微信翻译.
* 接口调用请求说明
*
* http请求方式: POST
* http://api.weixin.qq.com/cgi-bin/media/voice/translatecontent?access_token=ACCESS_TOKEN&lfrom=xxx&lto=xxx
* 参数说明
*
* 参数 是否必须 说明
* access_token 是 接口调用凭证
* lfrom 是 源语言,zh_CN 或 en_US
* lto 是 目标语言,zh_CN 或 en_US
* 源内容放body里或者上传文件的形式(utf8格式,最大600Byte)
* </pre>
*
* @param langFrom 源语言,zh_CN 或 en_US
* @param langTo 目标语言,zh_CN 或 en_US
* @param content 要翻译的文本内容
*/
String translate(AiLangType langFrom, AiLangType langTo, String content) throws WxErrorException;
}
Original file line number Diff line number Diff line change
Expand Up @@ -408,6 +408,13 @@ public interface WxMpService {
*/
WxMpMassMessageService getMassMessageService();

/**
* 返回AI开放接口方法的实现类对象,以方便调用其各个接口
*
* @return WxMpAiOpenService
*/
WxMpAiOpenService getAiOpenService();

void setKefuService(WxMpKefuService kefuService);

void setMaterialService(WxMpMaterialService materialService);
Expand Down Expand Up @@ -437,4 +444,6 @@ public interface WxMpService {
void setMemberCardService(WxMpMemberCardService memberCardService);

void setMassMessageService(WxMpMassMessageService massMessageService);

void setAiOpenService(WxMpAiOpenService aiOpenService);
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,11 +26,14 @@
import java.io.IOException;
import java.util.concurrent.locks.Lock;

public abstract class WxMpServiceBaseImpl<H, P> implements WxMpService, RequestHttp<H, P> {

/**
* @author someone
*/
public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestHttp<H, P> {
private static final JsonParser JSON_PARSER = new JsonParser();

protected final Logger log = LoggerFactory.getLogger(this.getClass());

protected WxSessionManager sessionManager = new StandardSessionManager();
protected WxMpConfigStorage wxMpConfigStorage;
private WxMpKefuService kefuService = new WxMpKefuServiceImpl(this);
Expand All @@ -49,6 +52,7 @@ public abstract class WxMpServiceBaseImpl<H, P> implements WxMpService, RequestH
private WxMpShakeService shakeService = new WxMpShakeServiceImpl(this);
private WxMpMemberCardService memberCardService = new WxMpMemberCardServiceImpl(this);
private WxMpMassMessageService massMessageService = new WxMpMassMessageServiceImpl(this);
private WxMpAiOpenService aiOpenService = new WxMpAiOpenServiceImpl(this);

private int retrySleepMillis = 1000;
private int maxRetryTimes = 5;
Expand Down Expand Up @@ -487,4 +491,14 @@ public void setMemberCardService(WxMpMemberCardService memberCardService) {
public void setMassMessageService(WxMpMassMessageService massMessageService) {
this.massMessageService = massMessageService;
}

@Override
public WxMpAiOpenService getAiOpenService() {
return this.aiOpenService;
}

@Override
public void setAiOpenService(WxMpAiOpenService aiOpenService) {
this.aiOpenService = aiOpenService;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
package me.chanjar.weixin.mp.api.impl;

import com.google.gson.JsonObject;
import com.google.gson.JsonParser;
import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.mp.AiLangType;
import me.chanjar.weixin.mp.api.WxMpAiOpenService;
import me.chanjar.weixin.mp.api.WxMpService;
import me.chanjar.weixin.mp.util.requestexecuter.voice.VoiceUploadRequestExecutor;

import java.io.File;

/**
* <pre>
* Created by BinaryWang on 2018/6/9.
* </pre>
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
*/
public class WxMpAiOpenServiceImpl implements WxMpAiOpenService {

private static final JsonParser JSON_PARSER = new JsonParser();
public static final String TRANSLATE_URL = "http://api.weixin.qq.com/cgi-bin/media/voice/translatecontent?lfrom=%s&lto=%s";
private WxMpService wxMpService;

public WxMpAiOpenServiceImpl(WxMpService wxMpService) {
this.wxMpService = wxMpService;
}

@Override
public void uploadVoice(String voiceId, AiLangType lang, File voiceFile) throws WxErrorException {
if (lang == null) {
lang = AiLangType.zh_CN;
}

this.wxMpService.execute(VoiceUploadRequestExecutor.create(this.wxMpService.getRequestHttp()),
String.format(VOICE_UPLOAD_URL, "mp3", voiceId, lang.getCode()),
voiceFile);
}

@Override
public String recogniseVoice(String voiceId, AiLangType lang, File voiceFile) throws WxErrorException {
this.uploadVoice(voiceId, lang, voiceFile);
return this.queryRecognitionResult(voiceId, lang);
}

@Override
public String translate(AiLangType langFrom, AiLangType langTo, String content) throws WxErrorException {
final String responseContent = this.wxMpService.post(String.format(TRANSLATE_URL, langFrom.getCode(), langTo.getCode()),
content);
final JsonObject jsonObject = new JsonParser().parse(responseContent).getAsJsonObject();
if (jsonObject.get("errcode") == null || jsonObject.get("errcode").getAsInt() == 0) {
return jsonObject.get("to_content").getAsString();
}

throw new WxErrorException(WxError.fromJson(responseContent, WxType.MP));
}

@Override
public String queryRecognitionResult(String voiceId, AiLangType lang) throws WxErrorException {
if (lang == null) {
lang = AiLangType.zh_CN;
}

final String responseContent = this.wxMpService.get(VOICE_QUERY_RESULT_URL,
String.format("voice_id=%s&lang=%s", voiceId, lang.getCode()));
final JsonObject jsonObject = JSON_PARSER.parse(responseContent).getAsJsonObject();
if (jsonObject.get("errcode") == null || jsonObject.get("errcode").getAsInt() == 0) {
return jsonObject.get("result").getAsString();
}

throw new WxErrorException(WxError.fromJson(responseContent, WxType.MP));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@
/**
* apache http client方式实现.
*/
public class WxMpServiceHttpClientImpl extends WxMpServiceBaseImpl<CloseableHttpClient, HttpHost> {
public class WxMpServiceHttpClientImpl extends BaseWxMpServiceImpl<CloseableHttpClient, HttpHost> {
private CloseableHttpClient httpClient;
private HttpHost httpProxy;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
/**
* jodd-http方式实现
*/
public class WxMpServiceJoddHttpImpl extends WxMpServiceBaseImpl<HttpConnectionProvider, ProxyInfo> {
public class WxMpServiceJoddHttpImpl extends BaseWxMpServiceImpl<HttpConnectionProvider, ProxyInfo> {
private HttpConnectionProvider httpClient;
private ProxyInfo httpProxy;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
/**
* okhttp实现
*/
public class WxMpServiceOkHttpImpl extends WxMpServiceBaseImpl<OkHttpClient, OkHttpProxyInfo> {
public class WxMpServiceOkHttpImpl extends BaseWxMpServiceImpl<OkHttpClient, OkHttpProxyInfo> {
private OkHttpClient httpClient;
private OkHttpProxyInfo httpProxy;

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
package me.chanjar.weixin.mp.util.requestexecuter.voice;

import me.chanjar.weixin.common.WxType;
import me.chanjar.weixin.common.error.WxError;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.common.util.http.RequestHttp;
import me.chanjar.weixin.common.util.http.apache.Utf8ResponseHandler;
import org.apache.http.HttpEntity;
import org.apache.http.HttpHost;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.mime.HttpMultipartMode;
import org.apache.http.entity.mime.MultipartEntityBuilder;
import org.apache.http.impl.client.CloseableHttpClient;

import java.io.File;
import java.io.IOException;

/**
* <pre>
* Created by BinaryWang on 2018/6/9.
* </pre>
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
*/
public class VoiceUploadApacheHttpRequestExecutor extends VoiceUploadRequestExecutor<CloseableHttpClient, HttpHost> {
public VoiceUploadApacheHttpRequestExecutor(RequestHttp requestHttp) {
super(requestHttp);
}

@Override
public Boolean execute(String uri, File data) throws WxErrorException, IOException {
if (data == null) {
throw new WxErrorException(WxError.builder().errorCode(-1).errorMsg("文件对象为空").build());
}

HttpPost httpPost = new HttpPost(uri);
if (requestHttp.getRequestHttpProxy() != null) {
RequestConfig config = RequestConfig.custom().setProxy(requestHttp.getRequestHttpProxy()).build();
httpPost.setConfig(config);
}

HttpEntity entity = MultipartEntityBuilder
.create()
.addBinaryBody("media", data)
.setMode(HttpMultipartMode.RFC6532)
.build();
httpPost.setEntity(entity);
httpPost.setHeader("Content-Type", ContentType.MULTIPART_FORM_DATA.toString());

try (CloseableHttpResponse response = requestHttp.getRequestHttpClient().execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE.handleResponse(response);
WxError error = WxError.fromJson(responseContent, WxType.MP);
if (error.getErrorCode() != 0) {
throw new WxErrorException(error);
}

return true;
} finally {
httpPost.releaseConnection();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package me.chanjar.weixin.mp.util.requestexecuter.voice;

import me.chanjar.weixin.common.util.http.RequestExecutor;
import me.chanjar.weixin.common.util.http.RequestHttp;

import java.io.File;

/**
* <pre>
* Created by BinaryWang on 2018/6/9.
* </pre>
*
* @author <a href="https://github.com/binarywang">Binary Wang</a>
*/
public abstract class VoiceUploadRequestExecutor<H, P> implements RequestExecutor<Boolean, File> {
protected RequestHttp<H, P> requestHttp;

public VoiceUploadRequestExecutor(RequestHttp requestHttp) {
this.requestHttp = requestHttp;
}

public static RequestExecutor<Boolean, File> create(RequestHttp requestHttp) {
switch (requestHttp.getRequestType()) {
case APACHE_HTTP:
return new VoiceUploadApacheHttpRequestExecutor(requestHttp);
case JODD_HTTP:
case OK_HTTP:
default:
return null;
}
}

}
Loading