Conversation
Co-authored-by: binarywang <1343140+binarywang@users.noreply.github.com>
|
@copilot 请用中文改下描述文字,包括PR的标题 |
已将PR描述更新为中文。关于PR标题,由于工具限制无法直接修改,需要您手动将标题改为:「微信支付付款码支付接口添加服务商模式支持」 |
There was a problem hiding this comment.
Pull request overview
本 PR 为微信支付付款码支付接口添加服务商模式支持,解决了在服务商模式下缺少 sub_mch_id 参数导致的 "受理机构必须传入sub_mch_id" 错误(issue #3676)。
主要变更:
- 在
WxPayCodepayRequest类中新增服务商模式所需的四个字段(sp_appid、sp_mchid、sub_appid、sub_mchid) - 在
BaseWxPayServiceImpl.codepay()方法中实现模式自动检测逻辑,根据服务商字段是否存在来选择调用直连商户或服务商 API 端点 - 保持了向后兼容性,现有的直连商户模式用法不受影响
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 5 comments.
| File | Description |
|---|---|
| weixin-java-pay/src/main/java/com/github/binarywang/wxpay/bean/request/WxPayCodepayRequest.java | 添加服务商模式所需的四个字段(sp_appid、sp_mchid、sub_appid、sub_mchid),包含完整的中文文档注释 |
| weixin-java-pay/src/main/java/com/github/binarywang/wxpay/service/impl/BaseWxPayServiceImpl.java | 修改 codepay 方法实现,增加服务商模式检测逻辑,根据检测结果调用不同的 API 端点并自动填充配置字段 |
| public WxPayCodepayResult codepay(WxPayCodepayRequest request) throws WxPayException { | ||
| if (StringUtils.isBlank(request.getAppid())) { | ||
| request.setAppid(this.getConfig().getAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getMchid())) { | ||
| request.setMchid(this.getConfig().getMchId()); | ||
| // 判断是否为服务商模式:如果设置了sp_appid或sp_mchid或sub_mchid中的任何一个,则认为是服务商模式 | ||
| boolean isPartnerMode = StringUtils.isNotBlank(request.getSpAppid()) | ||
| || StringUtils.isNotBlank(request.getSpMchid()) | ||
| || StringUtils.isNotBlank(request.getSubMchid()); | ||
|
|
||
| if (isPartnerMode) { | ||
| // 服务商模式 | ||
| if (StringUtils.isBlank(request.getSpAppid())) { | ||
| request.setSpAppid(this.getConfig().getAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSpMchid())) { | ||
| request.setSpMchid(this.getConfig().getMchId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSubAppid())) { | ||
| request.setSubAppid(this.getConfig().getSubAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSubMchid())) { | ||
| request.setSubMchid(this.getConfig().getSubMchId()); | ||
| } | ||
| String url = String.format("%s/v3/pay/partner/transactions/codepay", this.getPayBaseUrl()); | ||
| String body = this.postV3WithWechatpaySerial(url, GSON.toJson(request)); | ||
| return GSON.fromJson(body, WxPayCodepayResult.class); | ||
| } else { | ||
| // 直连商户模式 | ||
| if (StringUtils.isBlank(request.getAppid())) { | ||
| request.setAppid(this.getConfig().getAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getMchid())) { | ||
| request.setMchid(this.getConfig().getMchId()); | ||
| } | ||
| String url = String.format("%s/v3/pay/transactions/codepay", this.getPayBaseUrl()); | ||
| String body = this.postV3WithWechatpaySerial(url, GSON.toJson(request)); | ||
| return GSON.fromJson(body, WxPayCodepayResult.class); | ||
| } | ||
| String url = String.format("%s/v3/pay/transactions/codepay", this.getPayBaseUrl()); | ||
| String body = this.postV3WithWechatpaySerial(url, GSON.toJson(request)); | ||
| return GSON.fromJson(body, WxPayCodepayResult.class); | ||
| } |
There was a problem hiding this comment.
此实现偏离了项目中处理服务商模式的既定模式。现有的服务商模式实现(如 queryPartnerOrderV3、closePartnerOrderV3、unifiedPartnerOrderV3 等)使用单独的方法,而不是在同一方法中自动检测模式。建议考虑创建单独的 codepayPartner 方法以保持 API 设计的一致性,或者如果自动检测是有意的设计决策,请在代码注释中说明原因。
| || StringUtils.isNotBlank(request.getSpMchid()) | ||
| || StringUtils.isNotBlank(request.getSubMchid()); | ||
|
|
||
| if (isPartnerMode) { | ||
| // 服务商模式 | ||
| if (StringUtils.isBlank(request.getSpAppid())) { | ||
| request.setSpAppid(this.getConfig().getAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSpMchid())) { | ||
| request.setSpMchid(this.getConfig().getMchId()); | ||
| } |
There was a problem hiding this comment.
如果字段名从 spMchid 更改为 spMchId 以保持一致性,此处的方法调用也需要相应更新为 request.getSpMchId() 和 request.setSpMchId()。
| || StringUtils.isNotBlank(request.getSubMchid()); | ||
|
|
||
| if (isPartnerMode) { | ||
| // 服务商模式 | ||
| if (StringUtils.isBlank(request.getSpAppid())) { | ||
| request.setSpAppid(this.getConfig().getAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSpMchid())) { | ||
| request.setSpMchid(this.getConfig().getMchId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSubAppid())) { | ||
| request.setSubAppid(this.getConfig().getSubAppId()); | ||
| } | ||
| if (StringUtils.isBlank(request.getSubMchid())) { | ||
| request.setSubMchid(this.getConfig().getSubMchId()); | ||
| } |
There was a problem hiding this comment.
如果字段名从 subMchid 更改为 subMchId 以保持一致性,此处的方法调用也需要相应更新为 request.getSubMchId() 和 request.setSubMchId()。
| * </pre> | ||
| */ | ||
| @SerializedName(value = "sp_mchid") | ||
| protected String spMchid; |
There was a problem hiding this comment.
字段命名与现有的服务商请求类不一致。在 WxPayPartnerUnifiedOrderV3Request 中,对应字段命名为 spMchId(Id 的 'I' 大写),而此处使用 spMchid(全小写)。为保持代码库的一致性,建议将字段名改为 spMchId 以匹配现有模式。
| protected String spMchid; | |
| protected String spMchId; |
| * </pre> | ||
| */ | ||
| @SerializedName(value = "sub_mchid") | ||
| protected String subMchid; |
There was a problem hiding this comment.
字段命名与现有的服务商请求类不一致。在 WxPayPartnerUnifiedOrderV3Request 中,对应字段命名为 subMchId(Id 的 'I' 大写),而此处使用 subMchid(全小写)。为保持代码库的一致性,建议将字段名改为 subMchId 以匹配现有模式。
| protected String subMchid; | |
| protected String subMchId; |
当前
WxPayCodepayRequest类仅支持直连商户模式,缺少服务商模式支持,服务商模式需要sub_mch_id参数。在服务商模式下使用付款码支付接口时,用户会遇到以下错误:本PR所做的更改:
为
WxPayCodepayRequest添加服务商模式字段:sp_appid- 服务商应用IDsp_mchid- 服务商商户号sub_appid- 子商户应用IDsub_mchid- 子商户号(解决问题的关键字段)更新服务实现以支持两种模式:
sp_appid、sp_mchid或sub_mchid中的任意一个时,自动检测为服务商模式/v3/pay/partner/transactions/codepay/v3/pay/transactions/codepayWxPayConfig填充缺失的字段向后兼容性
本实现保持向后兼容性 - 现有的直连商户模式用法保持不变。服务商模式的使用示例:
修复 #3676。
💡 You can make Copilot smarter by setting up custom instructions, customizing its development environment and configuring Model Context Protocol (MCP) servers. Learn more Copilot coding agent tips in the docs.