增加新的统一下单接口,并添加对接口格式的单元测试,并未对实际功能进行测试

This commit is contained in:
BinaryWang
2016-09-26 12:34:37 +08:00
parent c4838295e5
commit 839ecadaa7
10 changed files with 1090 additions and 367 deletions

View File

@@ -6,10 +6,11 @@ import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
import me.chanjar.weixin.mp.bean.pay.WxMpPrepayIdResult;
import me.chanjar.weixin.mp.bean.pay.WxRedpackResult;
import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest;
import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest;
import me.chanjar.weixin.mp.bean.result.WxMpPrepayIdResult;
import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult;
/**
* 微信支付相关接口
@@ -48,9 +49,11 @@ public interface WxMpPayService {
* 统一下单(详见http://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=9_1)
* 在发起微信支付前,需要调用统一下单接口,获取"预支付交易会话标识"
* 接口地址https://api.mch.weixin.qq.com/pay/unifiedorder
* @throws WxErrorException
*
*/
WxMpPrepayIdResult unifiedOrder(WxUnifiedOrderRequest request);
WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request)
throws WxErrorException;
/**
* 该接口调用“统一下单”接口,并拼装发起支付请求需要的参数

View File

@@ -3,6 +3,7 @@ package me.chanjar.weixin.mp.api.impl;
import java.io.IOException;
import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.SortedMap;
@@ -20,10 +21,12 @@ import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.slf4j.helpers.MessageFormatter;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.thoughtworks.xstream.XStream;
import com.thoughtworks.xstream.annotations.XStreamAlias;
import me.chanjar.weixin.common.annotation.Required;
import me.chanjar.weixin.common.bean.result.WxError;
import me.chanjar.weixin.common.exception.WxErrorException;
import me.chanjar.weixin.common.util.http.Utf8ResponseHandler;
@@ -32,9 +35,11 @@ import me.chanjar.weixin.mp.api.WxMpPayService;
import me.chanjar.weixin.mp.bean.pay.WxMpPayCallback;
import me.chanjar.weixin.mp.bean.pay.WxMpPayRefundResult;
import me.chanjar.weixin.mp.bean.pay.WxMpPayResult;
import me.chanjar.weixin.mp.bean.pay.WxMpPrepayIdResult;
import me.chanjar.weixin.mp.bean.pay.WxRedpackResult;
import me.chanjar.weixin.mp.bean.pay.WxSendRedpackRequest;
import me.chanjar.weixin.mp.bean.result.WxMpPrepayIdResult;
import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderRequest;
import me.chanjar.weixin.mp.bean.pay.WxUnifiedOrderResult;
/**
* Created by Binary Wang on 2016/7/28.
@@ -43,10 +48,12 @@ import me.chanjar.weixin.mp.bean.result.WxMpPrepayIdResult;
*/
public class WxMpPayServiceImpl implements WxMpPayService {
private static final List<String> TRADE_TYPES = Lists.newArrayList("JSAPI",
"NATIVE", "APP");
private final Logger log = LoggerFactory.getLogger(WxMpPayServiceImpl.class);
private final String[] REQUIRED_ORDER_PARAMETERS = new String[]{"appid",
"mch_id", "body", "out_trade_no", "total_fee", "spbill_create_ip",
"notify_url", "trade_type"};
private final String[] REQUIRED_ORDER_PARAMETERS = new String[] { "appid",
"mch_id", "body", "out_trade_no", "total_fee", "spbill_create_ip",
"notify_url", "trade_type" };
private HttpHost httpProxy;
private WxMpServiceImpl wxMpService;
@@ -58,13 +65,13 @@ public class WxMpPayServiceImpl implements WxMpPayService {
@Override
@Deprecated
public WxMpPrepayIdResult getPrepayId(String openId, String outTradeNo,
double amt, String body, String tradeType, String ip,
String callbackUrl) {
double amt, String body, String tradeType, String ip,
String callbackUrl) {
Map<String, String> packageParams = new HashMap<>();
packageParams.put("appid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
packageParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
packageParams.put("body", body);
packageParams.put("out_trade_no", outTradeNo);
packageParams.put("total_fee", (int) (amt * 100) + "");
@@ -77,47 +84,48 @@ public class WxMpPayServiceImpl implements WxMpPayService {
}
@Override
@Deprecated
public WxMpPrepayIdResult getPrepayId(final Map<String, String> parameters) {
final SortedMap<String, String> packageParams = new TreeMap<>(parameters);
packageParams.put("appid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
packageParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
packageParams.put("nonce_str", System.currentTimeMillis() + "");
checkParameters(packageParams);
String sign = this.createSign(packageParams,
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
packageParams.put("sign", sign);
StringBuilder request = new StringBuilder("<xml>");
for (Map.Entry<String, String> para : packageParams.entrySet()) {
request.append(String.format("<%s>%s</%s>", para.getKey(),
para.getValue(), para.getKey()));
para.getValue(), para.getKey()));
}
request.append("</xml>");
HttpPost httpPost = new HttpPost(
"https://api.mch.weixin.qq.com/pay/unifiedorder");
"https://api.mch.weixin.qq.com/pay/unifiedorder");
if (this.httpProxy != null) {
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
.build();
.build();
httpPost.setConfig(config);
}
StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
httpPost.setEntity(entity);
try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
.execute(httpPost)) {
.execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE
.handleResponse(response);
.handleResponse(response);
XStream xstream = XStreamInitializer.getInstance();
xstream.alias("xml", WxMpPrepayIdResult.class);
return (WxMpPrepayIdResult) xstream.fromXML(responseContent);
} catch (IOException e) {
throw new RuntimeException("Failed to get prepay id due to IO exception.",
e);
e);
} finally {
httpPost.releaseConnection();
}
@@ -127,33 +135,33 @@ public class WxMpPayServiceImpl implements WxMpPayService {
for (String para : this.REQUIRED_ORDER_PARAMETERS) {
if (!parameters.containsKey(para)) {
throw new IllegalArgumentException(
"Reqiured argument '" + para + "' is missing.");
"Reqiured argument '" + para + "' is missing.");
}
}
if ("JSAPI".equals(parameters.get("trade_type"))
&& !parameters.containsKey("openid")) {
&& !parameters.containsKey("openid")) {
throw new IllegalArgumentException(
"Reqiured argument 'openid' is missing when trade_type is 'JSAPI'.");
"Reqiured argument 'openid' is missing when trade_type is 'JSAPI'.");
}
if ("NATIVE".equals(parameters.get("trade_type"))
&& !parameters.containsKey("product_id")) {
&& !parameters.containsKey("product_id")) {
throw new IllegalArgumentException(
"Reqiured argument 'product_id' is missing when trade_type is 'NATIVE'.");
"Reqiured argument 'product_id' is missing when trade_type is 'NATIVE'.");
}
}
@Override
@Deprecated
public Map<String, String> getJsapiPayInfo(String openId, String outTradeNo,
double amt, String body, String ip, String callbackUrl)
throws WxErrorException {
double amt, String body, String ip, String callbackUrl)
throws WxErrorException {
Map<String, String> packageParams = new HashMap<>();
packageParams.put("appid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
packageParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
packageParams.put("body", body);
packageParams.put("out_trade_no", outTradeNo);
packageParams.put("total_fee", (int) (amt * 100) + "");
@@ -168,13 +176,13 @@ public class WxMpPayServiceImpl implements WxMpPayService {
@Override
@Deprecated
public Map<String, String> getNativePayInfo(String productId,
String outTradeNo, double amt, String body, String ip, String callbackUrl)
throws WxErrorException {
String outTradeNo, double amt, String body, String ip, String callbackUrl)
throws WxErrorException {
Map<String, String> packageParams = new HashMap<>();
packageParams.put("appid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
packageParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
packageParams.put("body", body);
packageParams.put("out_trade_no", outTradeNo);
packageParams.put("total_fee", (int) (amt * 100) + "");
@@ -188,27 +196,27 @@ public class WxMpPayServiceImpl implements WxMpPayService {
@Override
public Map<String, String> getPayInfo(Map<String, String> parameters)
throws WxErrorException {
throws WxErrorException {
WxMpPrepayIdResult wxMpPrepayIdResult = getPrepayId(parameters);
if (!"SUCCESS".equalsIgnoreCase(wxMpPrepayIdResult.getReturn_code())
|| !"SUCCESS".equalsIgnoreCase(wxMpPrepayIdResult.getResult_code())) {
|| !"SUCCESS".equalsIgnoreCase(wxMpPrepayIdResult.getResult_code())) {
WxError error = new WxError();
error.setErrorCode(-1);
error.setErrorMsg("return_code:" + wxMpPrepayIdResult.getReturn_code()
+ ";return_msg:" + wxMpPrepayIdResult.getReturn_msg()
+ ";result_code:" + wxMpPrepayIdResult.getResult_code() + ";err_code"
+ wxMpPrepayIdResult.getErr_code() + ";err_code_des"
+ wxMpPrepayIdResult.getErr_code_des());
+ ";return_msg:" + wxMpPrepayIdResult.getReturn_msg()
+ ";result_code:" + wxMpPrepayIdResult.getResult_code() + ";err_code"
+ wxMpPrepayIdResult.getErr_code() + ";err_code_des"
+ wxMpPrepayIdResult.getErr_code_des());
throw new WxErrorException(error);
}
String prepayId = wxMpPrepayIdResult.getPrepay_id();
if (prepayId == null || prepayId.equals("")) {
throw new RuntimeException(
String.format("Failed to get prepay id due to error code '%s'(%s).",
wxMpPrepayIdResult.getErr_code(),
wxMpPrepayIdResult.getErr_code_des()));
String.format("Failed to get prepay id due to error code '%s'(%s).",
wxMpPrepayIdResult.getErr_code(),
wxMpPrepayIdResult.getErr_code_des()));
}
Map<String, String> payInfo = new HashMap<>();
@@ -223,21 +231,21 @@ public class WxMpPayServiceImpl implements WxMpPayService {
}
String finalSign = this.createSign(payInfo,
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
payInfo.put("paySign", finalSign);
return payInfo;
}
@Override
public WxMpPayResult getJSSDKPayResult(String transactionId,
String outTradeNo) {
String outTradeNo) {
String nonce_str = System.currentTimeMillis() + "";
SortedMap<String, String> packageParams = new TreeMap<>();
packageParams.put("appid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
packageParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
if (transactionId != null && !"".equals(transactionId.trim())) {
packageParams.put("transaction_id", transactionId);
@@ -245,40 +253,40 @@ public class WxMpPayServiceImpl implements WxMpPayService {
packageParams.put("out_trade_no", outTradeNo);
} else {
throw new IllegalArgumentException(
"Either 'transactionId' or 'outTradeNo' must be given.");
"Either 'transactionId' or 'outTradeNo' must be given.");
}
packageParams.put("nonce_str", nonce_str);
packageParams.put("sign", this.createSign(packageParams,
this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
StringBuilder request = new StringBuilder("<xml>");
for (Map.Entry<String, String> para : packageParams.entrySet()) {
request.append(String.format("<%s>%s</%s>", para.getKey(),
para.getValue(), para.getKey()));
para.getValue(), para.getKey()));
}
request.append("</xml>");
HttpPost httpPost = new HttpPost(
"https://api.mch.weixin.qq.com/pay/orderquery");
"https://api.mch.weixin.qq.com/pay/orderquery");
if (this.httpProxy != null) {
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
.build();
.build();
httpPost.setConfig(config);
}
StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
httpPost.setEntity(entity);
try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
.execute(httpPost)) {
.execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE
.handleResponse(response);
.handleResponse(response);
XStream xstream = XStreamInitializer.getInstance();
xstream.alias("xml", WxMpPayResult.class);
return (WxMpPayResult) xstream.fromXML(responseContent);
} catch (IOException e) {
throw new RuntimeException("Failed to query order due to IO exception.",
e);
e);
}
}
@@ -297,66 +305,66 @@ public class WxMpPayServiceImpl implements WxMpPayService {
@Override
public WxMpPayRefundResult refundPay(Map<String, String> parameters)
throws WxErrorException {
throws WxErrorException {
SortedMap<String, String> refundParams = new TreeMap<>(parameters);
refundParams.put("appid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
refundParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
refundParams.put("nonce_str", System.currentTimeMillis() + "");
refundParams.put("op_user_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
String sign = this.createSign(refundParams,
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
refundParams.put("sign", sign);
StringBuilder request = new StringBuilder("<xml>");
for (Map.Entry<String, String> para : refundParams.entrySet()) {
request.append(String.format("<%s>%s</%s>", para.getKey(),
para.getValue(), para.getKey()));
para.getValue(), para.getKey()));
}
request.append("</xml>");
HttpPost httpPost = new HttpPost(
"https://api.mch.weixin.qq.com/secapi/pay/refund");
"https://api.mch.weixin.qq.com/secapi/pay/refund");
if (this.httpProxy != null) {
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
.build();
.build();
httpPost.setConfig(config);
}
StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
httpPost.setEntity(entity);
try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
.execute(httpPost)) {
.execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE
.handleResponse(response);
.handleResponse(response);
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxMpPayRefundResult.class);
WxMpPayRefundResult wxMpPayRefundResult = (WxMpPayRefundResult) xstream
.fromXML(responseContent);
.fromXML(responseContent);
if (!"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getResultCode())
|| !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
|| !"SUCCESS".equalsIgnoreCase(wxMpPayRefundResult.getReturnCode())) {
WxError error = new WxError();
error.setErrorCode(-1);
error.setErrorMsg("return_code:" + wxMpPayRefundResult.getReturnCode()
+ ";return_msg:" + wxMpPayRefundResult.getReturnMsg()
+ ";result_code:" + wxMpPayRefundResult.getResultCode()
+ ";err_code" + wxMpPayRefundResult.getErrCode() + ";err_code_des"
+ wxMpPayRefundResult.getErrCodeDes());
+ ";return_msg:" + wxMpPayRefundResult.getReturnMsg()
+ ";result_code:" + wxMpPayRefundResult.getResultCode()
+ ";err_code" + wxMpPayRefundResult.getErrCode() + ";err_code_des"
+ wxMpPayRefundResult.getErrCodeDes());
throw new WxErrorException(error);
}
return wxMpPayRefundResult;
} catch (IOException e) {
String message = MessageFormatter
.format("Exception happened when sending refund '{}'.",
request.toString())
.getMessage();
.format("Exception happened when sending refund '{}'.",
request.toString())
.getMessage();
this.log.error(message, e);
throw new WxErrorException(
WxError.newBuilder().setErrorMsg(message).build());
WxError.newBuilder().setErrorMsg(message).build());
} finally {
httpPost.releaseConnection();
}
@@ -364,65 +372,67 @@ public class WxMpPayServiceImpl implements WxMpPayService {
@Override
public boolean checkJSSDKCallbackDataSignature(Map<String, String> kvm,
String signature) {
String signature) {
return signature.equals(this.createSign(kvm,
this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
this.wxMpService.getWxMpConfigStorage().getPartnerKey()));
}
@Override
@Deprecated
public WxRedpackResult sendRedpack(Map<String, String> parameters)
throws WxErrorException {
throws WxErrorException {
SortedMap<String, String> packageParams = new TreeMap<>(parameters);
packageParams.put("wxappid",
this.wxMpService.getWxMpConfigStorage().getAppId());
this.wxMpService.getWxMpConfigStorage().getAppId());
packageParams.put("mch_id",
this.wxMpService.getWxMpConfigStorage().getPartnerId());
this.wxMpService.getWxMpConfigStorage().getPartnerId());
packageParams.put("nonce_str", System.currentTimeMillis() + "");
String sign = this.createSign(packageParams,
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
packageParams.put("sign", sign);
StringBuilder request = new StringBuilder("<xml>");
for (Map.Entry<String, String> para : packageParams.entrySet()) {
request.append(String.format("<%s>%s</%s>", para.getKey(),
para.getValue(), para.getKey()));
para.getValue(), para.getKey()));
}
request.append("</xml>");
HttpPost httpPost = new HttpPost(
"https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
"https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack");
if (this.httpProxy != null) {
RequestConfig config = RequestConfig.custom().setProxy(this.httpProxy)
.build();
.build();
httpPost.setConfig(config);
}
StringEntity entity = new StringEntity(request.toString(), Consts.UTF_8);
httpPost.setEntity(entity);
try (CloseableHttpResponse response = this.wxMpService.getHttpclient()
.execute(httpPost)) {
.execute(httpPost)) {
String responseContent = Utf8ResponseHandler.INSTANCE
.handleResponse(response);
.handleResponse(response);
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxRedpackResult.class);
return (WxRedpackResult) xstream.fromXML(responseContent);
} catch (IOException e) {
String message = MessageFormatter
.format("Exception occured when sending redpack '{}'.",
request.toString())
.getMessage();
.format("Exception occured when sending redpack '{}'.",
request.toString())
.getMessage();
this.log.error(message, e);
throw new WxErrorException(WxError.newBuilder().setErrorMsg(message).build());
throw new WxErrorException(
WxError.newBuilder().setErrorMsg(message).build());
} finally {
httpPost.releaseConnection();
}
}
@Override
public WxRedpackResult sendRedpack(WxSendRedpackRequest request) throws WxErrorException {
public WxRedpackResult sendRedpack(WxSendRedpackRequest request)
throws WxErrorException {
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxSendRedpackRequest.class);
xstream.processAnnotations(WxRedpackResult.class);
@@ -442,10 +452,13 @@ public class WxMpPayServiceImpl implements WxMpPayService {
}
String responseContent = this.wxMpService.post(url, xstream.toXML(request));
WxRedpackResult redpackResult = (WxRedpackResult) xstream.fromXML(responseContent);
if("FAIL".equals(redpackResult.getResultCode())){
throw new WxErrorException(
WxError.newBuilder().setErrorMsg(redpackResult.getErrCode() + ":" + redpackResult.getErrCodeDes()).build());
WxRedpackResult redpackResult = (WxRedpackResult) xstream
.fromXML(responseContent);
if ("FAIL".equals(redpackResult.getResultCode())) {
throw new WxErrorException(WxError.newBuilder()
.setErrorMsg(
redpackResult.getErrCode() + ":" + redpackResult.getErrCodeDes())
.build());
}
return redpackResult;
@@ -460,9 +473,10 @@ public class WxMpPayServiceImpl implements WxMpPayService {
}
try {
Field field = WxSendRedpackRequest.class.getDeclaredField(entry.getKey());
Field field = bean.getClass().getDeclaredField(entry.getKey());
if (field.isAnnotationPresent(XStreamAlias.class)) {
result.put(field.getAnnotation(XStreamAlias.class).value(), reflect.get().toString());
result.put(field.getAnnotation(XStreamAlias.class).value(),
reflect.get().toString());
}
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
@@ -485,7 +499,8 @@ public class WxMpPayServiceImpl implements WxMpPayService {
StringBuffer toSign = new StringBuffer();
for (String key : sortedMap.keySet()) {
String value = packageParams.get(key);
if (null != value && !"".equals(value) && !"sign".equals(key) && !"key".equals(key)) {
if (null != value && !"".equals(value) && !"sign".equals(key)
&& !"key".equals(key)) {
toSign.append(key + "=" + value + "&");
}
}
@@ -495,4 +510,73 @@ public class WxMpPayServiceImpl implements WxMpPayService {
return DigestUtils.md5Hex(toSign.toString()).toUpperCase();
}
@Override
public WxUnifiedOrderResult unifiedOrder(WxUnifiedOrderRequest request)
throws WxErrorException {
checkParameters(request);
XStream xstream = XStreamInitializer.getInstance();
xstream.processAnnotations(WxUnifiedOrderRequest.class);
xstream.processAnnotations(WxUnifiedOrderResult.class);
request.setAppid(this.wxMpService.getWxMpConfigStorage().getAppId());
request.setMchId(this.wxMpService.getWxMpConfigStorage().getPartnerId());
request.setNonceStr(System.currentTimeMillis() + "");
String sign = this.createSign(xmlBean2Map(request),
this.wxMpService.getWxMpConfigStorage().getPartnerKey());
request.setSign(sign);
String url = "https://api.mch.weixin.qq.com/pay/unifiedorder";
String responseContent = this.wxMpService.post(url, xstream.toXML(request));
WxUnifiedOrderResult result = (WxUnifiedOrderResult) xstream
.fromXML(responseContent);
if ("FAIL".equals(result.getResultCode())) {
throw new WxErrorException(WxError.newBuilder()
.setErrorMsg(result.getErrCode() + ":" + result.getErrCodeDes())
.build());
}
return result;
}
private void checkParameters(WxUnifiedOrderRequest request) {
List<String> nullFields = com.google.common.collect.Lists.newArrayList();
for (Entry<String, Reflect> entry : Reflect.on(request).fields()
.entrySet()) {
Reflect reflect = entry.getValue();
try {
Field field = request.getClass().getDeclaredField(entry.getKey());
if (field.isAnnotationPresent(Required.class)
&& reflect.get() == null) {
nullFields.add(entry.getKey());
}
} catch (NoSuchFieldException | SecurityException e) {
e.printStackTrace();
}
}
if (!nullFields.isEmpty()) {
throw new IllegalArgumentException("必填字段[" + nullFields + "]必须提供值");
}
if (!TRADE_TYPES.contains(request.getTradeType())) {
throw new IllegalArgumentException(
"trade_type目前必须为" + TRADE_TYPES + "其中之一");
}
if ("JSAPI".equals(request.getTradeType()) && request.getOpenid() == null) {
throw new IllegalArgumentException("当 trade_type是'JSAPI'时未指定openid");
}
if ("NATIVE".equals(request.getTradeType())
&& request.getProductId() == null) {
throw new IllegalArgumentException("当 trade_type是'NATIVE'时未指定product_id");
}
}
}