diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerNotifyV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerNotifyV3Result.java index 2a33910fd5..58f3dbb2a1 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerNotifyV3Result.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerNotifyV3Result.java @@ -11,7 +11,7 @@ * 微信支付服务商下单回调 * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_5.shtml * - * @author Guo Shuai + * @author Pursuer * @version 1.0 * @date 2023/3/2 */ diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerRefundNotifyV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerRefundNotifyV3Result.java index f3dcf168b1..fc0007565d 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerRefundNotifyV3Result.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/notify/WxPayPartnerRefundNotifyV3Result.java @@ -10,7 +10,7 @@ * 微信支付服务商退款回调 * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_11.shtml * - * @author Guo Shuai + * @author Pursuer * @version 1.0 * @date 2023/3/2 */ diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderCloseV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderCloseV3Request.java index 7a62629fb4..2696bcf60a 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderCloseV3Request.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderCloseV3Request.java @@ -11,9 +11,9 @@ * 服务商关闭订单请求对象类 * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_3.shtml * - * @author Guo Shuai + * @author Pursuer * @version 1.0 - * @date 2023/3/2 + * @date 2023/6/21 */ @Data @NoArgsConstructor diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderQueryV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderQueryV3Request.java new file mode 100644 index 0000000000..d22fcf395d --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerOrderQueryV3Request.java @@ -0,0 +1,76 @@ +package com.github.binarywang.wxpay.bean.request; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.Accessors; + +import java.io.Serializable; + +/** + * 服务商查询订单请求对象类 + * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_2.shtml + * + * @author Pursuer + * @version 1.0 + * @date 2023/6/25 + */ +@Data +@NoArgsConstructor +@Accessors(chain = true) +public class WxPayPartnerOrderQueryV3Request implements Serializable { + private static final long serialVersionUID = 1L; + /** + *
+ * 字段名:服务商商户号 + * 变量名:sp_mchid + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 服务商商户号,由微信支付生成并下发。 + * 示例值:1230000109 + *+ */ + @SerializedName(value = "sp_mchid") + private String spMchId; + /** + *
+ * 字段名:特约商户商户号 + * 变量名:sp_mchid + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 特约商户商户号,由微信支付生成并下发。 + * 示例值:1230000109 + *+ */ + @SerializedName(value = "sub_mchid") + private String subMchId; + /** + *
+ * 字段名:微信支付订单号 + * 变量名:transaction_id + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 微信支付系统生成的订单号 + * 示例值:1217752501201407033233368018 + *+ */ + @SerializedName(value = "transaction_id") + private String transactionId; + /** + *
+ * 字段名:商户订单号 + * 变量名:out_trade_no + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。 + * 特殊规则:最小字符长度为6 + * 示例值:1217752501201407033233368018 + *+ */ + @SerializedName(value = "out_trade_no") + private String outTradeNo; +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerRefundV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerRefundV3Request.java index 299cf2a94b..c522c90d88 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerRefundV3Request.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerRefundV3Request.java @@ -12,7 +12,7 @@ * 微信支付服务商退款请求 * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_9.shtml * - * @author Guo Shuai + * @author Pursuer * @version 1.0 * @date 2023/3/2 */ diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerUnifiedOrderV3Request.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerUnifiedOrderV3Request.java index 4e60f0693d..b121170c31 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerUnifiedOrderV3Request.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayPartnerUnifiedOrderV3Request.java @@ -11,7 +11,7 @@ /** * 微信支付服务商下单请求对象 * - * @author Guo Shuai + * @author Pursuer * @version 1.0 * @date 2023/3/2 */ diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayPartnerOrderQueryV3Result.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayPartnerOrderQueryV3Result.java new file mode 100644 index 0000000000..4c540638c9 --- /dev/null +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/WxPayPartnerOrderQueryV3Result.java @@ -0,0 +1,555 @@ +package com.github.binarywang.wxpay.bean.result; + +import com.google.gson.annotations.SerializedName; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.io.Serializable; +import java.util.List; + +/** + * 服务商查询订单返回结果对象类 + * 文档见:https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_2.shtml + * + * @author Pursuer + * @version 1.0 + * @date 2023/6/25 + */ +@Data +@NoArgsConstructor +public class WxPayPartnerOrderQueryV3Result implements Serializable { + private static final long serialVersionUID = 1L; + /** + *
+ * 字段名:服务商应用ID + * 变量名:appid + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 服务商申请的公众号或移动应用appid。 + * 示例值:wxd678efh567hg6787 + *+ */ + @SerializedName(value = "sp_appid") + private String spAppid; + /** + *
+ * 字段名:服务商户号 + * 变量名:mchid + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 服务商户号,由微信支付生成并下发 + * 示例值:1230000109 + *+ */ + @SerializedName(value = "sp_mchid") + private String spMchId; + /** + *
+ * 字段名:子商户应用ID + * 变量名:appid + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 子商户申请的公众号或移动应用appid。 + * 示例值:wxd678efh567hg6787 + *+ */ + @SerializedName(value = "sub_appid") + private String subAppid; + /** + *
+ * 字段名:子商户商户号 + * 变量名:mchid + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 子商户的商户号,由微信支付生成并下发。 + * 示例值:1230000109 + *+ */ + @SerializedName(value = "sub_mchid") + private String subMchId; + /** + *
+ * 字段名:商户订单号 + * 变量名:out_trade_no + * 是否必填:是 + * 类型:string[6,32] + * 描述: + * 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一,详见【商户订单号】。 + * 示例值:1217752501201407033233368018 + *+ */ + @SerializedName(value = "out_trade_no") + private String outTradeNo; + /** + *
+ * 字段名:微信支付订单号 + * 变量名:transaction_id + * 是否必填:否 + * 类型:string[1,32] + * 描述: + * 微信支付系统生成的订单号。 + * 示例值:1217752501201407033233368018 + *+ */ + @SerializedName(value = "transaction_id") + private String transactionId; + /** + *
+ * 字段名:交易类型 + * 变量名:trade_type + * 是否必填:否 + * 类型:string[1,16] + * 描述: + * 交易类型,枚举值: + * JSAPI:公众号支付 + * NATIVE:扫码支付 + * APP:APP支付 + * MICROPAY:付款码支付 + * MWEB:H5支付 + * FACEPAY:刷脸支付 + * 示例值:MICROPAY + *+ */ + @SerializedName(value = "trade_type") + private String tradeType; + /** + *
+ * 字段名:交易状态 + * 变量名:trade_state + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 交易状态,枚举值: + * SUCCESS:支付成功 + * REFUND:转入退款 + * NOTPAY:未支付 + * CLOSED:已关闭 + * REVOKED:已撤销(付款码支付) + * USERPAYING:用户支付中(付款码支付) + * PAYERROR:支付失败(其他原因,如银行返回失败) + * ACCEPT:已接收,等待扣款 + * 示例值:SUCCESS + *+ */ + @SerializedName(value = "trade_state") + private String tradeState; + /** + *
+ * 字段名:交易状态描述 + * 变量名:trade_state_desc + * 是否必填:是 + * 类型:string[1,256] + * 描述: + * 交易状态描述 + * 示例值:支付成功 + *+ */ + @SerializedName(value = "trade_state_desc") + private String tradeStateDesc; + /** + *
+ * 字段名:付款银行 + * 变量名:bank_type + * 是否必填:否 + * 类型:string[1,16] + * 描述: + * 银行类型,采用字符串类型的银行标识。银行标识请参考《银行类型对照表》https://pay.weixin.qq.com/wiki/doc/apiv3/terms_definition/chapter1_1_3.shtml#part-6 + * 示例值:CMC + *+ */ + @SerializedName(value = "bank_type") + private String bankType; + /** + *
+ * 字段名:附加数据 + * 变量名:attach + * 是否必填:否 + * 类型:string[1,128] + * 描述: + * 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用 + * 示例值:自定义数据 + *+ */ + @SerializedName(value = "attach") + private String attach; + /** + *
+ * 字段名:支付完成时间 + * 变量名:success_time + * 是否必填:否 + * 类型:string[1,64] + * 描述: + * 支付完成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss表示时分秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35+08:00表示,北京时间2015年5月20日 13点29分35秒。 + * 示例值:2018-06-08T10:34:56+08:00 + *+ */ + @SerializedName(value = "success_time") + private String successTime; + /** + *
+ * 字段名:支付者 + * 变量名:payer + * 是否必填:是 + * 类型:object + * 描述: + * 支付者信息 + *+ */ + private Payer payer; + /** + *
+ * 字段名:订单金额 + * 变量名:amount + * 是否必填:否 + * 类型:object + * 描述: + * 订单金额信息,当支付成功时返回该字段。 + *+ */ + @SerializedName(value = "amount") + private Amount amount; + /** + *
+ * 字段名:场景信息 + * 变量名:scene_info + * 是否必填:否 + * 类型:object + * 描述: + * 支付场景描述 + *+ */ + @SerializedName(value = "scene_info") + private SceneInfo sceneInfo; + /** + *
+ * 字段名:优惠功能 + * 变量名:promotion_detail + * 是否必填:否 + * 类型:array + * 描述: + * 优惠功能,享受优惠时返回该字段。 + *+ */ + @SerializedName(value = "promotion_detail") + private List
+ * 字段名:用户标识 + * 变量名:openid + * 是否必填:是 + * 类型:string[1,128] + * 描述: + * 用户在直连商户appid下的唯一标识。 + * 示例值:oUpF8uMuAJO_M2pxb1Q9zNjWeS6o + *+ */ + @SerializedName(value = "openid") + private String openid; + } + + @Data + @NoArgsConstructor + public static class Amount implements Serializable { + private static final long serialVersionUID = 1L; + /** + *
+ * 字段名:总金额 + * 变量名:total + * 是否必填:否 + * 类型:int + * 描述: + * 订单总金额,单位为分。 + * 示例值:100 + *+ */ + @SerializedName(value = "total") + private Integer total; + /** + *
+ * 字段名:用户支付金额 + * 变量名:payer_total + * 是否必填:否 + * 类型:int + * 描述: + * 用户支付金额,单位为分。 + * 示例值:100 + *+ */ + @SerializedName(value = "payer_total") + private Integer payerTotal; + /** + *
+ * 字段名:货币类型 + * 变量名:currency + * 是否必填:否 + * 类型:string[1,16] + * 描述: + * CNY:人民币,境内商户号仅支持人民币。 + * 示例值:CNY + *+ */ + @SerializedName(value = "currency") + private String currency; + /** + *
+ * 字段名:用户支付币种 + * 变量名:payer_currency + * 是否必填:否 + * 类型:string[1,16] + * 描述: + * 用户支付币种 + * 示例值: CNY + *+ */ + @SerializedName(value = "payer_currency") + private String payerCurrency; + } + + @Data + @NoArgsConstructor + public static class SceneInfo implements Serializable { + private static final long serialVersionUID = 1L; + /** + *
+ * 字段名:商户端设备号 + * 变量名:device_id + * 是否必填:否 + * 类型:string[1,32] + * 描述: + * 商户端设备号(发起扣款请求的商户服务器设备号)。 + * 示例值:013467007045764 + *+ */ + @SerializedName(value = "device_id") + private String deviceId; + } + + @Data + @NoArgsConstructor + public static class PromotionDetail implements Serializable { + /** + *
+ * 字段名:券ID + * 变量名:coupon_id + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 券ID + * 示例值:109519 + *+ */ + @SerializedName(value = "coupon_id") + private String couponId; + /** + *
+ * 字段名:优惠名称 + * 变量名:name + * 是否必填:否 + * 类型:string[1,64] + * 描述: + * 优惠名称 + * 示例值:单品惠-6 + *+ */ + @SerializedName(value = "name") + private String name; + /** + *
+ * 字段名:优惠范围 + * 变量名:scope + * 是否必填:否 + * 类型:string[1,32] + * 描述: + * GLOBAL:全场代金券 + * SINGLE:单品优惠 + * 示例值:GLOBAL + *+ */ + @SerializedName(value = "scope") + private String scope; + /** + *
+ * 字段名:优惠类型 + * 变量名:type + * 是否必填:否 + * 类型:string[1,32] + * 描述: + * CASH:充值 + * NOCASH:预充值 + * 示例值:CASH + *+ */ + @SerializedName(value = "type") + private String type; + /** + *
+ * 字段名:优惠券面额 + * 变量名:amount + * 是否必填:是 + * 类型:int + * 描述: + * 优惠券面额 + * 示例值:100 + *+ */ + @SerializedName(value = "amount") + private Integer amount; + /** + *
+ * 字段名:活动ID + * 变量名:stock_id + * 是否必填:否 + * 类型:string[1,32] + * 描述: + * 活动ID + * 示例值:931386 + *+ */ + @SerializedName(value = "stock_id") + private String stockId; + /** + *
+ * 字段名:微信出资 + * 变量名:wechatpay_contribute + * 是否必填:否 + * 类型:int + * 描述: + * 微信出资,单位为分 + * 示例值:0 + *+ */ + @SerializedName(value = "wechatpay_contribute") + private Integer wechatpayContribute; + /** + *
+ * 字段名:商户出资 + * 变量名:merchant_contribute + * 是否必填:否 + * 类型:int + * 描述: + * 商户出资,单位为分 + * 示例值:0 + *+ */ + @SerializedName(value = "merchant_contribute") + private Integer merchantContribute; + /** + *
+ * 字段名:其他出资 + * 变量名:other_contribute + * 是否必填:否 + * 类型:int + * 描述: + * 其他出资,单位为分 + * 示例值:0 + *+ */ + @SerializedName(value = "other_contribute") + private Integer otherContribute; + /** + *
+ * 字段名:优惠币种 + * 变量名:currency + * 是否必填:否 + * 类型:string[1,16] + * 描述: + * CNY:人民币,境内商户号仅支持人民币。 + * 示例值:CNY + *+ */ + @SerializedName(value = "currency") + private String currency; + /** + *
+ * 字段名:单品列表 + * 变量名:goods_detail + * 是否必填:否 + * 类型:array + * 描述: + * 单品列表信息 + *+ */ + @SerializedName(value = "goods_detail") + private List
+ * 字段名:商品编码 + * 变量名:goods_id + * 是否必填:是 + * 类型:string[1,32] + * 描述: + * 商品编码 + * 示例值:M1006 + *+ */ + @SerializedName(value = "goods_id") + private String goodsId; + /** + *
+ * 字段名:商品数量 + * 变量名:quantity + * 是否必填:是 + * 类型:int + * 描述: + * 用户购买的数量 + * 示例值:1 + *+ */ + @SerializedName(value = "quantity") + private Integer quantity; + /** + *
+ * 字段名:商品单价 + * 变量名:unit_price + * 是否必填:是 + * 类型:int + * 描述: + * 商品单价,单位为分 + * 示例值:100 + *+ */ + @SerializedName(value = "unit_price") + private Integer unitPrice; + /** + *
+ * 字段名:商品优惠金额 + * 变量名:discount_amount + * 是否必填:是 + * 类型:int + * 描述: + * 商品优惠金额 + * 示例值:0 + *+ */ + @SerializedName(value = "discount_amount") + private Integer discountAmount; + /** + *
+ * 字段名:商品备注 + * 变量名:goods_remark + * 是否必填:否 + * 类型:string[1,128] + * 描述: + * 商品备注信息 + * 示例值:商品备注信息 + *+ */ + @SerializedName(value = "goods_remark") + private String goodsRemark; + } +} diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/PartnerTradeTypeEnum.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/PartnerTradeTypeEnum.java index 7704bf7d25..4d69b9240e 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/PartnerTradeTypeEnum.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/result/enums/PartnerTradeTypeEnum.java @@ -14,19 +14,19 @@ public enum PartnerTradeTypeEnum { /** * APP */ - APP("/v3/pay/partner/transactions/app", "/v3/combine-transactions/app"), + APP("/v3/pay/partner/transactions/app", "/v3/combine-transactions/app", TradeTypeEnum.APP), /** * JSAPI 或 小程序 */ - JSAPI("/v3/pay/partner/transactions/jsapi", "/v3/combine-transactions/jsapi"), + JSAPI("/v3/pay/partner/transactions/jsapi", "/v3/combine-transactions/jsapi", TradeTypeEnum.JSAPI), /** * NATIVE */ - NATIVE("/v3/pay/partner/transactions/native", "/v3/combine-transactions/native"), + NATIVE("/v3/pay/partner/transactions/native", "/v3/combine-transactions/native", TradeTypeEnum.NATIVE), /** * H5 */ - H5("/v3/pay/partner/transactions/h5", "/v3/combine-transactions/h5"); + H5("/v3/pay/partner/transactions/h5", "/v3/combine-transactions/h5", TradeTypeEnum.H5); /** * 单独下单url @@ -37,4 +37,9 @@ public enum PartnerTradeTypeEnum { * 合并下单url */ private final String combineUrl; + + /** + * 直连支付枚举 + */ + private final TradeTypeEnum directConnTrade; } diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java index 0ac0c43cc9..aa20645a31 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/WxPayService.java @@ -412,6 +412,53 @@ public interface WxPayService { */ WxPayOrderQueryV3Result queryOrderV3(WxPayOrderQueryV3Request request) throws WxPayException; + /** + *
+ * 服务商模式查询订单 + * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_2.shtml + * 商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。查询订单状态可通过微信支付订单号或商户订单号两种方式查询 + * 注意: + * 查询订单可通过微信支付订单号和商户订单号两种方式查询,两种查询方式返回结果相同 + * 需要调用查询接口的情况: + * ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知。 + * ◆ 调用支付接口后,返回系统错误或未知交易状态情况。 + * ◆ 调用付款码支付API,返回USERPAYING的状态。 + * ◆ 调用关单或撤销接口API之前,需确认支付状态。 + * 接口地址: + * https://api.mch.weixin.qq.com/v3/pay/partner/transactions/id/{transaction_id} + * https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/{out_trade_no} + *+ * + * @param transactionId 微信订单号 + * @param outTradeNo 商户系统内部的订单号,当没提供transactionId时需要传这个。 + * @return the wx pay order query result + * @throws WxPayException the wx pay exception + */ + WxPayPartnerOrderQueryV3Result queryPartnerOrderV3(String transactionId, String outTradeNo) throws WxPayException; + + /** + *
+ * 服务商模式查询订单 + * 详见 https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter4_1_2.shtml + * 商户可以通过查询订单接口主动查询订单状态,完成下一步的业务逻辑。查询订单状态可通过微信支付订单号或商户订单号两种方式查询 + * 注意: + * 查询订单可通过微信支付订单号和商户订单号两种方式查询,两种查询方式返回结果相同 + * 需要调用查询接口的情况: + * ◆ 当商户后台、网络、服务器等出现异常,商户系统最终未接收到支付通知。 + * ◆ 调用支付接口后,返回系统错误或未知交易状态情况。 + * ◆ 调用付款码支付API,返回USERPAYING的状态。 + * ◆ 调用关单或撤销接口API之前,需确认支付状态。 + * 接口地址: + * https://api.mch.weixin.qq.com/v3/pay/partner/transactions/id/{transaction_id} + * https://api.mch.weixin.qq.com/v3/pay/partner/transactions/out-trade-no/{out_trade_no} + *+ * + * @param request 查询订单请求对象 + * @return the wx pay order query result + * @throws WxPayException the wx pay exception + */ + WxPayPartnerOrderQueryV3Result queryPartnerOrderV3(WxPayPartnerOrderQueryV3Request request) throws WxPayException; + /** *
* 合单查询订单API @@ -602,7 +649,6 @@ public interface WxPayService { * @param tradeType the trade type * @param request 请求对象,注意一些参数如spAppid、spMchid等不用设置,方法内会自动从配置对象中获取到(前提是对应配置中已经设置) * @return the wx pay unified order result - * @throws WxPayException the wx pay exception */ WxPayUnifiedOrderV3Result unifiedPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException; diff --git a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java index 4cc2fc3c1c..aaa377c9b1 100644 --- a/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java +++ b/weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java @@ -498,6 +498,31 @@ public WxPayOrderQueryV3Result queryOrderV3(WxPayOrderQueryV3Request request) th return GSON.fromJson(response, WxPayOrderQueryV3Result.class); } + @Override + public WxPayPartnerOrderQueryV3Result queryPartnerOrderV3(String transactionId, String outTradeNo) throws WxPayException { + WxPayPartnerOrderQueryV3Request request = new WxPayPartnerOrderQueryV3Request(); + request.setOutTradeNo(StringUtils.trimToNull(outTradeNo)); + request.setTransactionId(StringUtils.trimToNull(transactionId)); + return this.queryPartnerOrderV3(request); + } + + @Override + public WxPayPartnerOrderQueryV3Result queryPartnerOrderV3(WxPayPartnerOrderQueryV3Request request) throws WxPayException { + if (StringUtils.isBlank(request.getSpMchId())) { + request.setSpMchId(this.getConfig().getMchId()); + } + if (StringUtils.isBlank(request.getSubMchId())) { + request.setSubMchId(this.getConfig().getSubMchId()); + } + String url = String.format("%s/v3/pay/partner/transactions/out-trade-no/%s", this.getPayBaseUrl(), request.getOutTradeNo()); + if (Objects.isNull(request.getOutTradeNo())) { + url = String.format("%s/v3/pay/partner/transactions/id/%s", this.getPayBaseUrl(), request.getTransactionId()); + } + String query = String.format("?sp_mchid=%s&sub_mchid=%s", request.getSpMchId(), request.getSubMchId()); + String response = this.getV3(url + query); + return GSON.fromJson(response, WxPayPartnerOrderQueryV3Result.class); + } + @Override public CombineQueryResult queryCombine(String combineOutTradeNo) throws WxPayException { String url = String.format("%s/v3/combine-transactions/out-trade-no/%s", this.getPayBaseUrl(), combineOutTradeNo); @@ -691,15 +716,34 @@ publicT createPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUn WxPayUnifiedOrderV3Result result = this.unifiedPartnerOrderV3(tradeType, request); //获取应用ID String appId = StringUtils.isBlank(request.getSubAppid()) ? request.getSpAppid() : request.getSubAppid(); - return result.getPartnerPayInfo(tradeType, appId, request.getSubMchId(), this.getConfig().getPrivateKey()); + return result.getPayInfo(tradeType.getDirectConnTrade(), appId, request.getSubMchId(), this.getConfig().getPrivateKey()); } @Override public WxPayUnifiedOrderV3Result unifiedPartnerOrderV3(PartnerTradeTypeEnum tradeType, WxPayPartnerUnifiedOrderV3Request request) throws WxPayException { - WxPayUnifiedOrderV3Result result = this.unifiedPartnerOrderV3(tradeType, request); - //获取应用ID - String appId = StringUtils.isBlank(request.getSubAppid()) ? request.getSpAppid() : request.getSubAppid(); - return result.getPartnerPayInfo(tradeType, appId, request.getSubMchId(), this.getConfig().getPrivateKey()); + if (StringUtils.isBlank(request.getSpAppid())) { + request.setSpAppid(this.getConfig().getAppId()); + } + + if (StringUtils.isBlank(request.getSpMchId())) { + request.setSpMchId(this.getConfig().getMchId()); + } + + if (StringUtils.isBlank(request.getNotifyUrl())) { + request.setNotifyUrl(this.getConfig().getNotifyUrl()); + } + + if (StringUtils.isBlank(request.getSubAppid())) { + request.setSubAppid(this.getConfig().getSubAppId()); + } + + if (StringUtils.isBlank(request.getSubMchId())) { + request.setSubMchId(this.getConfig().getSubMchId()); + } + + String url = this.getPayBaseUrl() + tradeType.getPartnerUrl(); + String response = this.postV3(url, GSON.toJson(request)); + return GSON.fromJson(response, WxPayUnifiedOrderV3Result.class); } @Override