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 2a33910fd..58f3dbb2a 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 @@ import java.util.List; * 微信支付服务商下单回调 * 文档见: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 f3dcf168b..fc0007565 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 @@ import java.io.Serializable; * 微信支付服务商退款回调 * 文档见: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 7a62629fb..2696bcf60 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 @@ import java.io.Serializable; * 服务商关闭订单请求对象类 * 文档见: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 000000000..d22fcf395 --- /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 299cf2a94..c522c90d8 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 @@ import java.util.List; * 微信支付服务商退款请求 * 文档见: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 4e60f0693..b121170c3 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 @@ import java.util.List; /** * 微信支付服务商下单请求对象 * - * @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 000000000..4c540638c --- /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 7704bf7d2..4d69b9240 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 0ac0c43cc..aa20645a3 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 4cc2fc3c1..aaa377c9b 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 abstract class BaseWxPayServiceImpl implements WxPayService {
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 @@ public abstract class BaseWxPayServiceImpl implements WxPayService {
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