Browse Source

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

dev1
Binary Wang 4 years ago
parent
commit
06c8ae81d2
6 changed files with 172 additions and 8 deletions
  1. +8
    -1
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/BaseWxPayRequest.java
  2. +61
    -0
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayQueryExchangeRateRequest.java
  3. +58
    -0
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayQueryExchangeRateResult.java
  4. +17
    -6
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java
  5. +14
    -0
      weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java
  6. +14
    -1
      weixin-java-pay/src/test/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImplTest.java

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

@@ -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()));
} }




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

@@ -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 View File

@@ -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 View File

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

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

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

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

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

Loading…
Cancel
Save