Browse Source

:new: #1532 微信支付模块增加汇率查询的接口

Binary Wang 5 years ago
parent
commit
06c8ae81d2

+ 8 - 1
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java

@@ -171,6 +171,13 @@ public abstract class BaseWxPayRequest implements Serializable {
   protected abstract void checkConstraints() throws WxPayException;
 
   /**
+   * 是否需要nonce_str
+   */
+  protected boolean needNonceStr() {
+    return true;
+  }
+
+  /**
    * 如果配置中已经设置,可以不设置值.
    *
    * @param appid 微信公众号appid
@@ -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()));
     }
 

+ 61 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayQueryExchangeRateRequest.java

@@ -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;
+  }
+}

+ 58 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java

@@ -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) {
+
+  }
+}

+ 17 - 6
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java

@@ -65,12 +65,10 @@ public interface WxPayService {
    */
   String postV3(String url, String requestStr) throws WxPayException;
 
-
   /**
    * 发送get V3请求,得到响应字符串.
    *
-   * @param url        请求地址
-   * @param param 请求信息
+   * @param url 请求地址
    * @return 返回请求结果字符串 string
    * @throws WxPayException the wx pay exception
    */
@@ -200,11 +198,11 @@ public interface WxPayService {
   /**
    * 调用统一下单接口,并组装生成支付所需参数对象.
    *
-   * @see WxPayService#createOrder(WxPayUnifiedOrderRequest)
    * @param specificTradeType 将使用的交易方式,不能为 null
-   * @param request 统一下单请求参数,设定的 tradeType 及配置里的 tradeType 将被忽略,转而使用 specificTradeType
+   * @param request           统一下单请求参数,设定的 tradeType 及配置里的 tradeType 将被忽略,转而使用 specificTradeType
    * @return 返回 {@link WxPayConstants.TradeType.Specific} 指定的类
    * @throws WxPayException the wx pay exception
+   * @see WxPayService#createOrder(WxPayUnifiedOrderRequest)
    */
   <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;
 
-
+  /**
+   * 查询汇率
+   * <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;
 }

+ 14 - 0
weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java

@@ -831,4 +831,18 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
     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;
+  }
 }

+ 14 - 1
weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java

@@ -626,7 +626,8 @@ public class BaseWxPayServiceImplTest {
   }
 
   @Test
-  public void testFacepay() {
+  public void testFacepay() throws WxPayException {
+    final WxPayFacepayResult result = this.payService.facepay(WxPayFacepayRequest.newBuilder().build());
   }
 
   @Test
@@ -673,4 +674,16 @@ public class BaseWxPayServiceImplTest {
   @Test
   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);
+  }
 }