Skip to content

Commit

Permalink
实现 微信支付APIv3 - 资金应用 - 分账 (#114)
Browse files Browse the repository at this point in the history
* [WeChatPay.V3] 实现 分账 - 请求分账

* [WeChatPay.V3] 实现 分账(服务商) - 分账动账通知

* [WeChatPay.V3] 实现 分账 - 查询分账结果

* 修正链接

* [WeChatPay.V3] 实现 分账 - 请求分账回退

* [WeChatPay.V3] 实现 分账 - 查询分账回退结果

* [WeChatPay.V3] 实现 分账 - 解冻剩余资金

* [WeChatPay.V3] 实现 分账 - 查询剩余待分金额

* [WeChatPay.V3] 实现 分账 - 查询最大分账比例

* .

* [WeChatPay.V3] 实现 分账 - 添加分账接收方

* [WeChatPay.V3] 实现 分账 - 删除分账接收方

* 更新 README.md
  • Loading branch information
roc916 authored Jun 9, 2021
1 parent 01918e3 commit fb685e7
Show file tree
Hide file tree
Showing 29 changed files with 1,654 additions and 7 deletions.
4 changes: 3 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -125,10 +125,12 @@ Package | NuGet | Downloads

* V3版 [开发者文档](https://pay.weixin.qq.com/wiki/doc/apiv3/index.shtml)
- 基础支付
- 分账
- 微信支付分
- 商户进件(服务商)
- 基础支付(服务商)

- 分账(服务商)

## 致谢

- [Alipay](https://github.com/alipay)
Expand Down
28 changes: 24 additions & 4 deletions src/Essensoft.Paylink.WeChatPay/V3/Domain/Receiver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,22 +11,42 @@ public class Receiver : WeChatPayObject
/// 分账接收方类型
/// </summary>
/// <remarks>
/// MERCHANT_ID:商户号(mch_id或者sub_mch_id)
/// 1、MERCHANT_ID:商户号
/// 2、PERSONAL_OPENID:个人openid(由父商户APPID转换得到)
/// 3、PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到)
/// <para>示例值: MERCHANT_ID</para>
/// </remarks>
[JsonPropertyName("type")]
public int Type { get; set; }
public string Type { get; set; }

/// <summary>
/// 分账接收方帐号
/// </summary>
/// <remarks>
/// 申请本功能商户号
/// <para>示例值: 1900000100</para>
/// 1、分账接收方类型为MERCHANT_ID时,分账接收方账号为商户号
/// 2、分账接收方类型为PERSONAL_OPENID时,分账接收方账号为个人openid
/// 3、分账接收方类型为
/// PERSONAL_SUB_OPENID时,分账接收方账号为个人sub_openid
/// <para>示例值: 86693852</para>
/// </remarks>
[JsonPropertyName("account")]
public string Account { get; set; }

/// <summary>
/// 分账个人接收方姓名
/// </summary>
/// <remarks>
/// 可选项,在接收方类型为个人的时可选填,若有值,会检查与 name 是否实名匹配,不匹配会拒绝分账请求
/// 1、分账接收方类型是PERSONAL_OPENID或PERSONAL_SUB_OPENID时,是个人姓名的密文(选传,传则校验) 此字段的加密方法详见:敏感信息加密说明
/// 2、使用微信支付平台证书中的公钥
/// 3、使用RSAES-OAEP算法进行加密
/// 4、将请求中HTTP头部的Wechatpay-Serial设置为证书序列号
/// <para>示例值: hu89ohu89ohu89o</para>
/// </remarks>
[WeChatPayPrivacyProperty]
[JsonPropertyName("name")]
public string Name { get; set; }

/// <summary>
/// 分账动账金额
/// </summary>
Expand Down
103 changes: 103 additions & 0 deletions src/Essensoft.Paylink.WeChatPay/V3/Domain/ReceiverResponse.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
using System.Text.Json.Serialization;

namespace Essensoft.Paylink.WeChatPay.V3.Domain
{
/// <summary>
/// 分账接收方
/// </summary>
public class ReceiverResponse : WeChatPayObject
{
/// <summary>
/// 分账金额
/// </summary>
/// <remarks>
/// 分账金额,单位为分,只能为整数,不能超过原订单支付金额及最大分账比例金额
/// <para>示例值: 100</para>
/// </remarks>
[JsonPropertyName("amount")]
public int Amount { get; set; }

/// <summary>
/// 分账描述
/// </summary>
/// <remarks>
/// 分账的原因描述,分账账单中需要体现
/// <para>示例值: 分给商户1900000110</para>
/// </remarks>
[JsonPropertyName("description")]
public string Description { get; set; }

/// <summary>
/// 分账接收方类型
/// </summary>
/// <remarks>
/// 1、MERCHANT_ID:商户号
/// 2、PERSONAL_OPENID:个人openid(由父商户APPID转换得到)
/// 3、PERSONAL_SUB_OPENID: 个人sub_openid(由子商户APPID转换得到)
/// <para>示例值: MERCHANT_ID</para>
/// </remarks>
[JsonPropertyName("type")]
public string Type { get; set; }

/// <summary>
/// 分账接收方帐号
/// </summary>
/// <remarks>
/// 1、分账接收方类型为MERCHANT_ID时,分账接收方账号为商户号
/// 2、分账接收方类型为PERSONAL_OPENID时,分账接收方账号为个人openid
/// 3、分账接收方类型为
/// PERSONAL_SUB_OPENID时,分账接收方账号为个人sub_openid
/// <para>示例值: 1900000109</para>
/// </remarks>
[JsonPropertyName("account")]
public string Account { get; set; }

/// <summary>
/// 分账结果
/// </summary>
/// <remarks>
/// 枚举值:
/// 1、PENDING:待分账
/// 2、SUCCESS:分账成功
/// 3、CLOSED:已关闭
/// <para>示例值: SUCCESS</para>
/// </remarks>
[JsonPropertyName("result")]
public string Result { get; set; }

/// <summary>
/// 分账失败原因
/// </summary>
/// <remarks>
/// 分账失败原因。包含以下枚举值:
/// 1、ACCOUNT_ABNORMAL : 分账接收账户异常
/// 2、NO_RELATION : 分账关系已解除
/// 3、RECEIVER_HIGH_RISK : 高风险接收方
/// 4、RECEIVER_REAL_NAME_NOT_VERIFIED : 接收方未实名
/// 5、NO_AUTH : 分账权限已解除
/// <para>示例值:ACCOUNT_ABNORMAL</para>
/// </remarks>
[JsonPropertyName("fail_reason")]
public string FailReason { get; set; }

/// <summary>
/// 分账创建时间
/// </summary>
/// <remarks>
/// 分账创建时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
/// <para>示例值:2015-05-20T13:29:35.120+08:00</para>
/// </remarks>
[JsonPropertyName("create_time")]
public string CreateTime { get; set; }

/// <summary>
/// 分账完成时间
/// </summary>
/// <remarks>
/// 分账完成时间,遵循rfc3339标准格式,格式为YYYY-MM-DDTHH:mm:ss.sss+TIMEZONE,YYYY-MM-DD表示年月日,T出现在字符串中,表示time元素的开头,HH:mm:ss.sss表示时分秒毫秒,TIMEZONE表示时区(+08:00表示东八区时间,领先UTC 8小时,即北京时间)。例如:2015-05-20T13:29:35.120+08:00表示,北京时间2015年5月20日 13点29分35秒。
/// <para>示例值:2015-05-20T13:29:35.120+08:00</para>
/// </remarks>
[JsonPropertyName("finish_time")]
public string FinishTime { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
using System.Collections.Generic;
using System.Text.Json.Serialization;

namespace Essensoft.Paylink.WeChatPay.V3.Domain
{
/// <summary>
/// 资金应用 - 分账 - 请求分账 - 请求JSON参数
/// </summary>
/// <remarks>
/// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_1.shtml">分账 - 请求分账API</a> - 最新更新时间:2021.05.11</para>
/// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_1_1.shtml">分账(服务商) - 请求分账API</a> - 最新更新时间:2021.05.11</para>
/// </remarks>
public class WeChatPayProfitSharingOrdersBodyModel : WeChatPayObject
{
/// <summary>
/// 子商户号
/// </summary>
/// <remarks>
/// 微信支付分配的子商户号,即分账的出资商户号。
/// <para>示例值:1900000109</para>
/// </remarks>
[JsonPropertyName("sub_mchid")]
public string SubMchId { get; set; }

/// <summary>
/// 应用ID
/// </summary>
/// <remarks>
/// 微信分配的商户appid、微信分配的服务商appid
/// <para>示例值:wx8888888888888888</para>
/// </remarks>
[JsonPropertyName("appid")]
public string AppId { get; set; }

/// <summary>
/// 子商户应用ID
/// </summary>
/// <remarks>
/// 微信分配的子商户公众账号ID,分账接收方类型包含PERSONAL_SUB_OPENID时必填。
/// <para>示例值:wx8888888888888888</para>
/// </remarks>
[JsonPropertyName("sub_appid")]
public string SubAppId { get; set; }

/// <summary>
/// 微信订单号
/// </summary>
/// <remarks>
/// 微信支付订单号
/// <para>示例值:4208450740201411110007820472</para>
/// </remarks>
[JsonPropertyName("transaction_id")]
public string TransactionId { get; set; }

/// <summary>
/// 商户分账单号
/// </summary>
/// <remarks>
/// 服务商系统内部的分账单号,在服务商系统内部唯一,同一分账单号多次请求等同一次。只能是数字、大小写字母_-|*@
/// <para>示例值:P20150806125346</para>
/// </remarks>
[JsonPropertyName("out_order_no")]
public string OutOrderNo { get; set; }

/// <summary>
/// 分账接收方列表
/// </summary>
/// <remarks>
/// 分账接收方列表,可以设置出资商户作为分账接受方,最多可有50个分账接收方
/// </remarks>
[JsonPropertyName("receivers")]
public List<Receiver> Receivers { get; set; }

/// <summary>
/// 是否解冻剩余未分资金
/// </summary>
/// <remarks>
/// 1、如果为true,该笔订单剩余未分账的金额会解冻回分账方商户;
/// 2、如果为false,该笔订单剩余未分账的金额不会解冻回分账方商户,可以对该笔订单再次进行分账。
/// <para>示例值:true</para>
/// </remarks>
[JsonPropertyName("unfreeze_unsplit")]
public bool UnfreezeUnsplit { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using System.Text.Json.Serialization;

namespace Essensoft.Paylink.WeChatPay.V3.Domain
{
/// <summary>
/// 资金应用 - 分账 - 查询分账结果 - 请求URL参数
/// </summary>
/// <remarks>
/// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_2.shtml">分账 - 查询分账结果API</a> - 最新更新时间:2021.05.11</para>
/// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_1_2.shtml">分账(服务商) - 查询分账结果API</a> - 最新更新时间:2021.05.11</para>
/// </remarks>
public class WeChatPayProfitSharingOrdersOutOrderNoQueryModel : WeChatPayObject
{
/// <summary>
/// 子商户号
/// </summary>
/// <remarks>
/// 子商户的商户号,有微信支付生成并下发。
/// <para>示例值:1900000109</para>
/// </remarks>
[JsonPropertyName("sub_mchid")]
public string SubMchId { get; set; }

/// <summary>
/// 微信订单号
/// </summary>
/// <remarks>
/// 微信支付订单号
/// <para>示例值:4208450740201411110007820472</para>
/// </remarks>
[JsonPropertyName("transaction_id")]
public string TransactionId { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
using System.Text.Json.Serialization;

namespace Essensoft.Paylink.WeChatPay.V3.Domain
{
/// <summary>
/// 资金应用 - 分账 - 解冻剩余资金 - 请求JSON参数
/// </summary>
/// <remarks>
/// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_1_5.shtml">分账 - 解冻剩余资金API</a> - 最新更新时间:2021.05.11</para>
/// <para><a href="https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter8_1_5.shtml">分账(服务商) - 解冻剩余资金API</a> - 最新更新时间:2021.05.11</para>
/// </remarks>
public class WeChatPayProfitSharingOrdersUnfreezeResponse : WeChatPayObject
{
/// <summary>
/// 子商户号
/// </summary>
/// <remarks>
/// 微信支付分配的子商户号,即分账的出资商户号。
/// <para>示例值:1900000109</para>
/// </remarks>
[JsonPropertyName("sub_mchid")]
public string SubMchId { get; set; }

/// <summary>
/// 微信订单号
/// </summary>
/// <remarks>
/// 微信支付订单号
/// <para>示例值:4208450740201411110007820472</para>
/// </remarks>
[JsonPropertyName("transaction_id")]
public string TransactionId { get; set; }

/// <summary>
/// 商户分账单号
/// </summary>
/// <remarks>
/// 商户系统内部的分账单号,在商户系统内部唯一,同一分账单号多次请求等同一次。 取值范围:[0-9a-zA-Z_*@-]
/// <para>示例值:P20150806125346</para>
/// </remarks>
[JsonPropertyName("out_order_no")]
public string OutOrderNo { get; set; }

/// <summary>
/// 分账描述
/// </summary>
/// <remarks>
/// 分账的原因描述,分账账单中需要体现
/// <para>示例值:解冻全部剩余资金</para>
/// </remarks>
[JsonPropertyName("description")]
public string Description { get; set; }
}
}
Loading

0 comments on commit fb685e7

Please sign in to comment.