From 0eccfb6a822b5788b3e0f1aa95fcc8ea2b3a3fe7 Mon Sep 17 00:00:00 2001 From: Binary Wang Date: Sat, 12 Jan 2019 19:53:11 +0800 Subject: [PATCH] =?UTF-8?q?#895=20=E5=B0=8F=E7=A8=8B=E5=BA=8F=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=94=A8=E6=88=B7=E6=94=AF=E4=BB=98=E5=AE=8C=E8=8E=B7?= =?UTF-8?q?=E5=8F=96UnionId=E7=9A=84=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wx/miniapp/api/WxMaService.java | 23 ++++++++++++ .../wx/miniapp/api/impl/WxMaServiceImpl.java | 35 +++++++++++++++++-- .../miniapp/api/impl/WxMaServiceImplTest.java | 8 +++-- 3 files changed, 62 insertions(+), 4 deletions(-) diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java index efa53939..578acc56 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/WxMaService.java @@ -17,6 +17,10 @@ public interface WxMaService { String GET_ACCESS_TOKEN_URL = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s"; String JSCODE_TO_SESSION_URL = "https://api.weixin.qq.com/sns/jscode2session"; + /** + * getPaidUnionId + */ + String GET_PAID_UNION_ID_URL = "https://api.weixin.qq.com/wxa/getpaidunionid"; /** * 获取登录后的session信息. @@ -56,6 +60,22 @@ public interface WxMaService { */ String getAccessToken(boolean forceRefresh) throws WxErrorException; + /** + *
+   * 用户支付完成后,获取该用户的 UnionId,无需用户授权。本接口支持第三方平台代理查询。
+   *
+   * 注意:调用前需要用户完成支付,且在支付后的五分钟内有效。
+   * 请求地址: GET https://api.weixin.qq.com/wxa/getpaidunionid?access_token=ACCESS_TOKEN&openid=OPENID
+   * 文档地址:https://developers.weixin.qq.com/miniprogram/dev/api/getPaidUnionId.html
+   * 
+ * + * @param openid 必填 支付用户唯一标识 + * @param transactionId 非必填 微信支付订单号 + * @param mchId 非必填 微信支付分配的商户号,和商户订单号配合使用 + * @param outTradeNo 非必填 微信支付商户订单号,和商户号配合使用 + */ + String getPaidUnionId(String openid, String transactionId, String mchId, String outTradeNo) throws WxErrorException; + /** * 当本Service没有实现某个API的时候,可以用这个,针对所有微信API中的GET请求. */ @@ -168,18 +188,21 @@ public interface WxMaService { /** * 返回分享相关查询服务. + * * @return WxMaShareService */ WxMaShareService getShareService(); /** * 返回微信运动相关接口服务对象. + * * @return WxMaShareService */ WxMaRunService getRunService(); /** * 返回内容安全相关接口服务对象. + * * @return WxMaShareService */ WxMaSecCheckService getSecCheckService(); diff --git a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java index 280a052e..a12fa1fe 100644 --- a/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java +++ b/weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java @@ -5,6 +5,7 @@ import java.util.HashMap; import java.util.Map; import java.util.concurrent.locks.Lock; +import org.apache.commons.lang3.StringUtils; import org.apache.http.HttpHost; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.methods.CloseableHttpResponse; @@ -29,7 +30,9 @@ import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult; import cn.binarywang.wx.miniapp.config.WxMaConfig; import com.google.common.base.Joiner; import com.google.gson.Gson; +import com.google.gson.JsonParser; import lombok.extern.slf4j.Slf4j; +import me.chanjar.weixin.common.WxType; import me.chanjar.weixin.common.bean.WxAccessToken; import me.chanjar.weixin.common.error.WxError; import me.chanjar.weixin.common.error.WxErrorException; @@ -50,6 +53,7 @@ import static cn.binarywang.wx.miniapp.constant.WxMaConstants.ErrorCode.*; */ @Slf4j public class WxMaServiceImpl implements WxMaService, RequestHttp { + private static final JsonParser JSON_PARSER = new JsonParser(); private CloseableHttpClient httpClient; private HttpHost httpProxy; private WxMaConfig wxMaConfig; @@ -150,6 +154,33 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp params = new HashMap<>(8); + params.put("openid", openid); + + if (StringUtils.isNotEmpty(transactionId)) { + params.put("transaction_id", transactionId); + } + + if (StringUtils.isNotEmpty(mchId)) { + params.put("mch_id", mchId); + } + + if (StringUtils.isNotEmpty(outTradeNo)) { + params.put("out_trade_no", outTradeNo); + } + + String responseContent = this.get(GET_PAID_UNION_ID_URL, Joiner.on("&").withKeyValueSeparator("=").join(params)); + WxError error = WxError.fromJson(responseContent, WxType.MiniApp); + if (error.getErrorCode() != 0) { + throw new WxErrorException(error); + } + + return JSON_PARSER.parse(responseContent).getAsJsonObject().get("unionid").getAsString(); + } + @Override public WxMaJscode2SessionResult jsCode2SessionInfo(String jsCode) throws WxErrorException { final WxMaConfig config = getWxMaConfig(); @@ -168,7 +199,7 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp