diff --git a/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderEntity.java b/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderEntity.java index 7047650..e73f631 100644 --- a/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderEntity.java +++ b/api-mapper/src/main/java/com/heyu/api/data/entity/vv/VvTradeOrderEntity.java @@ -46,6 +46,7 @@ private static final long serialVersionUID = 1L; public final static String channel_ = CLASS_NAME + "channel"; // 渠道,如抖音,微信小程序,朋友圈,bilibili 等 public final static String promoter_id = CLASS_NAME + "promoter_id"; // 推广者买家id public final static String trade_info = CLASS_NAME + "trade_info"; // 交易信息 + public final static String transaction_id = CLASS_NAME + "transaction_id"; // 事务id // @TableId(value = "id", type = IdType.AUTO) private Long id; @@ -97,6 +98,8 @@ private static final long serialVersionUID = 1L; private String promoterId; //交易信息 private String tradeInfo; + //事务id + private String transactionId; /** * * @return @@ -472,6 +475,21 @@ private static final long serialVersionUID = 1L; this.tradeInfo = tradeInfo; } + /** + * 事务id + * @return + */ + public String getTransactionId() { + return transactionId; + } + /** + * 事务id + * @param transactionId + */ + public void setTransactionId(String transactionId) { + this.transactionId = transactionId; + } + @Override public String toString() { return "VvTradeOrderEntity{" + @@ -500,6 +518,7 @@ private static final long serialVersionUID = 1L; ",channel=" + channel + ",promoterId=" + promoterId + ",tradeInfo=" + tradeInfo + + ",transactionId=" + transactionId + "}"; } } \ No newline at end of file diff --git a/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java b/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java index 563a8b7..c59fbf2 100644 --- a/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java +++ b/api-mapper/src/test/java/com/test/xxx/MysqlMain_update.java @@ -49,7 +49,7 @@ public class MysqlMain_update { List list = new ArrayList(); list.add(new TablesBean("vv_trade_order")); - list.add(new TablesBean("vv_trade_order_line")); + Map map = MysqlUtil2ShowCreateTable.getComments(); diff --git a/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java b/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java index 14b372e..7e01b12 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/JsapiPrepay.java @@ -2,22 +2,32 @@ package com.heyu.api.jsapi; // 引用微信支付工具库,参考:https://pay.weixin.qq.com/doc/v3/merchant/4014931831 -import com.heyu.api.jsapi.dto.*; +import com.heyu.api.data.dao.vv.VvReverseOrderDao; +import com.heyu.api.data.dao.vv.VvTradeOrderDao; +import com.heyu.api.data.entity.vv.VvReverseOrderEntity; +import com.heyu.api.data.entity.vv.VvTradeOrderEntity; +import com.heyu.api.data.utils.BigDecimalUtil; +import com.heyu.api.jsapi.dto.close.CloseOrderRequest; +import com.heyu.api.jsapi.dto.pay.*; +import com.heyu.api.jsapi.dto.refund.*; +import com.heyu.api.jsapi.dto.refund.query.QueryByOutRefundNoRequest; import com.heyu.api.jsapi.utils.PemUtil; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import okhttp3.*; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import org.springframework.util.Base64Utils; import java.io.IOException; import java.io.UncheckedIOException; +import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.security.PrivateKey; import java.security.PublicKey; - import java.security.Signature; +import java.util.ArrayList; import java.util.HashMap; import java.util.Map; @@ -28,12 +38,6 @@ import java.util.Map; @Slf4j public class JsapiPrepay { - private static String HOST = "https://api.mch.weixin.qq.com"; - - private static String METHOD = "POST"; - - private static String PATH = "/v3/pay/transactions/jsapi"; - @Value("${eb.config.weixin.pay.appid}") private String appid; @@ -50,10 +54,23 @@ public class JsapiPrepay { private PublicKey wechatPayPublicKey; + @Autowired + private VvTradeOrderDao vvTradeOrderDao; + + @Autowired + private VvReverseOrderDao vvReverseOrderDao; + + + + @Value("${eb.config.weixin.pay.notifyUrl}") private String notifyUrl; + + @Value("${eb.config.weixin.pay.refundNotifyUrl}") + private String refundNotifyUrl; + public JsapiPrepay() { } @@ -77,6 +94,10 @@ public class JsapiPrepay { } + /*** + * https://pay.weixin.qq.com/doc/v3/merchant/4012791897 + * JSAPI/小程序下单 + */ public DirectAPIv3JsapiPrepayResponse prePay(Long tradeOrderId, Long amount, String openid) { @@ -101,9 +122,12 @@ public class JsapiPrepay { return doPay(request); } - + /*** + * 商户订单号查询订单 + * + * https://pay.weixin.qq.com/doc/v3/merchant/4012791900 + */ public DirectAPIv3QueryResponse queryOrder(String transactionId) { - QueryByWxTradeNoRequest request = new QueryByWxTradeNoRequest(); request.transactionId = transactionId; request.mchid = mchid; @@ -143,6 +167,10 @@ public class JsapiPrepay { } } + /** + * 关闭订单 + * https://pay.weixin.qq.com/doc/v3/merchant/4012791901 + */ public void close(String tradeOrderId) { String HOST = "https://api.mch.weixin.qq.com"; String METHOD = "POST"; @@ -170,7 +198,6 @@ public class JsapiPrepay { // 2XX 成功,验证应答签名 WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, httpResponse.headers(), respBody); - return; } else { throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); @@ -180,11 +207,128 @@ public class JsapiPrepay { } } + /**** + * https://pay.weixin.qq.com/doc/v3/merchant/4012791903 + * 退款申请 + */ + public Refund refund(Long tradeOrderId, Long reverseOrderId) { + VvTradeOrderEntity vvTradeOrderEntity = vvTradeOrderDao.selectVvTradeOrderById(tradeOrderId); + VvReverseOrderEntity vvReverseOrderEntity = vvReverseOrderDao.selectVvReverseOrderById(reverseOrderId); + CreateRequest request = new CreateRequest(); + request.transactionId = vvTradeOrderEntity.getTransactionId(); // 【微信支付订单号】 微信支付侧订单的唯一标识,订单支付成功后,查询订单和支付成功回调通知会返回该参数。transaction_id和out_trade_no必须二选一进行传参。 + request.outTradeNo = tradeOrderId + ""; // 【商户订单号】 商户下单时传入的商户系统内部订单号。transaction_id和out_trade_no必须二选一进行传参。 + request.outRefundNo = reverseOrderId + ""; //【商户退款单号】 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一商户退款单号多次请求只退一笔。不可超过64个字节数。 + request.reason = vvReverseOrderEntity.getRefundReason(); // 【退款原因】 若商户传了退款原因,该原因将在下发给用户的退款消息中显示,具体展示可参见退款通知UI示意图。请注意:1、该退款原因参数的长度不得超过80个字节;2、当订单退款金额小于等于1元且为部分退款时,退款原因将不会在消息中体现。 + request.notifyUrl = refundNotifyUrl; // 【退款结果回调url】 异步接收微信支付退款结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 如果传了该参数,则商户平台上配置的回调地址(商户平台-交易中心-退款管理-退款配置)将不会生效,优先回调当前传的这个地址。 + /** + * AVAILABLE: 仅对旧资金流商户适用(请参考旧资金流介绍区分),传此枚举指定从可用余额账户出资,否则默认使用未结算资金退款。 + * UNSETTLED: 仅对出行预付押金退款适用,指定从未结算资金出资。 + */ + request.fundsAccount = ReqFundsAccount.AVAILABLE; // 【退款资金来源】 若传递此参数则使用对应的资金账户退款。 + // 【金额信息】订单退款金额信息 + request.amount = new AmountReq(); + + Long refundAmount = BigDecimalUtil.multiply(vvReverseOrderEntity.getRefundAmount(), new BigDecimal(100)).longValue(); + Long tradeOrderAmount = BigDecimalUtil.multiply(vvTradeOrderEntity.getAllPrice(), new BigDecimal(100)).longValue(); + + request.amount.refund =refundAmount; // 【退款金额】 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。 + // 【退款出资账户及金额】退款需从指定账户出资时,可传递该参数以指定出资金额(币种最小单位,仅限整数)。 + // 多账户出资退款需满足:1、未开通退款支出分离功能;2、订单为待分账或分账中的分账订单。 + // 传递参数需确保:1、基本账户可用与不可用余额之和等于退款金额;2、账户类型不重复。不符条件将返回错误。 + request.amount.from = new ArrayList<>(); + { + FundsFromItem fromItem = new FundsFromItem(); + fromItem.account = Account.AVAILABLE; // 【出资账户类型】 退款出资的账户类型。 + fromItem.amount = refundAmount; // AVAILABLE : 可用余额 + request.amount.from.add(fromItem); // 【出资金额】对应账户出资金额 + }; + + request.amount.total = tradeOrderAmount; // 必填 【原订单金额】 原支付交易的订单总金额,币种的最小单位,只能为整数 + request.amount.currency = "CNY"; // 必填 【退款币种】 符合ISO 4217标准的三位字母代码,固定传:CNY,代表人民币。 + String HOST = refundNotifyUrl; + String METHOD = "POST"; + String PATH = "/v3/refund/domestic/refunds"; + String uri = PATH; + + String reqBody = WXPayUtility.toJson(request); + Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); + reqBuilder.addHeader("Accept", "application/json"); + reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); + reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, reqBody)); + reqBuilder.addHeader("Content-Type", "application/json"); + RequestBody requestBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), reqBody); + reqBuilder.method(METHOD, requestBody); + Request httpRequest = reqBuilder.build(); + + // 发送HTTP请求 + OkHttpClient client = new OkHttpClient.Builder().build(); + try (Response httpResponse = client.newCall(httpRequest).execute()) { + String respBody = WXPayUtility.extractBody(httpResponse); + if (httpResponse.code() >= 200 && httpResponse.code() < 300) { + // 2XX 成功,验证应答签名 + WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, + httpResponse.headers(), respBody); + + // 从HTTP应答报文构建返回数据 + return WXPayUtility.fromJson(respBody, Refund.class); + } else { + throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); + } + } catch (IOException e) { + throw new UncheckedIOException("Sending request to " + uri + " failed.", e); + } + } + /*** + * https://pay.weixin.qq.com/doc/v3/merchant/4012791904 + *查询单笔退款(通过商户退款单号) + * + * 提交退款申请后,推荐每间隔1分钟调用该接口查询一次退款状态,若超过5分钟仍是退款处理中状态,建议开始逐步衰减查询频率(比如之后间隔5分钟、10分钟、20分钟、30分钟……查询一次)。 + * + * 退款有一定延时,零钱支付的订单退款一般5分钟内到账,银行卡支付的订单退款一般1-3个工作日到账。 + * + * 同一商户号查询退款频率限制为300qps,如返回FREQUENCY_LIMITED频率限制报错可间隔1分钟再重试查询。 + */ + public Refund queryRefund(String reverseOrderId) { + String HOST = "https://api.mch.weixin.qq.com"; + String METHOD = "GET"; + String PATH = "/v3/refund/domestic/refunds/{out_refund_no}"; + QueryByOutRefundNoRequest request = new QueryByOutRefundNoRequest(); + request.outRefundNo = reverseOrderId + ""; // 【商户退款单号】 商户申请退款时传入的商户系统内部退款单号。 + String uri = PATH; + uri = uri.replace("{out_refund_no}", WXPayUtility.urlEncode(request.outRefundNo)); + Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); + reqBuilder.addHeader("Accept", "application/json"); + reqBuilder.addHeader("Wechatpay-Serial", wechatPayPublicKeyId); + reqBuilder.addHeader("Authorization", WXPayUtility.buildAuthorization(mchid, certificateSerialNo, privateKey, METHOD, uri, null)); + reqBuilder.method(METHOD, null); + Request httpRequest = reqBuilder.build(); + + // 发送HTTP请求 + OkHttpClient client = new OkHttpClient.Builder().build(); + try (Response httpResponse = client.newCall(httpRequest).execute()) { + String respBody = WXPayUtility.extractBody(httpResponse); + if (httpResponse.code() >= 200 && httpResponse.code() < 300) { + // 2XX 成功,验证应答签名 + WXPayUtility.validateResponse(this.wechatPayPublicKeyId, this.wechatPayPublicKey, + httpResponse.headers(), respBody); + + // 从HTTP应答报文构建返回数据 + return WXPayUtility.fromJson(respBody, Refund.class); + } else { + throw new WXPayUtility.ApiException(httpResponse.code(), respBody, httpResponse.headers()); + } + } catch (IOException e) { + throw new UncheckedIOException("Sending request to " + uri + " failed.", e); + } + } public DirectAPIv3JsapiPrepayResponse doPay(DirectAPIv3JsapiPrepayRequest request) { + String HOST = "https://api.mch.weixin.qq.com"; + String METHOD = "POST"; + String PATH = "/v3/pay/transactions/jsapi"; String uri = PATH; String reqBody = WXPayUtility.toJson(request); Request.Builder reqBuilder = new Request.Builder().url(HOST + uri); diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CloseOrderRequest.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/close/CloseOrderRequest.java similarity index 89% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CloseOrderRequest.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/close/CloseOrderRequest.java index 82818bb..8267b4d 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CloseOrderRequest.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/close/CloseOrderRequest.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.close; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespAmountInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespAmountInfo.java similarity index 91% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespAmountInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespAmountInfo.java index 5c61602..4f1e8e5 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespAmountInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespAmountInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespPayerInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespPayerInfo.java similarity index 82% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespPayerInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespPayerInfo.java index 52ffe8a..c6cbd38 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespPayerInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespPayerInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespSceneInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespSceneInfo.java similarity index 83% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespSceneInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespSceneInfo.java index 83d1042..1067e50 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommRespSceneInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommRespSceneInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommonAmountInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommonAmountInfo.java similarity index 86% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CommonAmountInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommonAmountInfo.java index dc23d91..a84a0ea 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommonAmountInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommonAmountInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommonSceneInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommonSceneInfo.java similarity index 89% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CommonSceneInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommonSceneInfo.java index 0b543ef..3e79bf6 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CommonSceneInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CommonSceneInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/CouponInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CouponInfo.java similarity index 90% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/CouponInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CouponInfo.java index 0ad8be9..486438e 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/CouponInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/CouponInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3JsapiPrepayRequest.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3JsapiPrepayRequest.java similarity index 96% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3JsapiPrepayRequest.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3JsapiPrepayRequest.java index 87c1376..5e65f09 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3JsapiPrepayRequest.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3JsapiPrepayRequest.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3JsapiPrepayResponse.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3JsapiPrepayResponse.java similarity index 83% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3JsapiPrepayResponse.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3JsapiPrepayResponse.java index 7e1c3c9..ca324f3 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3JsapiPrepayResponse.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3JsapiPrepayResponse.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3QueryResponse.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3QueryResponse.java similarity index 96% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3QueryResponse.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3QueryResponse.java index ed6f369..6a6e696 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/DirectAPIv3QueryResponse.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/DirectAPIv3QueryResponse.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/GoodsDetail.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/GoodsDetail.java similarity index 93% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/GoodsDetail.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/GoodsDetail.java index b830d7c..e7c2bee 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/GoodsDetail.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/GoodsDetail.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/GoodsDetailInPromotion.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/GoodsDetailInPromotion.java similarity index 92% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/GoodsDetailInPromotion.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/GoodsDetailInPromotion.java index f9341a3..80b9f7f 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/GoodsDetailInPromotion.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/GoodsDetailInPromotion.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/JsapiReqPayerInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/JsapiReqPayerInfo.java similarity index 82% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/JsapiReqPayerInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/JsapiReqPayerInfo.java index 64a2175..2cc5ba2 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/JsapiReqPayerInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/JsapiReqPayerInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/PromotionDetail.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/PromotionDetail.java similarity index 95% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/PromotionDetail.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/PromotionDetail.java index d55e017..60ebfeb 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/PromotionDetail.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/PromotionDetail.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/QueryByWxTradeNoRequest.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/QueryByWxTradeNoRequest.java similarity index 90% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/QueryByWxTradeNoRequest.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/QueryByWxTradeNoRequest.java index 756cb66..e020711 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/QueryByWxTradeNoRequest.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/QueryByWxTradeNoRequest.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.Expose; import com.google.gson.annotations.SerializedName; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/SettleInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/SettleInfo.java similarity index 83% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/SettleInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/SettleInfo.java index 6c3f572..fba4264 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/SettleInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/SettleInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/StoreInfo.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/StoreInfo.java similarity index 90% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/StoreInfo.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/StoreInfo.java index e69b1ff..8fb5aa5 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/StoreInfo.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/StoreInfo.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import com.google.gson.annotations.SerializedName; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/WxPayVO.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/WxPayVO.java similarity index 92% rename from api-third/src/main/java/com/heyu/api/jsapi/dto/WxPayVO.java rename to api-third/src/main/java/com/heyu/api/jsapi/dto/pay/WxPayVO.java index f5d6a2e..93b3719 100644 --- a/api-third/src/main/java/com/heyu/api/jsapi/dto/WxPayVO.java +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/pay/WxPayVO.java @@ -1,4 +1,4 @@ -package com.heyu.api.jsapi.dto; +package com.heyu.api.jsapi.dto.pay; import lombok.Data; diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Account.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Account.java new file mode 100644 index 0000000..8349b20 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Account.java @@ -0,0 +1,11 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum Account { + @SerializedName("AVAILABLE") + AVAILABLE, + @SerializedName("UNAVAILABLE") + UNAVAILABLE + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Amount.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Amount.java new file mode 100644 index 0000000..6760792 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Amount.java @@ -0,0 +1,38 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class Amount { + @SerializedName("total") + public Long total; + + @SerializedName("refund") + public Long refund; + + @SerializedName("from") + public List from; + + @SerializedName("payer_total") + public Long payerTotal; + + @SerializedName("payer_refund") + public Long payerRefund; + + @SerializedName("settlement_refund") + public Long settlementRefund; + + @SerializedName("settlement_total") + public Long settlementTotal; + + @SerializedName("discount_refund") + public Long discountRefund; + + @SerializedName("currency") + public String currency; + + @SerializedName("refund_fee") + public Long refundFee; + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/AmountReq.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/AmountReq.java new file mode 100644 index 0000000..2ed180f --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/AmountReq.java @@ -0,0 +1,19 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +import java.util.List; + +public class AmountReq { + @SerializedName("refund") + public Long refund; + + @SerializedName("from") + public List from; + + @SerializedName("total") + public Long total; + + @SerializedName("currency") + public String currency; + } \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Channel.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Channel.java new file mode 100644 index 0000000..682a901 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Channel.java @@ -0,0 +1,14 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum Channel { + @SerializedName("ORIGINAL") + ORIGINAL, + @SerializedName("BALANCE") + BALANCE, + @SerializedName("OTHER_BALANCE") + OTHER_BALANCE, + @SerializedName("OTHER_BANKCARD") + OTHER_BANKCARD + } \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/CreateRequest.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/CreateRequest.java new file mode 100644 index 0000000..34f42da --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/CreateRequest.java @@ -0,0 +1,35 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; +import com.heyu.api.jsapi.dto.pay.GoodsDetail; +import lombok.Data; + +import java.util.List; + +@Data +public class CreateRequest { + @SerializedName("transaction_id") + public String transactionId; + + @SerializedName("out_trade_no") + public String outTradeNo; + + @SerializedName("out_refund_no") + public String outRefundNo; + + @SerializedName("reason") + public String reason; + + @SerializedName("notify_url") + public String notifyUrl; + + @SerializedName("funds_account") + public ReqFundsAccount fundsAccount; + + @SerializedName("amount") + public AmountReq amount; + + @SerializedName("goods_detail") + public List goodsDetail; + + } \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/FundsAccount.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/FundsAccount.java new file mode 100644 index 0000000..b7fd1cb --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/FundsAccount.java @@ -0,0 +1,18 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum FundsAccount { + @SerializedName("UNSETTLED") + UNSETTLED, + @SerializedName("AVAILABLE") + AVAILABLE, + @SerializedName("UNAVAILABLE") + UNAVAILABLE, + @SerializedName("OPERATION") + OPERATION, + @SerializedName("BASIC") + BASIC, + @SerializedName("ECNY_BASIC") + ECNY_BASIC + } \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/FundsFromItem.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/FundsFromItem.java new file mode 100644 index 0000000..52797fe --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/FundsFromItem.java @@ -0,0 +1,10 @@ +package com.heyu.api.jsapi.dto.refund; + +public static class FundsFromItem { + @SerializedName("account") + public Account account; + + @SerializedName("amount") + public Long amount; + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Promotion.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Promotion.java new file mode 100644 index 0000000..04da4a6 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Promotion.java @@ -0,0 +1,24 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; +import com.heyu.api.jsapi.dto.pay.GoodsDetail; + +public class Promotion { + @SerializedName("promotion_id") + public String promotionId; + + @SerializedName("scope") + public PromotionScope scope; + + @SerializedName("type") + public PromotionType type; + + @SerializedName("amount") + public Long amount; + + @SerializedName("refund_amount") + public Long refundAmount; + + @SerializedName("goods_detail") + public List goodsDetail; + } \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/PromotionScope.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/PromotionScope.java new file mode 100644 index 0000000..ec8911c --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/PromotionScope.java @@ -0,0 +1,11 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum PromotionScope { + @SerializedName("GLOBAL") + GLOBAL, + @SerializedName("SINGLE") + SINGLE + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/PromotionType.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/PromotionType.java new file mode 100644 index 0000000..2c92957 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/PromotionType.java @@ -0,0 +1,11 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum PromotionType { + @SerializedName("CASH") + CASH, + @SerializedName("NOCASH") + NOCASH + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Refund.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Refund.java new file mode 100644 index 0000000..92294d6 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Refund.java @@ -0,0 +1,46 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; + +import java.util.List; + +@Data +public class Refund { + @SerializedName("refund_id") + public String refundId; + + @SerializedName("out_refund_no") + public String outRefundNo; + + @SerializedName("transaction_id") + public String transactionId; + + @SerializedName("out_trade_no") + public String outTradeNo; + + @SerializedName("channel") + public Channel channel; + + @SerializedName("user_received_account") + public String userReceivedAccount; + + @SerializedName("success_time") + public String successTime; + + @SerializedName("create_time") + public String createTime; + + @SerializedName("status") + public Status status; + + @SerializedName("funds_account") + public FundsAccount fundsAccount; + + @SerializedName("amount") + public Amount amount; + + @SerializedName("promotion_detail") + public List promotionDetail; + + } \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/ReqFundsAccount.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/ReqFundsAccount.java new file mode 100644 index 0000000..adfab52 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/ReqFundsAccount.java @@ -0,0 +1,11 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum ReqFundsAccount { + @SerializedName("AVAILABLE") + AVAILABLE, + @SerializedName("UNSETTLED") + UNSETTLED + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Status.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Status.java new file mode 100644 index 0000000..fee6e93 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/Status.java @@ -0,0 +1,15 @@ +package com.heyu.api.jsapi.dto.refund; + +import com.google.gson.annotations.SerializedName; + +public enum Status { + @SerializedName("SUCCESS") + SUCCESS, + @SerializedName("CLOSED") + CLOSED, + @SerializedName("PROCESSING") + PROCESSING, + @SerializedName("ABNORMAL") + ABNORMAL + } + \ No newline at end of file diff --git a/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/query/QueryByOutRefundNoRequest.java b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/query/QueryByOutRefundNoRequest.java new file mode 100644 index 0000000..9d982b7 --- /dev/null +++ b/api-third/src/main/java/com/heyu/api/jsapi/dto/refund/query/QueryByOutRefundNoRequest.java @@ -0,0 +1,12 @@ +package com.heyu.api.jsapi.dto.refund.query; + +import com.google.gson.annotations.Expose; +import com.google.gson.annotations.SerializedName; + +public class QueryByOutRefundNoRequest { + @SerializedName("out_refund_no") + @Expose(serialize = false) + public String outRefundNo; + + } + \ No newline at end of file diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java index 94a2490..d6afaf8 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppOrderController.java @@ -16,8 +16,8 @@ import com.heyu.api.data.enums.DelayTypeEnums; import com.heyu.api.data.enums.RoleEnums; import com.heyu.api.data.utils.*; import com.heyu.api.jsapi.JsapiPrepay; -import com.heyu.api.jsapi.dto.DirectAPIv3JsapiPrepayResponse; -import com.heyu.api.jsapi.dto.WxPayVO; +import com.heyu.api.jsapi.dto.pay.DirectAPIv3JsapiPrepayResponse; +import com.heyu.api.jsapi.dto.pay.WxPayVO; import com.heyu.api.utils.ISelect; import com.heyu.api.utils.PPageUtils; import lombok.extern.slf4j.Slf4j; @@ -91,10 +91,6 @@ public class AppOrderController { @Value("${eb.config.weixin.pay.privateKeyFilePath}") private String privateKey; - - - - /*** * https://api.1024api.com/api-interface/app/order/list * diff --git a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java index f08ffdf..7bfa893 100644 --- a/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java +++ b/api-web/api-interface/src/main/java/com/heyu/api/controller/vv/AppWeiXinPayNotifyController.java @@ -12,8 +12,7 @@ import com.heyu.api.data.entity.vv.VvTradeOrderEntity; import com.heyu.api.data.entity.vv.VvTradeOrderLineEntity; import com.heyu.api.data.utils.NumberUtil; import com.heyu.api.jsapi.JsapiPrepay; -import com.heyu.api.jsapi.dto.DirectAPIv3QueryResponse; -import com.heyu.api.jsapi.dto.QueryByWxTradeNoRequest; +import com.heyu.api.jsapi.dto.pay.DirectAPIv3QueryResponse; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; @@ -91,7 +90,7 @@ public class AppWeiXinPayNotifyController { // AES-GCM解密方法 private String decrypt(String ciphertext, String associatedData, String nonce) throws Exception { // 将APIv3密钥转为字节数组 - byte[] key = apiv3key.getBytes(StandardCharsets.UTF_8) + byte[] key = apiv3key.getBytes(StandardCharsets.UTF_8); Key secretKey = new SecretKeySpec(key, "AES"); // 使用AES-GCM解密 @@ -107,11 +106,10 @@ public class AppWeiXinPayNotifyController { private void updateOrderStatus(String outTradeNo, String transactionId) { try { - DirectAPIv3QueryResponse response = jsapiPrepay.queryOrder(transactionId); - VvTradeOrderEntity tradeOrderEntity = tradeOrderDao.selectVvTradeOrderById(NumberUtil.objToLong(outTradeNo)); tradeOrderEntity.setTradeInfo(JSON.toJSONString(response)); + tradeOrderEntity.setTransactionId(transactionId); tradeOrderDao.updateVvTradeOrderById(tradeOrderEntity); }catch ( Exception e ){ log.error("AppWeiXinPayNotifyController updateOrderStatus error:{}",e.getMessage()); diff --git a/api-web/api-interface/src/main/resources/bootstrap.yml b/api-web/api-interface/src/main/resources/bootstrap.yml index 9c0a940..809863e 100644 --- a/api-web/api-interface/src/main/resources/bootstrap.yml +++ b/api-web/api-interface/src/main/resources/bootstrap.yml @@ -74,10 +74,7 @@ eb: appid: wx75fa59c097bd3dfd notifyUrl: https://api.1024api.com/api-interface/app/weixin/payNotify apiv3key: E938F17ABF6843743F49688269F73B7D - - - - + refundNotifyUrl: https://api.1024api.com/api-interface/app/weixin/refundNotify tencent: diff --git a/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java b/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java index b170316..6630edb 100644 --- a/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java +++ b/api-web/api-interface/src/test/java/com/api/test/JSAPIQueryTest.java @@ -1,8 +1,8 @@ package com.api.test; import com.heyu.api.jsapi.WXPayUtility; -import com.heyu.api.jsapi.dto.DirectAPIv3QueryResponse; -import com.heyu.api.jsapi.dto.QueryByWxTradeNoRequest; +import com.heyu.api.jsapi.dto.pay.DirectAPIv3QueryResponse; +import com.heyu.api.jsapi.dto.pay.QueryByWxTradeNoRequest; public class JSAPIQueryTest { diff --git a/api-web/api-interface/src/test/java/com/api/test/Test2JSAPI.java b/api-web/api-interface/src/test/java/com/api/test/Test2JSAPI.java index f1e2cea..c1b2016 100644 --- a/api-web/api-interface/src/test/java/com/api/test/Test2JSAPI.java +++ b/api-web/api-interface/src/test/java/com/api/test/Test2JSAPI.java @@ -3,7 +3,7 @@ package com.api.test; import com.alibaba.fastjson.JSON; import com.heyu.api.jsapi.JsapiPrepay; import com.heyu.api.jsapi.WXPayUtility; -import com.heyu.api.jsapi.dto.*; +import com.heyu.api.jsapi.dto.pay.*; import java.util.ArrayList; import java.util.List; diff --git a/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java b/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java index e2098a5..2337d37 100644 --- a/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java +++ b/api-web/api-interface/src/test/java/com/api/test/TestJSAPI.java @@ -3,7 +3,7 @@ package com.api.test; import com.alibaba.fastjson.JSON; import com.heyu.api.jsapi.JsapiPrepay; import com.heyu.api.jsapi.WXPayUtility; -import com.heyu.api.jsapi.dto.*; +import com.heyu.api.jsapi.dto.pay.*; import java.util.UUID; import java.util.stream.Collectors;