| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702 |
- package com.izouma.weixin.wxpay;
- import java.util.HashMap;
- import java.util.Map;
- public class WXPay {
- private WXPayConfig config;
- private WXPayConstants.SignType signType;
- private boolean autoReport;
- private boolean useSandbox;
- private String notifyUrl;
- private WXPayRequest wxPayRequest;
- public WXPay(final WXPayConfig config) throws Exception {
- this(config, null, true, false);
- }
- // 新增的构造方法
- public WXPay(final WXPayConfig config, WXPayConstants.SignType signType) throws Exception {
- this(config, null, true, false, signType);
- }
- // 新增的构造方法
- public WXPay(final WXPayConfig config, final String notifyUrl,
- final boolean autoReport, final boolean useSandbox,
- WXPayConstants.SignType signType) throws Exception {
- this.config = config;
- this.notifyUrl = notifyUrl;
- this.autoReport = autoReport;
- this.useSandbox = useSandbox;
- this.signType = signType;
- this.wxPayRequest = new WXPayRequest(config);
- }
- public WXPay(final WXPayConfig config, final boolean autoReport) throws Exception {
- this(config, null, autoReport, false);
- }
- public WXPay(final WXPayConfig config, final boolean autoReport, final boolean useSandbox) throws Exception {
- this(config, null, autoReport, useSandbox);
- }
- public WXPay(final WXPayConfig config, final String notifyUrl) throws Exception {
- this(config, notifyUrl, true, false);
- }
- public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport) throws Exception {
- this(config, notifyUrl, autoReport, false);
- }
- public WXPay(final WXPayConfig config, final String notifyUrl, final boolean autoReport, final boolean useSandbox) throws Exception {
- this.config = config;
- this.notifyUrl = notifyUrl;
- this.autoReport = autoReport;
- this.useSandbox = useSandbox;
- if (useSandbox) {
- this.signType = WXPayConstants.SignType.MD5; // 沙箱环境
- } else {
- this.signType = WXPayConstants.SignType.HMACSHA256;
- }
- this.wxPayRequest = new WXPayRequest(config);
- }
- private void checkWXPayConfig() throws Exception {
- if (this.config == null) {
- throw new Exception("config is null");
- }
- if (this.config.getAppID() == null || this.config.getAppID().trim().length() == 0) {
- throw new Exception("appid in config is empty");
- }
- if (this.config.getMchID() == null || this.config.getMchID().trim().length() == 0) {
- throw new Exception("appid in config is empty");
- }
- if (this.config.getCertStream() == null) {
- throw new Exception("cert stream in config is empty");
- }
- if (this.config.getWXPayDomain() == null) {
- throw new Exception("config.getWXPayDomain() is null");
- }
- if (this.config.getHttpConnectTimeoutMs() < 10) {
- throw new Exception("http connect timeout is too small");
- }
- if (this.config.getHttpReadTimeoutMs() < 10) {
- throw new Exception("http read timeout is too small");
- }
- }
- /**
- * 向 Map 中添加 appid、mch_id、nonce_str、sign_type、sign <br>
- * 该函数适用于商户适用于统一下单等接口,不适用于红包、代金券接口
- *
- * @param reqData
- * @return
- * @throws Exception
- */
- public Map<String, String> fillRequestData(Map<String, String> reqData) throws Exception {
- reqData.put("appid", config.getAppID());
- reqData.put("mch_id", config.getMchID());
- reqData.put("nonce_str", WXPayUtil.generateNonceStr());
- if (WXPayConstants.SignType.MD5.equals(this.signType)) {
- reqData.put("sign_type", WXPayConstants.MD5);
- } else if (WXPayConstants.SignType.HMACSHA256.equals(this.signType)) {
- reqData.put("sign_type", WXPayConstants.HMACSHA256);
- }
- reqData.put("sign", WXPayUtil.generateSignature(reqData, config.getKey(), this.signType));
- return reqData;
- }
- /**
- * 判断xml数据的sign是否有效,必须包含sign字段,否则返回false。
- *
- * @param reqData 向wxpay post的请求数据
- * @return 签名是否有效
- * @throws Exception
- */
- public boolean isResponseSignatureValid(Map<String, String> reqData) throws Exception {
- // 返回数据的签名方式和请求中给定的签名方式是一致的
- return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), this.signType);
- }
- /**
- * 判断支付结果通知中的sign是否有效
- *
- * @param reqData 向wxpay post的请求数据
- * @return 签名是否有效
- * @throws Exception
- */
- public boolean isPayResultNotifySignatureValid(Map<String, String> reqData) throws Exception {
- String signTypeInData = reqData.get(WXPayConstants.FIELD_SIGN_TYPE);
- WXPayConstants.SignType signType;
- if (signTypeInData == null) {
- //signType = WXPayConstants.SignType.MD5;
- signType = this.signType;//修改为默认类型
- } else {
- signTypeInData = signTypeInData.trim();
- if (signTypeInData.length() == 0) {
- signType = WXPayConstants.SignType.MD5;
- } else if (WXPayConstants.MD5.equals(signTypeInData)) {
- signType = WXPayConstants.SignType.MD5;
- } else if (WXPayConstants.HMACSHA256.equals(signTypeInData)) {
- signType = WXPayConstants.SignType.HMACSHA256;
- } else {
- throw new Exception(String.format("Unsupported sign_type: %s", signTypeInData));
- }
- }
- return WXPayUtil.isSignatureValid(reqData, this.config.getKey(), signType);
- }
- /**
- * 不需要证书的请求
- *
- * @param urlSuffix String
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 超时时间,单位是毫秒
- * @param readTimeoutMs 超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public String requestWithoutCert(String urlSuffix, Map<String, String> reqData,
- int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String msgUUID = reqData.get("nonce_str");
- String reqBody = WXPayUtil.mapToXml(reqData);
- String resp = this.wxPayRequest.requestWithoutCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, autoReport);
- return resp;
- }
- /**
- * 需要证书的请求
- *
- * @param urlSuffix String
- * @param reqData 向wxpay post的请求数据 Map
- * @param connectTimeoutMs 超时时间,单位是毫秒
- * @param readTimeoutMs 超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public String requestWithCert(String urlSuffix, Map<String, String> reqData,
- int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String msgUUID = reqData.get("nonce_str");
- String reqBody = WXPayUtil.mapToXml(reqData);
- String resp = this.wxPayRequest.requestWithCert(urlSuffix, msgUUID, reqBody, connectTimeoutMs, readTimeoutMs, this.autoReport);
- return resp;
- }
- /**
- * 处理 HTTPS API返回数据,转换成Map对象。return_code为SUCCESS时,验证签名。
- *
- * @param xmlStr API返回的XML格式数据
- * @return Map类型数据
- * @throws Exception
- */
- public Map<String, String> processResponseXml(String xmlStr) throws Exception {
- String RETURN_CODE = "return_code";
- String return_code;
- Map<String, String> respData = WXPayUtil.xmlToMap(xmlStr);
- if (respData.containsKey(RETURN_CODE)) {
- return_code = respData.get(RETURN_CODE);
- } else {
- throw new Exception(String.format("No `return_code` in XML: %s", xmlStr));
- }
- if (return_code.equals(WXPayConstants.FAIL)) {
- return respData;
- } else if (return_code.equals(WXPayConstants.SUCCESS)) {
- if (this.isResponseSignatureValid(respData)) {
- return respData;
- } else {
- throw new Exception(String.format("Invalid sign value in XML: %s", xmlStr));
- }
- } else {
- throw new Exception(String.format("return_code value %s is invalid in XML: %s", return_code, xmlStr));
- }
- }
- /**
- * 作用:提交刷卡支付<br>
- * 场景:刷卡支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> microPay(Map<String, String> reqData) throws Exception {
- return this.microPay(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:提交刷卡支付<br>
- * 场景:刷卡支付
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> microPay(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_MICROPAY_URL_SUFFIX;
- } else {
- url = WXPayConstants.MICROPAY_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 提交刷卡支付,针对软POS,尽可能做成功
- * 内置重试机制,最多60s
- *
- * @param reqData
- * @return
- * @throws Exception
- */
- public Map<String, String> microPayWithPos(Map<String, String> reqData) throws Exception {
- return this.microPayWithPos(reqData, this.config.getHttpConnectTimeoutMs());
- }
- /**
- * 提交刷卡支付,针对软POS,尽可能做成功
- * 内置重试机制,最多60s
- *
- * @param reqData
- * @param connectTimeoutMs
- * @return
- * @throws Exception
- */
- public Map<String, String> microPayWithPos(Map<String, String> reqData, int connectTimeoutMs) throws Exception {
- int remainingTimeMs = 60 * 1000;
- long startTimestampMs = 0;
- Map<String, String> lastResult = null;
- Exception lastException = null;
- while (true) {
- startTimestampMs = WXPayUtil.getCurrentTimestampMs();
- int readTimeoutMs = remainingTimeMs - connectTimeoutMs;
- if (readTimeoutMs > 1000) {
- try {
- lastResult = this.microPay(reqData, connectTimeoutMs, readTimeoutMs);
- String returnCode = lastResult.get("return_code");
- if (returnCode.equals("SUCCESS")) {
- String resultCode = lastResult.get("result_code");
- String errCode = lastResult.get("err_code");
- if (resultCode.equals("SUCCESS")) {
- break;
- } else {
- // 看错误码,若支付结果未知,则重试提交刷卡支付
- if (errCode.equals("SYSTEMERROR") || errCode.equals("BANKERROR") || errCode.equals("USERPAYING")) {
- remainingTimeMs = remainingTimeMs - (int) (WXPayUtil.getCurrentTimestampMs() - startTimestampMs);
- if (remainingTimeMs <= 100) {
- break;
- } else {
- WXPayUtil.getLogger().info("microPayWithPos: try micropay again");
- if (remainingTimeMs > 5 * 1000) {
- Thread.sleep(5 * 1000);
- } else {
- Thread.sleep(1 * 1000);
- }
- continue;
- }
- } else {
- break;
- }
- }
- } else {
- break;
- }
- } catch (Exception ex) {
- lastResult = null;
- lastException = ex;
- }
- } else {
- break;
- }
- }
- if (lastResult == null) {
- throw lastException;
- } else {
- return lastResult;
- }
- }
- /**
- * 作用:统一下单<br>
- * 场景:公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> unifiedOrder(Map<String, String> reqData) throws Exception {
- return this.unifiedOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:统一下单<br>
- * 场景:公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> unifiedOrder(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_UNIFIEDORDER_URL_SUFFIX;
- } else {
- url = WXPayConstants.UNIFIEDORDER_URL_SUFFIX;
- }
- if (this.notifyUrl != null) {
- reqData.put("notify_url", this.notifyUrl);
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:查询订单<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> orderQuery(Map<String, String> reqData) throws Exception {
- return this.orderQuery(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:查询订单<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据 int
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> orderQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_ORDERQUERY_URL_SUFFIX;
- } else {
- url = WXPayConstants.ORDERQUERY_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:撤销订单<br>
- * 场景:刷卡支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> reverse(Map<String, String> reqData) throws Exception {
- return this.reverse(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:撤销订单<br>
- * 场景:刷卡支付<br>
- * 其他:需要证书
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> reverse(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_REVERSE_URL_SUFFIX;
- } else {
- url = WXPayConstants.REVERSE_URL_SUFFIX;
- }
- String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:关闭订单<br>
- * 场景:公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> closeOrder(Map<String, String> reqData) throws Exception {
- return this.closeOrder(reqData, config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:关闭订单<br>
- * 场景:公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> closeOrder(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_CLOSEORDER_URL_SUFFIX;
- } else {
- url = WXPayConstants.CLOSEORDER_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:申请退款<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> refund(Map<String, String> reqData) throws Exception {
- return this.refund(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:申请退款<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
- * 其他:需要证书
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> refund(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_REFUND_URL_SUFFIX;
- } else {
- url = WXPayConstants.REFUND_URL_SUFFIX;
- }
- String respXml = this.requestWithCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:退款查询<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> refundQuery(Map<String, String> reqData) throws Exception {
- return this.refundQuery(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:退款查询<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> refundQuery(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_REFUNDQUERY_URL_SUFFIX;
- } else {
- url = WXPayConstants.REFUNDQUERY_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:对账单下载(成功时返回对账单数据,失败时返回XML格式数据)<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> downloadBill(Map<String, String> reqData) throws Exception {
- return this.downloadBill(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:对账单下载<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付<br>
- * 其他:无论是否成功都返回Map。若成功,返回的Map中含有return_code、return_msg、data,
- * 其中return_code为`SUCCESS`,data为对账单数据。
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return 经过封装的API返回数据
- * @throws Exception
- */
- public Map<String, String> downloadBill(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_DOWNLOADBILL_URL_SUFFIX;
- } else {
- url = WXPayConstants.DOWNLOADBILL_URL_SUFFIX;
- }
- String respStr = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs).trim();
- Map<String, String> ret;
- // 出现错误,返回XML数据
- if (respStr.indexOf("<") == 0) {
- ret = WXPayUtil.xmlToMap(respStr);
- } else {
- // 正常返回csv数据
- ret = new HashMap<String, String>();
- ret.put("return_code", WXPayConstants.SUCCESS);
- ret.put("return_msg", "ok");
- ret.put("data", respStr);
- }
- return ret;
- }
- /**
- * 作用:交易保障<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> report(Map<String, String> reqData) throws Exception {
- return this.report(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:交易保障<br>
- * 场景:刷卡支付、公共号支付、扫码支付、APP支付
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> report(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_REPORT_URL_SUFFIX;
- } else {
- url = WXPayConstants.REPORT_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return WXPayUtil.xmlToMap(respXml);
- }
- /**
- * 作用:转换短链接<br>
- * 场景:刷卡支付、扫码支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> shortUrl(Map<String, String> reqData) throws Exception {
- return this.shortUrl(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:转换短链接<br>
- * 场景:刷卡支付、扫码支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> shortUrl(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_SHORTURL_URL_SUFFIX;
- } else {
- url = WXPayConstants.SHORTURL_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- /**
- * 作用:授权码查询OPENID接口<br>
- * 场景:刷卡支付
- *
- * @param reqData 向wxpay post的请求数据
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> authCodeToOpenid(Map<String, String> reqData) throws Exception {
- return this.authCodeToOpenid(reqData, this.config.getHttpConnectTimeoutMs(), this.config.getHttpReadTimeoutMs());
- }
- /**
- * 作用:授权码查询OPENID接口<br>
- * 场景:刷卡支付
- *
- * @param reqData 向wxpay post的请求数据
- * @param connectTimeoutMs 连接超时时间,单位是毫秒
- * @param readTimeoutMs 读超时时间,单位是毫秒
- * @return API返回数据
- * @throws Exception
- */
- public Map<String, String> authCodeToOpenid(Map<String, String> reqData, int connectTimeoutMs, int readTimeoutMs) throws Exception {
- String url;
- if (this.useSandbox) {
- url = WXPayConstants.SANDBOX_AUTHCODETOOPENID_URL_SUFFIX;
- } else {
- url = WXPayConstants.AUTHCODETOOPENID_URL_SUFFIX;
- }
- String respXml = this.requestWithoutCert(url, this.fillRequestData(reqData), connectTimeoutMs, readTimeoutMs);
- return this.processResponseXml(respXml);
- }
- } // end class
|