| @@ -170,6 +170,13 @@ public abstract class BaseWxPayRequest implements Serializable { | |||||
| */ | */ | ||||
| protected abstract void checkConstraints() throws WxPayException; | protected abstract void checkConstraints() throws WxPayException; | ||||
| /** | |||||
| * 是否需要nonce_str | |||||
| */ | |||||
| protected boolean needNonceStr() { | |||||
| return true; | |||||
| } | |||||
| /** | /** | ||||
| * 如果配置中已经设置,可以不设置值. | * 如果配置中已经设置,可以不设置值. | ||||
| * | * | ||||
| @@ -363,7 +370,7 @@ public abstract class BaseWxPayRequest implements Serializable { | |||||
| } | } | ||||
| } | } | ||||
| if (StringUtils.isBlank(getNonceStr())) { | |||||
| if (needNonceStr() && StringUtils.isBlank(getNonceStr())) { | |||||
| this.setNonceStr(String.valueOf(System.currentTimeMillis())); | this.setNonceStr(String.valueOf(System.currentTimeMillis())); | ||||
| } | } | ||||
| @@ -0,0 +1,61 @@ | |||||
| package com.github.binarywang.wxpay.bean.request; | |||||
| import com.github.binarywang.wxpay.exception.WxPayException; | |||||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||||
| import lombok.*; | |||||
| import lombok.experimental.Accessors; | |||||
| import java.util.Map; | |||||
| /** | |||||
| * 查询汇率请求. | |||||
| * | |||||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||||
| * @date 2020-05-23 | |||||
| */ | |||||
| @Data | |||||
| @EqualsAndHashCode(callSuper = true) | |||||
| @Builder | |||||
| @Accessors(chain = true) | |||||
| @NoArgsConstructor | |||||
| @AllArgsConstructor | |||||
| @XStreamAlias("xml") | |||||
| public class WxPayQueryExchangeRateRequest extends BaseWxPayRequest { | |||||
| private static final long serialVersionUID = -8796516942563060554L; | |||||
| /** | |||||
| * 币种 | |||||
| * fee_type | |||||
| * 是 | |||||
| * String(10) | |||||
| * USD | |||||
| * 外币币种 | |||||
| */ | |||||
| @XStreamAlias("fee_type") | |||||
| private String feeType; | |||||
| /** | |||||
| * 日期 | |||||
| * date | |||||
| * 是 | |||||
| * String(14) | |||||
| * 20150807 | |||||
| * 格式为yyyyMMdd,如2009年12月25日表示为20091225。时区为GMT+8 beijing | |||||
| */ | |||||
| @XStreamAlias("date") | |||||
| private String date; | |||||
| @Override | |||||
| protected void checkConstraints() throws WxPayException { | |||||
| } | |||||
| @Override | |||||
| protected void storeMap(Map<String, String> map) { | |||||
| } | |||||
| @Override | |||||
| protected boolean needNonceStr() { | |||||
| return false; | |||||
| } | |||||
| } | |||||
| @@ -0,0 +1,58 @@ | |||||
| package com.github.binarywang.wxpay.bean.result; | |||||
| import com.thoughtworks.xstream.annotations.XStreamAlias; | |||||
| import lombok.Data; | |||||
| import lombok.EqualsAndHashCode; | |||||
| import lombok.NoArgsConstructor; | |||||
| import org.w3c.dom.Document; | |||||
| /** | |||||
| * 汇率查询响应. | |||||
| * | |||||
| * @author <a href="https://github.com/binarywang">Binary Wang</a> | |||||
| * @date 2020-05-23 | |||||
| */ | |||||
| @Data | |||||
| @EqualsAndHashCode(callSuper = true) | |||||
| @NoArgsConstructor | |||||
| @XStreamAlias("xml") | |||||
| public class WxPayQueryExchangeRateResult extends BaseWxPayResult { | |||||
| private static final long serialVersionUID = 2269734222658532364L; | |||||
| /** | |||||
| * 币种 | |||||
| * fee_type | |||||
| * 是 | |||||
| * String(10) | |||||
| * SUCCESS 外币币种,详细请见参数规定 | |||||
| */ | |||||
| @XStreamAlias("fee_type") | |||||
| private String feeType; | |||||
| /** | |||||
| * 汇率时间 | |||||
| * rate_time | |||||
| * 是 | |||||
| * String(14) | |||||
| * 20150807131545 | |||||
| * 格式:yyyyMMddhhmmss | |||||
| */ | |||||
| @XStreamAlias("rate_time") | |||||
| private String rateTime; | |||||
| /** | |||||
| * 现汇卖出价 | |||||
| * rate | |||||
| * 是 | |||||
| * String(15) | |||||
| * 系统错误 | |||||
| * 外币标准单位乘以100折算为人民币的金额,保留4位小数(如:100美元按当时汇率折算返回的先汇卖出价是628.2100) | |||||
| */ | |||||
| @XStreamAlias("rate") | |||||
| private String rate; | |||||
| @Override | |||||
| protected void loadXML(Document d) { | |||||
| } | |||||
| } | |||||
| @@ -65,12 +65,10 @@ public interface WxPayService { | |||||
| */ | */ | ||||
| String postV3(String url, String requestStr) throws WxPayException; | String postV3(String url, String requestStr) throws WxPayException; | ||||
| /** | /** | ||||
| * 发送get V3请求,得到响应字符串. | * 发送get V3请求,得到响应字符串. | ||||
| * | * | ||||
| * @param url 请求地址 | |||||
| * @param param 请求信息 | |||||
| * @param url 请求地址 | |||||
| * @return 返回请求结果字符串 string | * @return 返回请求结果字符串 string | ||||
| * @throws WxPayException the wx pay exception | * @throws WxPayException the wx pay exception | ||||
| */ | */ | ||||
| @@ -200,11 +198,11 @@ public interface WxPayService { | |||||
| /** | /** | ||||
| * 调用统一下单接口,并组装生成支付所需参数对象. | * 调用统一下单接口,并组装生成支付所需参数对象. | ||||
| * | * | ||||
| * @see WxPayService#createOrder(WxPayUnifiedOrderRequest) | |||||
| * @param specificTradeType 将使用的交易方式,不能为 null | * @param specificTradeType 将使用的交易方式,不能为 null | ||||
| * @param request 统一下单请求参数,设定的 tradeType 及配置里的 tradeType 将被忽略,转而使用 specificTradeType | |||||
| * @param request 统一下单请求参数,设定的 tradeType 及配置里的 tradeType 将被忽略,转而使用 specificTradeType | |||||
| * @return 返回 {@link WxPayConstants.TradeType.Specific} 指定的类 | * @return 返回 {@link WxPayConstants.TradeType.Specific} 指定的类 | ||||
| * @throws WxPayException the wx pay exception | * @throws WxPayException the wx pay exception | ||||
| * @see WxPayService#createOrder(WxPayUnifiedOrderRequest) | |||||
| */ | */ | ||||
| <T> T createOrder(WxPayConstants.TradeType.Specific<T> specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException; | <T> T createOrder(WxPayConstants.TradeType.Specific<T> specificTradeType, WxPayUnifiedOrderRequest request) throws WxPayException; | ||||
| @@ -759,5 +757,18 @@ public interface WxPayService { | |||||
| */ | */ | ||||
| WxPayFacepayResult facepay(WxPayFacepayRequest request) throws WxPayException; | WxPayFacepayResult facepay(WxPayFacepayRequest request) throws WxPayException; | ||||
| /** | |||||
| * 查询汇率 | |||||
| * <pre> | |||||
| * 应用场景:商户网站的商品以外币标价时,通过该接口可以实时查询到微信使用的转换汇率。汇率更新时间为北京时间上午10:00,一天更新一次。 | |||||
| * 文档地址:https://pay.weixin.qq.com/wiki/doc/api/app/app_jw.php?chapter=9_15&index=12 | |||||
| * 接口链接:https://api.mch.weixin.qq.com/pay/queryexchagerate | |||||
| * </pre> | |||||
| * | |||||
| * @param feeType 外币币种 | |||||
| * @param date 日期,格式为yyyyMMdd,如2009年12月25日表示为20091225。时区为GMT+8 beijing | |||||
| * @return . | |||||
| * @throws WxPayException . | |||||
| */ | |||||
| WxPayQueryExchangeRateResult queryExchangeRate(String feeType, String date) throws WxPayException; | |||||
| } | } | ||||
| @@ -831,4 +831,18 @@ public abstract class BaseWxPayServiceImpl implements WxPayService { | |||||
| return result; | return result; | ||||
| } | } | ||||
| @Override | |||||
| public WxPayQueryExchangeRateResult queryExchangeRate(String feeType, String date) throws WxPayException { | |||||
| WxPayQueryExchangeRateRequest request = new WxPayQueryExchangeRateRequest(); | |||||
| request.setFeeType(feeType); | |||||
| request.setDate(date); | |||||
| request.checkAndSign(this.getConfig()); | |||||
| String url = this.getPayBaseUrl() + "/pay/queryexchagerate"; | |||||
| String responseContent = this.post(url, request.toXML(), false); | |||||
| WxPayQueryExchangeRateResult result = BaseWxPayResult.fromXML(responseContent, WxPayQueryExchangeRateResult.class); | |||||
| result.checkResult(this, request.getSignType(), true); | |||||
| return result; | |||||
| } | |||||
| } | } | ||||
| @@ -626,7 +626,8 @@ public class BaseWxPayServiceImplTest { | |||||
| } | } | ||||
| @Test | @Test | ||||
| public void testFacepay() { | |||||
| public void testFacepay() throws WxPayException { | |||||
| final WxPayFacepayResult result = this.payService.facepay(WxPayFacepayRequest.newBuilder().build()); | |||||
| } | } | ||||
| @Test | @Test | ||||
| @@ -673,4 +674,16 @@ public class BaseWxPayServiceImplTest { | |||||
| @Test | @Test | ||||
| public void testTestQueryRedpack() { | public void testTestQueryRedpack() { | ||||
| } | } | ||||
| @Test | |||||
| public void testGetPayScoreService() { | |||||
| // no need to test | |||||
| } | |||||
| @Test | |||||
| public void testQueryExchangeRate() throws WxPayException { | |||||
| final WxPayQueryExchangeRateResult result = this.payService.queryExchangeRate("USD", "20200425"); | |||||
| assertThat(result).isNotNull(); | |||||
| System.out.println(result); | |||||
| } | |||||
| } | } | ||||