Commit ecda180b authored by 吴春's avatar 吴春

提交代码

parent 1d041489
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.GenerateOrder
{
/// <summary>
/// 微信支付下单实体,都是必填的字段,非必填的字段就没有写
/// </summary>
public class GenerateOrderModelForWxPay
{
/// <summary>
/// 直连商户申请的公众号或移动应用appid。
/// </summary>
public string appid { set; get; }
/// <summary>
/// 直连商户的商户号,由微信支付生成并下发。
/// </summary>
public string mchid { set; get; }
/// <summary>
/// 商品描述
/// </summary>
public string description { set; get; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
/// </summary>
public string out_trade_no { set; get; }
/// <summary>
/// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
/// </summary>
public string attach { set; get; }
/// <summary>
/// 通知URL必须为直接可访问的URL,不允许携带查询串。格式:URL
/// </summary>
public string notify_url { set; get; }
/// <summary>
/// 订单金额信息
/// </summary>
public WxPayAmountModel amount { set; get; }
}
/// <summary>
/// 微信支付金额实体
/// </summary>
public class WxPayAmountModel
{
/// <summary>
/// 订单总金额,单位为分。
/// </summary>
public int total { set; get; }
/// <summary>
/// 货币类型,CNY:人民币,境内商户号仅支持人民币。
/// </summary>
public string currency { set; get; } = "CNY";
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.GenerateOrder
{
public class NativePayModel
{
/// <summary>
/// 预支付id
/// </summary>
public string prepay_id { set; get; }
public string code_url { get; set; }
/// <summary>
/// 签名
/// </summary>
public string signature { set; get; }
/// <summary>
/// 时间戳
/// </summary>
public string timestamp { set; get; }
/// <summary>
/// 随机字符串
/// </summary>
public string noncestr { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.GenerateOrder
{
public class WxPayRespModel
{
/// <summary>
/// 预支付id
/// </summary>
public string prepay_id { set; get; }
/// <summary>
/// 如果prepay_id为null的话,这个就会有错误的编码
/// 参考地址:https://pay.weixin.qq.com/wiki/doc/apiv3/Share/error_code.shtml
/// </summary>
public string code { set; get; }
/// <summary>
/// 如果prepay_id为null的话,这个就会有具体的错误信息和原因
/// </summary>
public string message { set; get; }
public string code_url { get; set; }
/// <summary>
/// 是否下单成功
/// </summary>
public bool success_union_order
{
get
{
if (string.IsNullOrEmpty(prepay_id) && !string.IsNullOrEmpty(code))
{
return false;
}
return true;
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.QueryOrder
{
public class WxPayStatusRespModel
{
public string appid { get; set; }
public string mchid { get; set; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
/// </summary>
public string out_trade_no { get; set; }
/// <summary>
/// 微信支付系统生成的订单号。
/// </summary>
public string transaction_id { get; set; }
/// <summary>
/// 交易类型,枚举值:
/// JSAPI:公众号支付
/// NATIVE:扫码支付
/// APP:APP支付
/// MICROPAY:付款码支付
/// MWEB:H5支付
/// FACEPAY:刷脸支付
/// </summary>
public string trade_type { get; set; }
/// <summary>
/// 交易状态,枚举值:
/// SUCCESS:支付成功
/// REFUND:转入退款
/// NOTPAY:未支付
/// CLOSED:已关闭
/// REVOKED:已撤销(付款码支付)
/// USERPAYING:用户支付中(付款码支付)
/// PAYERROR:支付失败(其他原因,如银行返回失败)
/// ACCEPT:已接收,等待扣款
/// </summary>
public string trade_state { get; set; }
/// <summary>
/// 交易状态描述
/// </summary>
public string trade_state_desc { get; set; }
/// <summary>
/// 附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用
/// </summary>
public string attach { set; get; }
/// <summary>
/// 支付完成时间 示例值:2018-06-08T10:34:56+08:00
/// </summary>
public string success_time { get; set; }
/// <summary>
/// 支付者信息
/// </summary>
public WxPayerModel payer { set; get; }
public WxPayerResourceAmountModel amount { get; set; }
/// <summary>
/// 错误的编码
/// 参考地址:https://pay.weixin.qq.com/wiki/doc/apiv3/Share/error_code.shtml
/// </summary>
public string code { set; get; }
/// <summary>
/// 具体的错误信息和原因
/// </summary>
public string message { set; get; }
/// <summary>
/// 订单查询是否成功
/// </summary>
public bool success_query_order
{
get
{
if (!string.IsNullOrEmpty(code))
{
return false;
}
return true;
}
}
}
/// <summary>
/// 订金支付金额实体
/// </summary>
public class WxPayerResourceAmountModel
{
/// <summary>
/// 订单总金额,单位为分。
/// </summary>
public int total { get; set; }
/// <summary>
/// 用户支付金额,单位为分。
/// </summary>
public int payer_total { get; set; }
/// <summary>
/// CNY:人民币,境内商户号仅支持人民币
/// </summary>
public string currency { get; set; }
/// <summary>
/// 用户支付币种
/// </summary>
public string payer_currency { get; set; }
}
/// <summary>
/// 支付用户信息实体
/// </summary>
public class WxPayerModel
{
/// <summary>
/// 用户在直连商户appid下的唯一标识。
/// </summary>
public string openid { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.QueryRefunds
{
public class QueryRefundsOrderRespModel
{
/// <summary>
/// 微信支付退款号。
/// </summary>
public string refund_id { set; get; }
/// <summary>
/// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
/// 示例值:1217752501201407033233368018
/// </summary>
public string out_refund_no { set; get; }
/// <summary>
/// 微信支付交易订单号。
/// </summary>
public string transaction_id { set; get; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
/// 原支付交易对应的商户订单号
/// </summary>
public string out_trade_no { set; get; }
/// <summary>
/// 枚举值:
/// ORIGINAL:原路退款
/// BALANCE:退回到余额
/// OTHER_BALANCE:原账户异常退到其他余额账户
/// OTHER_BANKCARD:原银行卡异常退到其他银行卡
/// </summary>
public string channel { set; get; }
/// <summary>
/// 取当前退款单的退款入账方,有以下几种情况:
/// 1)退回银行卡:{银行名称}{卡类型}{ 卡尾号}
/// 2)退回支付用户零钱:支付用户零钱
/// 3)退还商户:商户基本账户商户结算银行账户
/// 4)退回支付用户零钱通:支付用户零钱通。
/// </summary>
public string user_received_account { set; get; }
/// <summary>
/// 退款成功时间,当退款状态为退款成功时有返回。遵循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秒
/// </summary>
public string success_time { set; get; }
/// <summary>
/// 退款受理时间。 遵循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秒。
/// </summary>
public string create_time { set; get; }
/// <summary>
/// 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。
/// 枚举值:
/// SUCCESS:退款成功
/// CLOSED:退款关闭
/// PROCESSING:退款处理中
/// ABNORMAL:退款异常
/// </summary>
public string status { set; get; }
/// <summary>
/// 退款所使用资金对应的资金账户类型。 枚举值:
/// UNSETTLED : 未结算资金
/// AVAILABLE : 可用余额
/// UNAVAILABLE : 不可用余额
/// OPERATION : 运营户
/// </summary>
public string funds_account { set; get; }
/// <summary>
/// 金额详细信息。
/// </summary>
public QueryRefundsRespAmountModel amount { set; get; }
}
/// <summary>
/// 退款订单金额信息。
/// </summary>
public class QueryRefundsRespAmountModel
{
/// <summary>
/// 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。
/// </summary>
public int refund { set; get; }
/// <summary>
/// 原支付交易的订单总金额,币种的最小单位,只能为整数。
/// </summary>
public int total { set; get; }
/// <summary>
/// 现金支付金额,单位为分,只能为整数。
/// </summary>
public int payer_total { set; get; }
/// <summary>
/// 退款给用户的金额,不包含所有优惠券金额。
/// </summary>
public int payer_refund { set; get; }
/// <summary>
/// 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分
/// </summary>
public int settlement_refund { set; get; }
/// <summary>
/// 优惠退款金额 <=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分。
/// </summary>
public int discount_refund { set; get; }
/// <summary>
/// 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。
/// </summary>
public string currency { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.Refunds
{
public class RefundsRequestModel
{
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
/// 原支付交易对应的商户订单号
/// </summary>
public string out_trade_no { set; get; }
/// <summary>
/// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
/// 示例值:1217752501201407033233368018
/// </summary>
public string out_refund_no { set; get; }
/// <summary>
/// 若商户传入,会在下发给用户的退款消息中体现退款原因。
/// 示例值:商品已售完
/// 非必填
/// </summary>
public string reason { set; get; }
/// <summary>
/// 异步接收微信支付退款结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效,优先回调当前传的这个地址。
/// 示例值:https://weixin.qq.com, 必须是https的网址
/// </summary>
public string notify_url { set; get; }
/// <summary>
/// 退款金额实体
/// </summary>
public RefundsAmountModel amount { set; get; }
}
/// <summary>
/// 退款订单金额信息。
/// </summary>
public class RefundsAmountModel
{
/// <summary>
/// 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。
/// </summary>
public int refund { set; get; }
/// <summary>
/// 原支付交易的订单总金额,币种的最小单位,只能为整数。
/// </summary>
public int total { set; get; }
/// <summary>
/// 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。
/// </summary>
public string currency { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.Refunds
{
public class RefundsRespModel
{
/// <summary>
/// 微信支付退款号。
/// </summary>
public string refund_id { set; get; }
/// <summary>
/// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
/// 示例值:1217752501201407033233368018
/// </summary>
public string out_refund_no { set; get; }
/// <summary>
/// 微信支付交易订单号。
/// </summary>
public string transaction_id { set; get; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
/// 原支付交易对应的商户订单号
/// </summary>
public string out_trade_no { set; get; }
/// <summary>
/// 枚举值:
/// ORIGINAL:原路退款
/// BALANCE:退回到余额
/// OTHER_BALANCE:原账户异常退到其他余额账户
/// OTHER_BANKCARD:原银行卡异常退到其他银行卡
/// </summary>
public string channel { set; get; }
/// <summary>
/// 取当前退款单的退款入账方,有以下几种情况:
/// 1)退回银行卡:{银行名称}{卡类型}{ 卡尾号}
/// 2)退回支付用户零钱:支付用户零钱
/// 3)退还商户:商户基本账户商户结算银行账户
/// 4)退回支付用户零钱通:支付用户零钱通。
/// </summary>
public string user_received_account { set; get; }
/// <summary>
/// 退款成功时间,当退款状态为退款成功时有返回。遵循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秒
/// </summary>
public string success_time { set; get; }
/// <summary>
/// 退款受理时间。 遵循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秒。
/// </summary>
public string create_time { set; get; }
/// <summary>
/// 退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往商户平台-交易中心,手动处理此笔退款。
/// 枚举值:
/// SUCCESS:退款成功
/// CLOSED:退款关闭
/// PROCESSING:退款处理中
/// ABNORMAL:退款异常
/// </summary>
public string status { set; get; }
/// <summary>
/// 退款所使用资金对应的资金账户类型。 枚举值:
/// UNSETTLED : 未结算资金
/// AVAILABLE : 可用余额
/// UNAVAILABLE : 不可用余额
/// OPERATION : 运营户
/// </summary>
public string funds_account { set; get; }
/// <summary>
/// 金额详细信息。
/// </summary>
public RefundsRespAmountModel amount { set; get; }
}
/// <summary>
/// 退款订单金额信息。
/// </summary>
public class RefundsRespAmountModel
{
/// <summary>
/// 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。
/// </summary>
public int refund { set; get; }
/// <summary>
/// 原支付交易的订单总金额,币种的最小单位,只能为整数。
/// </summary>
public int total { set; get; }
/// <summary>
/// 现金支付金额,单位为分,只能为整数。
/// </summary>
public int payer_total { set; get; }
/// <summary>
/// 退款给用户的金额,不包含所有优惠券金额。
/// </summary>
public int payer_refund { set; get; }
/// <summary>
/// 应结订单金额=订单金额-免充值代金券金额,应结订单金额<=订单金额,单位为分
/// </summary>
public int settlement_refund { set; get; }
/// <summary>
/// 优惠退款金额 <=退款金额,退款金额-代金券或立减优惠退款金额为现金,说明详见代金券或立减优惠,单位为分。
/// </summary>
public int discount_refund { set; get; }
/// <summary>
/// 符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。
/// </summary>
public string currency { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.RefundsCallback
{
public class RefundsCallbackDecryptModel
{
/// <summary>
/// 直连商户的商户号,由微信支付生成并下发。
/// </summary>
public string mchid { set; get; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一
/// 原支付交易对应的商户订单号
/// </summary>
public string out_trade_no { set; get; }
/// <summary>
/// 微信支付交易订单号。
/// </summary>
public string transaction_id { set; get; }
/// <summary>
/// 商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。
/// 示例值:1217752501201407033233368018
/// </summary>
public string out_refund_no { set; get; }
/// <summary>
/// 微信支付退款号。
/// </summary>
public string refund_id { set; get; }
/// <summary>
/// 退款状态,枚举值:
/// SUCCESS:退款成功
/// CLOSED:退款关闭
/// ABNORMAL:退款异常,退款到银行发现用户的卡作废或者冻结了,导致原路退款银行卡失败,可前往【服务商平台—>交易中心】,手动处理此笔退款
/// </summary>
public string refund_status { set; get; }
/// <summary>
/// 退款成功时间,当退款状态为退款成功时有返回。遵循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秒
/// </summary>
public string success_time { set; get; }
/// <summary>
/// 取当前退款单的退款入账方,有以下几种情况:
/// 1)退回银行卡:{银行名称}{卡类型}{ 卡尾号}
/// 2)退回支付用户零钱:支付用户零钱
/// 3)退还商户:商户基本账户商户结算银行账户
/// 4)退回支付用户零钱通:支付用户零钱通。
/// </summary>
public string user_received_account { set; get; }
/// <summary>
/// 金额信息
/// </summary>
public RefundsCallbackRespAmountModel amount { set; get; }
}
/// <summary>
/// 退款订单金额信息。
/// </summary>
public class RefundsCallbackRespAmountModel
{
/// <summary>
/// 原支付交易的订单总金额,币种的最小单位,只能为整数。
/// </summary>
public int total { set; get; }
/// <summary>
/// 退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额,如果有使用券,后台会按比例退。
/// </summary>
public int refund { set; get; }
/// <summary>
/// 现金支付金额,单位为分,只能为整数。
/// </summary>
public int payer_total { set; get; }
/// <summary>
/// 退款给用户的金额,不包含所有优惠券金额。
/// </summary>
public int payer_refund { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.RefundsCallback
{
public class RefundsCallbackModel
{
/// <summary>
/// 通知的唯一ID
/// </summary>
public string id { set; get; }
/// <summary>
/// 通知创建时间,格式为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年05月20日13点29分35秒。
/// </summary>
public string create_time { set; get; }
/// <summary>
/// 通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS
/// </summary>
public string event_type { set; get; }
/// <summary>
/// 回调摘要
/// </summary>
public string summary { set; get; }
/// <summary>
/// 通知的资源数据类型,支付成功通知为encrypt-resource
/// </summary>
public string resource_type { set; get; }
/// <summary>
/// 通知资源数据,json格式
/// </summary>
public RefundsCallbackResourceModel resource { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.RefundsCallback
{
public class RefundsCallbackResourceModel
{
/// <summary>
/// 对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM
/// </summary>
public string algorithm { set; get; }
/// <summary>
/// 原始回调类型,为transaction
/// </summary>
public string original_type { set; get; }
/// <summary>
/// Base64编码后的开启/停用结果数据密文
/// </summary>
public string ciphertext { set; get; }
/// <summary>
/// 附加数据
/// </summary>
public string associated_data { set; get; }
/// <summary>
/// 加密使用的随机串
/// </summary>
public string nonce { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.RefundsCallback
{
public class RefundsCallbackRespModel
{
/// <summary>
/// 返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。
/// </summary>
public string code { set; get; } = "FAIL";//"SUCCESS";
/// <summary>
/// 返回信息,如非空,为错误原因。
/// </summary>
public string message { set; get; } = string.Empty;
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.WxPayCallback
{
public class WxPayCallbackRespModel
{
/// <summary>
/// 返回状态码,错误码,SUCCESS为清算机构接收成功,其他错误码为失败。
/// </summary>
public string code { set; get; } = "SUCCESS";
/// <summary>
/// 返回信息,如非空,为错误原因。
/// </summary>
public string message { set; get; } = string.Empty;
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.WxPayCallback
{
public class WxPayNotifyModel
{
/// <summary>
/// 通知的唯一ID
/// </summary>
public string id { set; get; }
/// <summary>
/// 通知创建时间,格式为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年05月20日13点29分35秒。
/// </summary>
public string create_time { set; get; }
/// <summary>
/// 通知的类型,支付成功通知的类型为TRANSACTION.SUCCESS
/// </summary>
public string event_type { set; get; }
/// <summary>
/// 通知的资源数据类型,支付成功通知为encrypt-resource
/// </summary>
public string resource_type { set; get; }
/// <summary>
/// 通知资源数据,json格式
/// </summary>
public WxPayResourceModel resource { set; get; }
/// <summary>
/// 回调摘要
/// </summary>
public string summary { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.WxPayCallback
{
/// <summary>
/// 微信支付回调通知结果解密实体
/// </summary>
public class WxPayResourceDecryptModel
{
/// <summary>
/// 直连商户申请的公众号或移动应用appid
/// </summary>
public string appid { set; get; }
/// <summary>
/// 商户的商户号,由微信支付生成并下发。
/// </summary>
public string mchid { set; get; }
/// <summary>
/// 商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一。特殊规则:最小字符长度为6
/// </summary>
public string out_trade_no { set; get; }
/// <summary>
/// 微信支付系统生成的订单号。
/// </summary>
public string transaction_id { set; get; }
/// <summary>
/// 交易类型,枚举值:
///JSAPI:公众号支付
/// NATIVE:扫码支付
/// APP:APP支付
/// MICROPAY:付款码支付
/// MWEB:H5支付
/// FACEPAY:刷脸支付
/// </summary>
public string trade_type { get; set; }
/// <summary>
/// 交易状态,枚举值:
/// SUCCESS:支付成功
/// REFUND:转入退款
/// NOTPAY:未支付
/// CLOSED:已关闭
/// REVOKED:已撤销(付款码支付)
/// USERPAYING:用户支付中(付款码支付)
/// PAYERROR:支付失败(其他原因,如银行返回失败)
/// ACCEPT:已接收,等待扣款
/// </summary>
public string trade_state { get; set; }
/// <summary>
/// 交易状态描述
/// </summary>
public string trade_state_desc { get; set; }
/// <summary>
/// 银行类型,采用字符串类型的银行标识
/// </summary>
public string bank_type { get; set; }
/// <summary>
/// 附加数据,在查询API和支付通知中原样返回
/// </summary>
public string attach { get; set; }
/// <summary>
/// 支付完成时间 示例值:2018-06-08T10:34:56+08:00
/// </summary>
public string success_time { get; set; }
/// <summary>
/// 订单金额信息
/// </summary>
public WxPayerResourceAmountModel amount { get; set; }
/// <summary>
/// 支付者信息
/// </summary>
public WxPayerResourceDecryptModel payer { set; get; }
}
/// <summary>
/// 订金支付金额实体
/// </summary>
public class WxPayerResourceAmountModel {
/// <summary>
/// 订单总金额,单位为分。
/// </summary>
public int total { get; set; }
/// <summary>
/// 用户支付金额,单位为分。
/// </summary>
public int payer_total { get; set; }
/// <summary>
/// CNY:人民币,境内商户号仅支持人民币
/// </summary>
public string currency { get; set; }
/// <summary>
/// 用户支付币种
/// </summary>
public string payer_currency { get; set; }
}
/// <summary>
/// 支付用户信息实体
/// </summary>
public class WxPayerResourceDecryptModel
{
/// <summary>
/// 用户在直连商户appid下的唯一标识。
/// </summary>
public string openid { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model.WxPayCallback
{
/// <summary>
/// 微信支付回调通知结果resource实体
/// </summary>
public class WxPayResourceModel
{
/// <summary>
/// 对开启结果数据进行加密的加密算法,目前只支持AEAD_AES_256_GCM
/// </summary>
public string algorithm { set; get; }
/// <summary>
/// Base64编码后的开启/停用结果数据密文
/// </summary>
public string ciphertext { set; get; }
/// <summary>
/// 附加数据
/// </summary>
public string associated_data { set; get; }
/// <summary>
/// 原始回调类型,为transaction
/// </summary>
public string original_type { set; get; }
/// <summary>
/// 加密使用的随机串
/// </summary>
public string nonce { set; get; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3.Model
{
public class WxPayConst
{
/// <summary>
/// 直连商户申请的公众号或移动应用appid。
/// </summary>
public static string appid => "wx38e054ee42b054f4";
/// <summary>
/// AppSecret,app端加密解密使用
/// </summary>
public static string AppSecret => "WECHATPAY2-SHA256-RSA2048";
/// <summary>
/// 密钥,用商户平台上设置的APIv3密钥【微信商户平台—>账户设置—>API安全—>设置APIv3密钥】,记为key;
/// 官方资料:https://kf.qq.com/faq/180830E36vyQ180830AZFZvu.html
/// </summary>
public static string APIV3Key => "WECHATPAY2-SHA256-RSA2048";
/// <summary>
/// 直连商户的商户号,由微信支付生成并下发。
/// </summary>
public static string mchid => "1607960268";
/// <summary>
/// 证书序列号
/// 查看证书序列号:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao
/// </summary>
public static string serialNo => "36CF5CF9A7B239F228D3FF11D2C149B7F7E42F11";
/// <summary>
/// key 私钥
/// 私钥和证书:https://wechatpay-api.gitbook.io/wechatpay-api-v3/ren-zheng/zheng-shu#sheng-ming-suo-shi-yong-de-zheng-shu
/// </summary>
public static string privateKey => @"MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDR7AC3UkAjA/KZ
rIGBGQQiOrBZTe5cyXtsN9/AWpGEwK5j6pgFgIqVmsuP0EoP5UtjekZwHCY4ETt7
7kX3bzV0KCRRlH9eNUbxUfmK+RpZms3QkO4zw7Fzj2c+axtrJNryIeuUdxTidOBH
eLTTDhQ408QC93oz5t74DUYT2vicqYiPRxG2a5qMd09ZaMyp1ekvYm1qTjIITzhl
KwahP5FLyJIzAr86fjtwLjrLXZck7AA1jePuQjaoMW8QslxlBqoFxcQ2NwIExelO
c06UAIGT+yT5D0j4LDjnmIqZMeJhgNYUC7QVHFQQiHZWTd58RG7xo1GzDfauRPau
G6QpCWCvAgMBAAECggEAc5I7/rGQz/ZPbR2VGu8b4IBxMGmATqM6iSTl0e/K58xw
9l9knLrdEWpsodupusChVb4u43AL9pg+KIfRC121jyK+hA9+Y+5vBVL9UO69/BEH
OMlh6yvVGWsdCzdKnB1pUR8tpMo+vEJea9rfqsa4iWTFKGD5bXOw093y8+F9ODn6
bxisnNc3zmEf4vB+hkaEV5Mon43BVc0Tb8g0yhuvVLOlCR8Cz108O054KfpRZHa7
nxLM1Y5u3FfbZw495g+l6FQneD26rGdUzDC2k710Uj2M4yIBjwlLw5B7C3vMPIBQ
2VQAZ2u/1zjQX4b8Nwx8ti+ZSZ713PQPGItxeAgT4QKBgQD0hsCqYt6zIVLdLSdI
qGr4Qu7t5hjFEaJAjG7zeYe/T4zj++XX6pTZiNUF+rgBaVatFVqDnEB98ZIPauah
tb5LhSZ9gmFqc1dDE0IqpTuSr1leGtpPeuaxLRm79p76C/sk86rf1AazRBCuFQnY
IxfWL5BCrHewwekeKI5tTsfFEQKBgQDbxZTfaHfVek4gyoR/ZTQen3GouFHik20C
xF318wTe1PRee0+mBuxt2u1OnBxlyQjpQN0fBzx1lKcqeFqawvCAyU3uhz1sTQrE
/8mqmGn8taJ1AaXf7qyjZos4J4J4V5cQwBOtqvbax8tuB9eXbC1X6SjPHkExGYF4
k6rJaBPJvwKBgEoJXt54DxvHlDJZkJJkQ/clNPic+ZT5kNnga1uWyW44ZN1GkMH+
SdFPp8gmsH3k6hR/6ab9sV0wvluir2/4+kQdbZkE2AAGKj6p3xfQbagtJW7jzIPS
H3U3xZnuwxXMeN8oU+1vYhP3IOHEhvWFMptsTU6Sr666F55FA1K/TqcxAoGAS3OW
HO1c1unakN92hdZVAn5zIx3E3ykGMAEC0UHR1j7+dsGXIsUVvtF+z5JBHaDbcllW
kSSG2Udj7OzNDn0G3PA/1TiRGfGJVQEMV4lkOeKSF+Gs9SiYFLFL8sd9v5syvglz
uBgOECav7OK8XbxCBQCDhjg44YaEMMVhySv2PzkCgYEA7L+coaP+jgPKdPOtsiv8
qQTsVXMGKzXDJcKGUnM9NMCxcmtaosdt6grn4NAFXvh380uMlYoX+q+hLpUaLnG7
gTUf6FauH7Jkxlcj+EX1aET4lu04RmDRzM1PF1bpK+l7aSxqMC1sAGjOFTFlyn2x
7clXrzqyxPiY0cr0ZUqhdQ4=";
}
}
using Org.BouncyCastle.Crypto.Modes;
using System;
using System.Text;
using Org.BouncyCastle.Crypto.Engines;
using Org.BouncyCastle.Crypto.Parameters;
namespace Edu.Common.WeChatPayAPIv3
{
/// <summary>
/// 解密微信通知结果帮助类
/// 参考资料:https://pay.weixin.qq.com/wiki/doc/apiv3/wechatpay/wechatpay4_2.shtml
/// .NET5环境使用该代码,需要安装Portable.BouncyCastle组件
/// </summary>
public class AesGcmHelper
{
private static string ALGORITHM = "AES/GCM/NoPadding";
private static int TAG_LENGTH_BIT = 128;
private static int NONCE_LENGTH_BYTE = 12;
private static string AES_KEY = string.Empty;
public static string AesGcmDecrypt(string associatedData, string nonce, string ciphertext, string APIV3Key)
{
GcmBlockCipher gcmBlockCipher = new GcmBlockCipher(new AesEngine());
AeadParameters aeadParameters = new AeadParameters(
new KeyParameter(Encoding.UTF8.GetBytes(APIV3Key)),
128,
Encoding.UTF8.GetBytes(nonce),
Encoding.UTF8.GetBytes(associatedData));
gcmBlockCipher.Init(false, aeadParameters);
byte[] data = Convert.FromBase64String(ciphertext);
byte[] plaintext = new byte[gcmBlockCipher.GetOutputSize(data.Length)];
int length = gcmBlockCipher.ProcessBytes(data, 0, data.Length, plaintext, 0);
gcmBlockCipher.DoFinal(plaintext, length);
return Encoding.UTF8.GetString(plaintext);
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
namespace Edu.Common.WeChatPayAPIv3
{
/// <summary>
/// 随机码帮助类
/// </summary>
public class CodeHelper
{
/// <summary>
/// 基础字符串
/// </summary>
private const string Basestr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
/// <summary>
/// 基础数字字符串
/// </summary>
private const string BaseNumstr = "0123456789";
/// <summary>
/// 可选长度的生成随机码
/// </summary>
/// <param name="length">字符串长度</param>
/// <returns></returns>
private static string CreateCode(int length)
{
var random = new Random();
var sb = "";
for (var i = 0; i < length; i++)
{
var number = random.Next(Basestr.Length);
sb += Basestr.Substring(number, 1);
}
return sb;
}
/// <summary>
/// 可选长度的生成数字随机码
/// </summary>
/// <param name="length">字符串长度</param>
/// <returns></returns>
public static string CreateNumCode(int length)
{
var random = new Random();
var sb = "";
for (var i = 0; i < length; i++)
{
var number = random.Next(BaseNumstr.Length);
sb += BaseNumstr.Substring(number, 1);
}
return sb;
}
/// <summary>
/// 随机生成不重复邀请码
/// </summary>
/// <param name="length">长度</param>
/// <param name="seed">种子</param>
/// <returns></returns>
private static string CreateRandStrCode(int length, int seed = 0)
{
//Guid的哈希码作为种子值
var buffer = Guid.NewGuid().ToByteArray();
var ranInt = BitConverter.ToInt32(buffer, 0) + seed;
var random = new Random(ranInt);
var re = "";
for (var i = 0; i < length; i++)
{
var number = random.Next(Basestr.Length);
re += Basestr.Substring(number, 1);
}
return re;
}
/// <summary>
/// 生成用户邀请码
/// </summary>
public static string CreateUserCode()
{
var str = CreateRandStrCode(8, 0);
return str;
}
/// <summary>
/// 生成机构邀请码
/// </summary>
public static string CreateOrgInviteCode()
{
var str = CreateRandStrCode(6, 1);
return str;
}
/// <summary>
/// 生成邀请码前缀
/// </summary>
public static string CreateCodePre()
{
var sb = CreateCode(1);
return sb;
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using Edu.Common.WeChatPayAPIv3.Model.GenerateOrder;
namespace Edu.Common.WeChatPayAPIv3
{
public class WxPayForAppHelper
{
///// <summary>
///// 为app端生成签名
///// </summary>
///// <param name="appid">直连商户申请的公众号或移动应用appid</param>
///// <param name="prepayId">预支付id</param>
///// <param name="privateKey">私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY----- 亦不包括结尾的-----END PRIVATE KEY-----</param>
//public static NativePayModel GetSign(HttpRequestMessage request, string body, string code_url, string privateKey)
//{
// var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
// string nonce = Path.GetRandomFileName();
// string method = request.Method.ToString();
// string uri = request.RequestUri.PathAndQuery;
// string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";
// // var message = $"{appid}\n{timestamp}\n{nonce}\n{prepayId}\n";
// var signature = Sign(message, privateKey);
// var viewModel = new NativePayModel
// {
// timestamp = timestamp.ToString(),
// noncestr = nonce,
// code_url = code_url,
// signature = signature
// };
// return viewModel;
//}
/// <summary>
/// 为app端生成签名
/// </summary>
/// <param name="appid">直连商户申请的公众号或移动应用appid</param>
/// <param name="prepayId">预支付id</param>
/// <param name="privateKey">私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY----- 亦不包括结尾的-----END PRIVATE KEY-----</param>
public static NativePayModel GetSign(string appid, string code_Url, string privateKey)
{
var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
string nonce = Path.GetRandomFileName();
var message = $"{appid}\n{timestamp}\n{nonce}\n{code_Url}\n";
var signature = Sign(message, privateKey);
var viewModel = new NativePayModel
{
timestamp = timestamp.ToString(),
noncestr = nonce,
code_url = code_Url,
signature = signature
};
return viewModel;
}
private static string Sign(string message, string privateKey)
{
// // NOTE: 私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY-----
// // 亦不包括结尾的-----END PRIVATE KEY-----
// string privateKey = @"MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDi6V9qSE0cEYG5
//AIZPveW/boI+H1YuK2Nc9FIzYDLev/YGTF+4jmJ9q+pimLsBVvO/OucNUCAUvgPr
//9AVaLFvzpksjW0494auQWeQCiz4BoaTtAOD3Dh/ZDVvaYlEv37XXKm2ABs/AlMkh
//J8TjQIKIJtFBpJXLrGGCQWxPp5YnxeoDeGUWRW0WlZ40gD/pN+5MCT8qF41aVMIP
//KB2R3A0dTEUaPGU1UZ5b2cJAbzdrPA1uHHZheDQO296VS6XkYdw1J1MRblXYVX7T
//EF68F02iqRJ6P6t/UVCYb/4PWTftnaELmx38I3MfkG6RbxFxk5MLtg+P+mz3PROH
//t2D8AF/RAgMBAAECggEAb4aKaf99PsVv/9C9MuY/zJXxF71pKyoSHTbMTAoFFqw8
//rJ3PEjORPvlHKwysJR1qkdvOgiGWkvtNjCQUmVxiGV/rYEZZL1sCauFziriLUlvz
//ZrVe3K6pgpHpSm22P5RxmH528UznwVyfeldEkvk67tY9VUkigseH6XBkXsYcrBDS
//YN+v/g60n1o89Z0rDEEs9jireMAeVnlxiBgFC2FRZYSFjbyGYPmKPeezmwXCPF3g
//4ON9Zj4WQfthGEKyDL/tSF6W6VkD+bPRSuINWRWo+qsPxrjHh/KUInqaDzAT+eEH
//6YDgMQ4Fl78ZfGuhz4oesEMg3JqOtGokiqwIoa5v0QKBgQD0f1o8AWLezuD/LtEf
//GWRvKR0qQVLDdg1iXbN9Zwctme5NqPKEI/G3tyMqiWY7559kETTWikSGhd6ToniK
//ZT3DrZTCE3JBx0rCgDGlgUf59U/OJjsDAYF7u3CM+g9wUQd6EUJu/qLzKGSF+Ofd
//jmOEMCfKcQZrXCBxU9/WYKDILQKBgQDtljjPUMXDocC/Kdg6Vg0jiYdRCZRjF8HS
//hhK98ZsgrUJtdle3C4KK9NdjZ/YpF7LXY6hFlPh/AFt0jJKSChjRY2duuwTRc7qX
//lZhkuMuLFc26OXwVrX0Umj+AxfxqohIAVRwR1cUthuX1vrUbLVDEvkc7wLkevfSP
//6qPZDU04tQKBgB40HVGMWkpsBB+CCRNub5nL2m5941uCGeUs7h9vutNHUMkHNe5d
//Al9PoGiA0MBVvLr/5ScbrZtwri5Ow9VU7Gxf5SCUhmjZ1cJxU7C+Z8XZKCKvVlro
//tLY0UZMY0Q9u8x2BRFOx4S9orgJe3UXhcSnDSScZD1Hz744QbnZtOW+BAoGANDFF
//B54J4+Eb06LgomgW+NCUjmPZWi9038eeRGXYG0SUjDFsMYTwx4/j5S2IcRyIqDJ3
//W9nPAS9V5/Odm0FmlFEO/s9MzqpqujQdxzqlVEeU6y0Hqkdza9w6yRI1UkOKStJn
//mS9p4od46xRa+r5ouN/IDENZJ3y5RghYuCzo4uUCgYAJXtGuVBKN0e2ok+D4uVI/
//j6WOmQRw+N32hU2eeUk52uOQuiKbUT9tbqk7kRw3PuVpQUXq3bkLbJTZK5+Sd5wK
//1XZMvI1IuqDz87+nmf/vB/biuYltfDXUV6EVUB1h0WcgJ35RJsSKyY1WzqE4P6ys
//lmalRcuCNFuvbTIo9IBI0w==";
byte[] keyData = Convert.FromBase64String(privateKey);
using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))
using (RSACng rsa = new RSACng(cngKey))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
}
}
}
}
using System;
using System.Collections.Generic;
using System.Net.Http;
using System.Text;
using System.Threading.Tasks;
using Edu.Common.WeChatPayAPIv3.Model.GenerateOrder;
using Edu.Common.WeChatPayAPIv3.Model.QueryOrder;
using Edu.Common.WeChatPayAPIv3.Model.QueryRefunds;
using Edu.Common.WeChatPayAPIv3.Model.Refunds;
namespace Edu.Common.WeChatPayAPIv3
{
public class WxPayHelper
{
/// <summary>
/// 直连商户申请的公众号或移动应用appid。
/// </summary>
private string _appid { set; get; }
/// <summary>
/// 直连商户的商户号,由微信支付生成并下发。
/// </summary>
private string _mchid { set; get; }
/// <summary>
/// 证书序列号,查看证书序列号:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao
/// </summary>
private string _serialNo;
/// <summary>
/// 私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY----- 亦不包括结尾的-----END PRIVATE KEY-----
/// </summary>
private string _privateKey;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="appid">直连商户申请的公众号或移动应用appid</param>
/// <param name="mchid">直连商户的商户号,由微信支付生成并下发</param>
/// <param name="serialNo">证书序列号,查看证书序列号:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao</param>
/// <param name="privateKey">私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY----- 亦不包括结尾的-----END PRIVATE KEY-----</param>
public WxPayHelper(string appid, string mchid, string serialNo, string privateKey)
{
_appid = appid;
_mchid = mchid;
_serialNo = serialNo;
_privateKey = privateKey;
}
/// <summary>
/// 统一下单接口,只对接了必填的字段
/// </summary>
/// <param name="description">商品描述</param>
/// <param name="price">订单总金额,单位为分</param>
/// <param name="out_trade_no">商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一</param>
/// <param name="notify_url">通知URL必须为直接可访问的URL,不允许携带查询串。格式:URL</param>
/// <param name="attach">附加数据,在查询API和支付通知中原样返回,可作为自定义参数使用</param>
/// <param name="currency">货币类型,CNY:人民币,境内商户号仅支持人民币</param>
/// <returns></returns>
public async Task<WxPayRespModel> UnionGenerateOrder(string description, int price, string out_trade_no, string notify_url, string attach = "", string currency = "CNY")
{
var url = "https://api.mch.weixin.qq.com/v3/pay/transactions/native";
var req = new GenerateOrderModelForWxPay
{
appid = this._appid,
mchid = this._mchid,
description = description,
amount = new WxPayAmountModel
{
total = price,
currency = currency
},
out_trade_no = out_trade_no,
attach = attach,
notify_url = notify_url
};
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
// var bodyJson = new StringContent(req.ToJson(), Encoding.UTF8, "application/json");
var bodyJson = new StringContent(Common.Plugin.JsonHelper.Serialize(req), Encoding.UTF8, "application/json");
var resp = await client.PostAsync(url, bodyJson);
// 注意!!! 这个resp只是http的结果,需要把接口具体返回的值读取出来,如果接口报错的话,这地方可以看到具体的错误信息,我就是在这里入坑的。
var respStr = await resp.Content.ReadAsStringAsync();
// 如果下单成功,就解析返回的结果,把prepay_id解析出来
// var viewModel = respStr.ToObject<WxPayRespModel>();
var viewModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayRespModel>(respStr);
return viewModel;
}
/// <summary>
/// 查询订单
/// </summary>
/// <param name="orderNumber">商户自己的订单号,不是微信生成的订单号</param>
public async Task<WxPayStatusRespModel> QueryOrder(string orderNumber)
{
var url = $"https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{orderNumber}?mchid={ this._mchid}";
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
var resp = await client.GetAsync(url);
var respStr = await resp.Content.ReadAsStringAsync();
var payModel = Common.Plugin.JsonHelper.DeserializeObject<WxPayStatusRespModel>(respStr);// respStr.ToObject<WxPayStatusRespModel>();
return payModel;
}
///// <summary>
///// 关闭订单
///// </summary>
///// <param name="orderNumber">商户自己的订单号,不是微信生成的订单号</param>
//public async Task<ClostOrderRespModel> ClostOrder(string orderNumber)
//{
// var url = $"https://api.mch.weixin.qq.com/v3/pay/transactions/out-trade-no/{orderNumber}/close";
// var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
// var bodyJson = new StringContent(new { mchid = this._mchid }.ToJson(), Encoding.UTF8, "application/json");
// var resp = await client.PostAsync(url, bodyJson);
// var respStr = await resp.Content.ReadAsStringAsync();
// var closeModel = new ClostOrderRespModel();
// if (!string.IsNullOrEmpty(respStr))
// closeModel = respStr.ToObject<ClostOrderRespModel>();
// closeModel.StatusCode = resp.StatusCode.ToString();
// return closeModel;
//}
/// <summary>
/// 微信支付申请退款接口
/// </summary>
/// <param name="out_trade_no">商户系统内部订单号,只能是数字、大小写字母_-*且在同一个商户号下唯一;原支付交易对应的商户订单号。</param>
/// <param name="out_refund_no">商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。</param>
/// <param name="reason">若商户传入,会在下发给用户的退款消息中体现退款原因。</param>
/// <param name="refund">退款金额,币种的最小单位,只能为整数,不能超过原订单支付金额。</param>
/// <param name="total">原支付交易的订单总金额,币种的最小单位,只能为整数。</param>
/// <param name="notify_url">异步接收微信支付退款结果通知的回调地址,通知url必须为外网可访问的url,不能携带参数。 如果参数中传了notify_url,则商户平台上配置的回调地址将不会生效,优先回调当前传的这个地址。示例值:https://weixin.qq.com ,必须是https的网址</param>
/// <param name="currency">符合ISO 4217标准的三位字母代码,目前只支持人民币:CNY。</param>
/// <returns></returns>
public async Task<RefundsRespModel> Refunds(string out_trade_no, string out_refund_no, string reason, int refund, int total, string notify_url = "", string currency = "CNY")
{
var req = new RefundsRequestModel
{
out_refund_no = out_refund_no,
out_trade_no = out_trade_no,
reason = reason,
notify_url = notify_url,
amount = new RefundsAmountModel
{
refund = refund,
total = total,
currency = currency
}
};
var url = $"https://api.mch.weixin.qq.com/v3/refund/domestic/refunds";
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
var bodyJson = new StringContent(Common.Plugin.JsonHelper.Serialize(req), Encoding.UTF8, "application/json");
var resp = await client.PostAsync(url, bodyJson);
var respStr = await resp.Content.ReadAsStringAsync();
var payModel = Common.Plugin.JsonHelper.DeserializeObject<RefundsRespModel>(respStr);// respStr.ToObject<RefundsRespModel>();
return payModel;
}
/// <summary>
/// 查询退款结果
/// </summary>
/// <param name="out_refund_no">商户系统内部的退款单号,商户系统内部唯一,只能是数字、大小写字母_-|*@ ,同一退款单号多次请求只退一笔。</param>
public async Task<QueryRefundsOrderRespModel> QueryRefundsOrder(string out_refund_no)
{
var url = $"https://api.mch.weixin.qq.com/v3/refund/domestic/refunds/{out_refund_no}";
var client = new HttpClient(new WxPayRequestHandler(_mchid, _serialNo, _privateKey));
var resp = await client.GetAsync(url);
var respStr = await resp.Content.ReadAsStringAsync();
var payModel = Common.Plugin.JsonHelper.DeserializeObject<QueryRefundsOrderRespModel>(respStr); //respStr.ToObject<QueryRefundsOrderRespModel>();
return payModel;
}
}
}
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace Edu.Common.WeChatPayAPIv3
{
internal class WxPayRequestHandler : DelegatingHandler
{
/// <summary>
/// 直连商户的商户号,由微信支付生成并下发。
/// </summary>
private string _merchantId = string.Empty;
/// <summary>
/// 证书序列号,查看证书序列号:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao
/// </summary>
private string _serialNo = string.Empty;
/// <summary>
/// 私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY----- 亦不包括结尾的-----END PRIVATE KEY-----
/// </summary>
private string _privateKey = string.Empty;
/// <summary>
/// 构造方法
/// </summary>
/// <param name="mchid">直连商户的商户号,由微信支付生成并下发。</param>
/// <param name="serialNo">证书序列号,查看证书序列号:https://wechatpay-api.gitbook.io/wechatpay-api-v3/chang-jian-wen-ti/zheng-shu-xiang-guan#ru-he-cha-kan-zheng-shu-xu-lie-hao</param>
/// <param name="privateKey">私钥不包括私钥文件起始的-----BEGIN PRIVATE KEY----- 亦不包括结尾的-----END PRIVATE KEY-----</param>
public WxPayRequestHandler(string mchid, string serialNo, string privateKey)
{
InnerHandler = new HttpClientHandler();
this._merchantId = mchid;
this._serialNo = serialNo;
this._privateKey = privateKey;
}
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request,
CancellationToken cancellationToken)
{
var auth = await BuildAuthAsync(request);
string value = $"WECHATPAY2-SHA256-RSA2048 {auth}";
request.Headers.Add("Authorization", value);
request.Headers.Add("Accept", "application/json");
request.Headers.Add("User-Agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)");
return await base.SendAsync(request, cancellationToken);
}
private async Task<string> BuildAuthAsync(HttpRequestMessage request)
{
var method = request.Method.ToString();
var body = "";
if (method == "POST" || method == "PUT" || method == "PATCH")
{
var c = request.Content;
body = await c.ReadAsStringAsync();//这里读取的数据一定要跟传入的参数一致,debug时看到的数据与传入的参数不一致是不可以的
}
string uri = request.RequestUri.PathAndQuery;
var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
string nonce = Path.GetRandomFileName();
var message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";
var signature = Sign(message);
return $"mchid=\"{_merchantId}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{_serialNo}\",signature=\"{signature}\"";
}
private string Sign(string message)
{
byte[] keyData = Convert.FromBase64String(_privateKey);
using (CngKey cngKey = CngKey.Import(keyData, CngKeyBlobFormat.Pkcs8PrivateBlob))
using (RSACng rsa = new RSACng(cngKey))
{
byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
}
}
}
}
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.Finance
{
/// <summary>
/// 线上支付记录实体
/// </summary>
[Serializable]
[DB(ConnectionName = "DefaultConnection")]
public class RB_Finance_OrderRecord
{
/// <summary>
/// 编号
/// </summary>
public int ID { get; set; }
/// <summary>
/// 类型 1收款 2退款
/// </summary>
public int? Type
{
get;
set;
}
/// <summary>
/// 财务id
/// </summary>
public int FinanceId
{
get;
set;
}
/// <summary>
/// 订单号
/// </summary>
public int OrderId { get; set; }
/// <summary>
/// 合同单号
/// </summary>
public int ContractId { get; set; }
/// <summary>
/// CreateDate
/// </summary>
public DateTime? CreateDate
{
get;
set;
}
/// <summary>
/// 集团编号
/// </summary>
public int RB_Group_Id { get; set; }
/// <summary>
/// 学校编号
/// </summary>
public int RB_School_Id { get; set; }
/// <summary>
/// 商户订单号
/// </summary>
public string OutTradeNo { get; set; }
/// <summary>
/// 微信支付订单号
/// </summary>
public string TransactionId { get; set; }
/// <summary>
/// 商户订单号
/// </summary>
public int OrderRecordId { get; set; }
/// <summary>
/// 支付总金额
/// </summary>
public decimal TotalPrice { get; set; }
/// <summary>
/// 手续费
/// </summary>
public decimal ServiceFee { get; set; }
}
}
using System;
using System.Collections.Generic;
using System.Text;
using VT.FW.DB;
namespace Edu.Model.Entity.Finance
{
/// <summary>
/// 交易明细实体
/// </summary>
[Serializable]
[DB(ConnectionName = "FinanceConnection")]
public class RB_Online_Trade_Detail
{
/// <summary>
/// ID
/// </summary>
public int ID
{
get;
set;
}
/// <summary>
/// 支付类型1-收款2-退款
/// </summary>
public int? Type
{
get;
set;
}
/// <summary>
/// 订单来源
/// </summary>
public int? OrderSource
{
get; set;
}
/// <summary>
/// 订单号
/// </summary>
public int? OrderId
{
get;
set;
}
/// <summary>
/// 推送支付的订单号
/// </summary>
public string Pay_Order
{
get; set;
}
/// <summary>
/// 平台订单号
/// </summary>
public string Trade_Order
{
get;
set;
}
/// <summary>
/// 第三方订单号
/// </summary>
public string Third_Order
{
get;
set;
}
/// <summary>
/// 交易金额
/// </summary>
public decimal? Money
{
get;
set;
}
/// <summary>
/// 1-微信 2-QQ3-支付宝4-银联
/// </summary>
public int? Pay_Way
{
get;
set;
}
/// <summary>
/// 接口公司
/// </summary>
public int? Interface_Company
{
get;
set;
}
/// <summary>
/// 接口版本号
/// </summary>
public string Version
{
get;
set;
}
/// <summary>
/// 商户号
/// </summary>
public string Mch_Id
{
get;
set;
}
/// <summary>
/// 用户标识
/// </summary>
public string User_Id
{
get;
set;
}
/// <summary>
/// 是否关注公众号
/// </summary>
public int? Is_follow
{
get;
set;
}
/// <summary>
/// 公众号APPID
/// </summary>
public string AppId
{
get;
set;
}
/// <summary>
/// 微信唯一标识
/// </summary>
public string OpenId
{
get;
set;
}
/// <summary>
/// 货币代码
/// </summary>
public string Currency_Type
{
get;
set;
}
/// <summary>
/// 付款机构
/// </summary>
public string Institution_Type
{
get;
set;
}
/// <summary>
/// 卡类型
/// </summary>
public int? Card_Type
{
get;
set;
}
/// <summary>
/// 备注附加信息
/// </summary>
public string Remarks
{
get;
set;
}
/// <summary>
/// 0-成功其他-失败
/// </summary>
public int? Pay_Result
{
get;
set;
}
/// <summary>
/// 交易日期
/// </summary>
public DateTime? Pay_Date
{
get;
set;
}
/// <summary>
/// 付款方
/// </summary>
public int? Payer_Id
{
get;
set;
}
/// <summary>
/// 付款方类型
/// </summary>
public int Payer_Type
{
get; set;
}
/// <summary>
/// 数据来源
/// </summary>
public int? Data_Source
{
get;
set;
}
/// <summary>
/// 集团
/// </summary>
public int? RB_Group_Id
{
get;
set;
}
/// <summary>
/// 公司
/// </summary>
public int? RB_Branch_Id
{
get;
set;
}
/// <summary>
/// 是否申请退款 1是
/// </summary>
public int? IsRefund { get => isRefund; set => isRefund = value; }
private int? isRefund = 0;
/// <summary>
/// 退款商户单号
/// </summary>
public string RefundTrade_Order { get; set; }
/// <summary>
/// 退款金额
/// </summary>
public decimal? RefundMoney { get; set; }
/// <summary>
/// 退款状态
/// </summary>
public int? RefundStatus { get; set; }
/// <summary>
/// 绑定的退款财务单据id
/// </summary>
public int? FinanceId { get; set; }
/// <summary>
/// 申请退款时间
/// </summary>
public DateTime? RefundTime { get; set; }
}
}
......@@ -15,7 +15,7 @@ namespace Edu.Model.ViewModel.Course
/// <summary>
/// 老师头像
/// </summary>
public string TeacherIcon { get; set; }
public string TeacherHead { get; set; }
/// <summary>
/// 班级名称
......
......@@ -1556,14 +1556,22 @@ namespace Edu.Module.Course
return class_TimeRepository.GetClassTimeByRoomId(RoomId, Group_Id);
}
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByTId(int TId, int Group_Id)
public List<RB_Class_Time_Extend> GetClassTimeByClassId(int ClassId, int Group_Id)
{
return class_TimeRepository.GetClassTimeByClassId(ClassId, Group_Id);
}
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByTId(int TId, int Group_Id)
{
return class_TimeRepository.GetClassTimeByTId(TId, Group_Id);
}
......
......@@ -5,9 +5,11 @@ using Edu.Common.Enum;
using Edu.Common.Enum.Course;
using Edu.Common.Plugin;
using Edu.Model.CacheModel;
using Edu.Model.Entity.Finance;
using Edu.Model.ViewModel.Course;
using Edu.Model.ViewModel.User;
using Edu.Repository.Course;
using Edu.Repository.Finance;
using Edu.Repository.User;
using Newtonsoft.Json.Linq;
using System;
......@@ -57,6 +59,20 @@ namespace Edu.Module.Course
/// </summary>
private readonly RB_ClassRepository classRepository = new RB_ClassRepository();
/// <summary>
/// 班级仓储层对象
/// </summary>
private readonly RB_Finance_OrderRecordRepository financeOrderRecordRepository = new RB_Finance_OrderRecordRepository();
/// <summary>
/// 班级仓储层对象
/// </summary>
private readonly RB_Online_Trade_DetailRepository OnlineTradeDetailRepository = new RB_Online_Trade_DetailRepository();
/// <summary>
/// 获取学员信息
/// </summary>
......@@ -68,8 +84,8 @@ namespace Edu.Module.Course
var obj = new object();
var glist = order_GuestRepository.GetList(new RB_Order_Guest_ViewModel() { OrderId = OrderId, GuestState = 1 });
var orderModel = orderRepository.GetEntity(OrderId);
var guestModel = glist.Where(qitem=>qitem.Id==GuestId)?.FirstOrDefault();
var classModel =new RB_Class_ViewModel();
var guestModel = glist.Where(qitem => qitem.Id == GuestId)?.FirstOrDefault();
var classModel = new RB_Class_ViewModel();
decimal PreferPrice = 0;//总金额
decimal DiscountMoney = 0;//优惠金额
decimal Money = 0;//实际金额
......@@ -81,7 +97,7 @@ namespace Edu.Module.Course
}
}
var qids = (classModel?.ManagerId ?? 0).ToString() + "," + (orderModel?.EnterID ?? 0).ToString();
var empList= accountRepository.GetEmployeeListRepository(new Employee_ViewModel() { QIds = qids }) ;
var empList = accountRepository.GetEmployeeListRepository(new Employee_ViewModel() { QIds = qids });
if (glist != null && glist.Count > 0)
{
PreferPrice = orderModel.PreferPrice / glist.Count();
......@@ -91,25 +107,25 @@ namespace Edu.Module.Course
string dxMoney = StringHelper.MoneyToUpper(Money.ToString());
obj = new
{
StudentName=guestModel?.GuestName??"",
StuBirth="",
StuSex=(guestModel?.Sex??0)==1?0:1,
StuAddress=guestModel?.ContactAddress??"",
StuTel= guestModel?.Mobile??"",
StuEmail="",
CourseName=classModel?.CourseName??"",
SchoolName=classModel?.SchoolName??"",
SchoolPrincipal= empList?.Where(qitem=>qitem.Id==(classModel?.ManagerId??0))?.FirstOrDefault()?.EmployeeName??"",
StartLevel=guestModel?.Basics??"",
CourseConsultant= empList?.Where(qitem => qitem.Id == (orderModel?.EnterID ?? 0))?.FirstOrDefault()?.EmployeeName ?? "",
Payee= empList?.Where(qitem => qitem.Id == (orderModel?.EnterID ?? 0))?.FirstOrDefault()?.EmployeeName ?? "",
FirstClassHours=classModel?.ClassHours??0,
FirstCourseFee= PreferPrice,
FirstBookFee =0,
FirstClassFee=0,
FirstDiscountMoney= DiscountMoney,
FirstMoney= Money,
CNYCaps= dxMoney,
StudentName = guestModel?.GuestName ?? "",
StuBirth = "",
StuSex = (guestModel?.Sex ?? 0) == 1 ? 0 : 1,
StuAddress = guestModel?.ContactAddress ?? "",
StuTel = guestModel?.Mobile ?? "",
StuEmail = "",
CourseName = classModel?.CourseName ?? "",
SchoolName = classModel?.SchoolName ?? "",
SchoolPrincipal = empList?.Where(qitem => qitem.Id == (classModel?.ManagerId ?? 0))?.FirstOrDefault()?.EmployeeName ?? "",
StartLevel = guestModel?.Basics ?? "",
CourseConsultant = empList?.Where(qitem => qitem.Id == (orderModel?.EnterID ?? 0))?.FirstOrDefault()?.EmployeeName ?? "",
Payee = empList?.Where(qitem => qitem.Id == (orderModel?.EnterID ?? 0))?.FirstOrDefault()?.EmployeeName ?? "",
FirstClassHours = classModel?.ClassHours ?? 0,
FirstCourseFee = PreferPrice,
FirstBookFee = 0,
FirstClassFee = 0,
FirstDiscountMoney = DiscountMoney,
FirstMoney = Money,
CNYCaps = dxMoney,
Money,
};
return obj;
......@@ -127,11 +143,11 @@ namespace Edu.Module.Course
public List<RB_Education_Contract_ViewModel> GetEducationContractPageListModule(int pageIndex, int pageSize, out long count, RB_Education_Contract_ViewModel dmodel)
{
var list = education_ContractRepository.GetEducationContractPageListRepository(pageIndex, pageSize, out count, dmodel);
if (list != null &&list.Count>0)
if (list != null && list.Count > 0)
{
var userIds = string.Join(",", list.Select(x => x.CreateBy).Distinct());
var alist = accountRepository.GetAccountListExtRepository(new Model.ViewModel.User.RB_Account_ViewModel() { QIds = userIds });
foreach (var item in list)
foreach (var item in list)
{
var amodel = alist.Where(x => x.Id == item.CreateBy).FirstOrDefault();
item.CreateByName = amodel?.AccountName ?? "";
......@@ -201,7 +217,7 @@ namespace Edu.Module.Course
{ nameof(RB_Education_Contract_ViewModel.Exam),model.Exam},
{ nameof(RB_Education_Contract_ViewModel.IsSupplement),model.IsSupplement},
};
flag = education_ContractRepository.Update(keyValues, new WhereHelper(nameof(RB_Education_Contract_ViewModel.Id),model.Id));
flag = education_ContractRepository.Update(keyValues, new WhereHelper(nameof(RB_Education_Contract_ViewModel.Id), model.Id));
}
else
{
......@@ -213,7 +229,7 @@ namespace Edu.Module.Course
}
model.School_Id = classModel?.School_Id ?? 0;
//生成合同编码
model.ContractNo = CreateContractNumModule(model.Group_Id,model.School_Id);
model.ContractNo = CreateContractNumModule(model.Group_Id, model.School_Id);
var newId = education_ContractRepository.Insert(model);
model.Id = newId;
flag = newId > 0;
......@@ -226,9 +242,9 @@ namespace Edu.Module.Course
/// </summary>
/// <param name="GroupId"></param>
/// <returns></returns>
public string CreateContractNumModule(int GroupId,int schoolId)
public string CreateContractNumModule(int GroupId, int schoolId)
{
var schoolModel= schoolRepository.GetEntity(schoolId);
var schoolModel = schoolRepository.GetEntity(schoolId);
string newContractNum = Common.Config.ContractDefaultTitle;
if (schoolModel != null && schoolModel.SId > 0)
{
......@@ -255,7 +271,7 @@ namespace Edu.Module.Course
return model;
}
/// <summary>
/// 同和审核
......@@ -298,12 +314,49 @@ namespace Edu.Module.Course
/// <returns></returns>
public bool SetEducationContractSignModule(int contractId, string sign)
{
Dictionary<string, object> keyValues = new Dictionary<string, object>()
Dictionary<string, object> keyValues = new Dictionary<string, object>()
{
{ nameof(RB_Education_Contract_ViewModel.Sign),sign},
{ nameof(RB_Education_Contract_ViewModel.SignDate),DateTime.Now},
};
return education_ContractRepository.Update(keyValues, new WhereHelper(nameof(RB_Education_Contract_ViewModel.Id), contractId));
}
#region 合同订单信息
/// <summary>
/// 新增合同的付款记录
/// </summary>
/// <param name="model"></param>
/// <param name="orderRecordModel"></param>
/// <returns></returns>
public bool SetEducationContractFinance(RB_Online_Trade_Detail model, RB_Finance_OrderRecord orderRecordModel)
{
bool flag = false;
if (orderRecordModel != null)
{
flag = financeOrderRecordRepository.Insert(orderRecordModel) > 0;
if (flag && model != null && !string.IsNullOrWhiteSpace(model.Trade_Order))
{
OnlineTradeDetailRepository.Insert(model);
}
}
return flag;
}
// <summary>
/// 获取分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="model"></param>
/// <returns></returns>
public List<RB_Finance_OrderRecord> GetOrderRecordList(RB_Finance_OrderRecord model)
{
return financeOrderRecordRepository.GetOrderRecordList(model);
}
#endregion
}
}
This diff is collapsed.
......@@ -116,7 +116,7 @@ WHERE 1=1
public List<RB_Class_Time_Extend> GetClassTimeByRoomId(int RoomId,int Group_Id)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat($@"SELECT t.TeacherName,t.TeacherIcon,c.ClassHours,c.ClassName,cou.CourseName,lp.LessonPlanId,A.ClassPlanId,A.ClassId,A.`Status`,A.ClassRoomId,A.Group_Id,A.School_Id,A.TeacherId,B.ClassTimeId,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.StartTime,':00') AS NewPlanDateTime,
builder.AppendFormat($@"SELECT t.TeacherName,t.TeacherHead,c.ClassHours,c.ClassName,cou.CourseName,lp.LessonPlanId,A.ClassPlanId,A.ClassId,A.`Status`,A.ClassRoomId,A.Group_Id,A.School_Id,A.TeacherId,B.ClassTimeId,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.StartTime,':00') AS NewPlanDateTime,
B.EndTime,B.StartTime,B.SuiPai,B.ClassStatus,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.EndTime,':00') AS NewEndPlanDateTime
FROM rb_class_plan AS A INNER JOIN rb_class_time AS B ON A.ClassPlanId=B.ClassPlanId
LEFT JOIN rb_teacher as t on a.TeacherId=t.TId
......@@ -128,6 +128,25 @@ where a.`Status`=0 and c.ClassStatus =2 and a.ClassRoomId={RoomId} and a.Group_
}
/// <summary>
/// 获取班级上课时间
/// </summary>
/// <param name="classIds"></param>
/// <returns></returns>
public List<RB_Class_Time_Extend> GetClassTimeByClassId(int ClassId, int Group_Id)
{
StringBuilder builder = new StringBuilder();
builder.AppendFormat($@"SELECT t.TeacherName,croom.RoomName,t.TeacherHead,c.ClassHours,c.ClassName,cou.CourseName,lp.LessonPlanId,A.ClassPlanId,A.ClassId,A.`Status`,A.ClassRoomId,A.Group_Id,A.School_Id,A.TeacherId,B.ClassTimeId,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.StartTime,':00') AS NewPlanDateTime,
B.EndTime,B.StartTime,B.SuiPai,B.ClassStatus,CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.EndTime,':00') AS NewEndPlanDateTime
FROM rb_class_plan AS A INNER JOIN rb_class_time AS B ON A.ClassPlanId=B.ClassPlanId
LEFT JOIN rb_teacher as t on a.TeacherId=t.TId
LEFT JOIN rb_class as c on c.ClassId=a.ClassId
LEFT JOIN rb_course as cou on cou.CourseId=c.CouseId
LEFT JOIN rb_class_room as croom on croom.RoomId=a.ClassRoomId
LEFT JOIN (SELECT ClassPlanId,MAX(LessonPlanId) as LessonPlanId from rb_class_lessonplan where `Status`=0 GROUP BY ClassPlanId) as lp on lp.ClassPlanId=a.ClassPlanId
where a.`Status`=0 and c.ClassStatus =2 and a.ClassId={ClassId} and a.Group_Id={Group_Id} and DATE_FORMAT(A.ClassDate,'%Y-%m-%d')>=DATE_FORMAT(NOW(),'%Y-%m-%d') ORDER BY CONCAT( DATE_FORMAT(A.ClassDate,'%Y-%m-%d') ,' ',B.EndTime,':00') asc LIMIT 10");
return Get<RB_Class_Time_Extend>(builder.ToString()).ToList();
}
/// <summary>
/// 获取班级上课时间
/// </summary>
......
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Model.Entity.Finance;
namespace Edu.Repository.Finance
{
public class RB_Finance_OrderRecordRepository:BaseRepository<RB_Finance_OrderRecord>
{
/// <summary>
/// 表名称
/// </summary>
public string TableName { get { return nameof(RB_Finance_OrderRecord); } }
/// <summary>
/// 获取分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="model"></param>
/// <returns></returns>
public List<RB_Finance_OrderRecord> GetPageList(int pageIndex, int pageSize, out long count, RB_Finance_OrderRecord model)
{
string where = " WHERE 1=1 ";
if (model.RB_Group_Id > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.RB_Group_Id) + "={0} ", model.RB_Group_Id);
}
if (model.ContractId > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.ContractId) + "={0} ", model.ContractId);
}
if (model.OrderId > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.OrderId) + "={0} ", model.OrderId);
}
if (model.FinanceId > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.FinanceId) + "={0} ", model.FinanceId);
}
if (model.Type > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.Type) + "={0} ", (int)model.Type);
}
return GetPage<RB_Finance_OrderRecord>(pageIndex, pageSize, out count, "select * from " + TableName + " " + where).ToList();
}
// <summary>
/// 获取分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="model"></param>
/// <returns></returns>
public List<RB_Finance_OrderRecord> GetOrderRecordList( RB_Finance_OrderRecord model)
{
string where = " WHERE 1=1 ";
if (model.RB_Group_Id > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.RB_Group_Id) + "={0} ", model.RB_Group_Id);
}
if (model.ContractId > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.ContractId) + "={0} ", model.ContractId);
}
if (model.OrderId > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.OrderId) + "={0} ", model.OrderId);
}
if (model.FinanceId > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.FinanceId) + "={0} ", model.FinanceId);
}
if (!string.IsNullOrWhiteSpace(model.OutTradeNo))
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.OutTradeNo) + "='{0}' ", model.OutTradeNo);
}
if (model.Type > 0)
{
where += string.Format(" AND " + nameof(RB_Finance_OrderRecord.Type) + "={0} ", (int)model.Type);
}
return Get<RB_Finance_OrderRecord>( "select * from " + TableName + " " + where).ToList();
}
}
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Edu.Model.Entity.Finance;
namespace Edu.Repository.Finance
{
public class RB_Online_Trade_DetailRepository:BaseRepository<RB_Online_Trade_Detail>
{
/// <summary>
/// 表名称
/// </summary>
public string TableName { get { return nameof(RB_Online_Trade_Detail); } }
/// <summary>
/// 获取分页列表
/// </summary>
/// <param name="pageIndex"></param>
/// <param name="pageSize"></param>
/// <param name="count"></param>
/// <param name="model"></param>
/// <returns></returns>
public List<RB_Online_Trade_Detail> GetPageList(int pageIndex, int pageSize, out long count, RB_Online_Trade_Detail model)
{
string where = " WHERE 1=1 ";
if (model.RB_Group_Id > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.RB_Group_Id) + "={0} ", model.RB_Group_Id);
}
if (!string.IsNullOrEmpty(model.Pay_Order))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Pay_Order) + " like '%{0}%' ", model.Pay_Order);
}
if (!string.IsNullOrEmpty(model.Trade_Order))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Trade_Order) + " like '%{0}%' ", model.Trade_Order);
}
if (!string.IsNullOrEmpty(model.RefundTrade_Order))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.RefundTrade_Order) + " like '%{0}%' ", model.RefundTrade_Order);
}
if (model.OrderId > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.OrderId) + "={0} ", model.OrderId);
}
if (model.FinanceId > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.FinanceId) + "={0} ", model.FinanceId);
}
if (model.OrderSource > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.OrderSource) + "={0} ", (int)model.OrderSource);
}
if (model.Type > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Type) + "={0} ", (int)model.Type);
}
if (model.Pay_Way > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Pay_Way) + "={0} ", (int)model.Pay_Way);
}
if (model.RefundStatus > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.RefundStatus) + "={0} ", (int)model.RefundStatus);
}
if (!string.IsNullOrWhiteSpace(model.Mch_Id))
{
where += $@" AND {nameof(RB_Online_Trade_Detail.IsRefund)} like '%{model.Mch_Id}%')";
}
return GetPage<RB_Online_Trade_Detail>(pageIndex, pageSize, out count, "select * from " + TableName + " " + where).ToList();
}
/// <summary>
/// 通过条件获取列表
/// </summary>
/// <param name="model"></param>
/// <returns></returns>
public List<RB_Online_Trade_Detail> GetList(RB_Online_Trade_Detail model)
{
string where = " WHERE 1=1 ";
if (!string.IsNullOrEmpty(model.Pay_Order))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Pay_Order) + "='{0}' ", model.Pay_Order);
}
if (!string.IsNullOrEmpty(model.Trade_Order))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Trade_Order) + "='{0}' ", model.Trade_Order);
}
if (!string.IsNullOrEmpty(model.RefundTrade_Order))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.RefundTrade_Order) + " like '%{0}%' ", model.RefundTrade_Order);
}
if (model.OrderId > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.OrderId) + "={0} ", model.OrderId);
}
if (model.FinanceId > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.FinanceId) + "={0} ", model.FinanceId);
}
if (model.OrderSource > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.OrderSource) + "={0} ", (int)model.OrderSource);
}
if (model.Type > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Type) + "={0} ", (int)model.Type);
}
if (model.Pay_Way > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Pay_Way) + "={0} ", (int)model.Pay_Way);
}
if (model.RefundStatus > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.RefundStatus) + "={0} ", (int)model.RefundStatus);
}
if (!string.IsNullOrWhiteSpace(model.Mch_Id))
{
where += $@" AND {nameof(RB_Online_Trade_Detail.IsRefund)} like '%{model.Mch_Id}%')";
}
return Get<RB_Online_Trade_Detail>("select * from " + TableName + " " + where).ToList();
}
/// <summary>
/// 通过条件获取列表
/// </summary>
/// <param name="model"></param>
/// <param name="orderIds">订单号</param>
/// <returns></returns>
public List<RB_Online_Trade_Detail> GetList(RB_Online_Trade_Detail model, string orderIds)
{
string where = " WHERE 1=1 ";
if (model.OrderSource > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.OrderSource) + "={0} ", (int)model.OrderSource);
}
if (model.Type > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Type) + "={0} ", (int)model.Type);
}
if (model.Pay_Way > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.Pay_Way) + "={0} ", (int)model.Pay_Way);
}
if (model.RefundStatus > 0)
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.RefundStatus) + "={0} ", (int)model.RefundStatus);
}
if (!string.IsNullOrWhiteSpace(orderIds))
{
where += string.Format(" AND " + nameof(RB_Online_Trade_Detail.OrderId) + " in({0}) ", orderIds);
}
return Get<RB_Online_Trade_Detail>("select * from " + TableName + " " + where).ToList();
}
}
}
......@@ -351,7 +351,7 @@ namespace Edu.WebApi.Controllers.Course
{
var ClassId = base.ParmJObj.GetInt("ClassId", 0);
int Status = base.ParmJObj.GetInt("Status", 1);
var flag = classModule.RemoveClassModule(ClassId, Status,out string message);
var flag = classModule.RemoveClassModule(ClassId, Status, out string message);
return flag ? ApiResult.Success(message: message) : ApiResult.Failed(message: message);
}
......@@ -772,8 +772,8 @@ namespace Edu.WebApi.Controllers.Course
#region 获取学员信息
public ApiResult GetStudentList()
{
var schoolId = base.ParmJObj.GetInt("SchoolId",-1);
var data = classModule.GetStudentListRepository(new Model.ViewModel.User.RB_Student_ViewModel { School_Id = schoolId, Group_Id = base.UserInfo.Group_Id});
var schoolId = base.ParmJObj.GetInt("SchoolId", -1);
var data = classModule.GetStudentListRepository(new Model.ViewModel.User.RB_Student_ViewModel { School_Id = schoolId, Group_Id = base.UserInfo.Group_Id });
return ApiResult.Success(data: data);
}
#endregion
......@@ -976,7 +976,7 @@ namespace Edu.WebApi.Controllers.Course
{
//if (lessPlanDetailsId == itemDetails.LessonPlanId)
//{
tempDuration += itemDetails.Duration;
tempDuration += itemDetails.Duration;
//}
//else
//{
......@@ -1272,36 +1272,89 @@ namespace Edu.WebApi.Controllers.Course
}
else
{
var tempList = list.OrderBy(x => x.NewEndPlanDateTime).Where(x => x.NewPlanDateTime.HasValue && System.DateTime.Now >= x.NewPlanDateTime.Value && x.NewEndPlanDateTime.HasValue && System.DateTime.Now < x.NewEndPlanDateTime.Value).Take(1);
var tempList = list.OrderBy(x => x.NewEndPlanDateTime).Where(x => x.NewPlanDateTime.HasValue && System.DateTime.Now >= x.NewPlanDateTime.Value && x.NewEndPlanDateTime.HasValue && System.DateTime.Now < x.NewEndPlanDateTime.Value && x.NewPlanDateTime.Value.ToString("yyyy-MM-dd") == System.DateTime.Now.ToString("yyyy-MM-dd")).Take(1).ToList();
if (tempList == null || !tempList.Any())
{
tempList = list.OrderBy(x => x.NewEndPlanDateTime).Where(x => x.NewPlanDateTime.HasValue && System.DateTime.Now <= x.NewPlanDateTime.Value).Take(3);
tempList = list.OrderBy(x => x.NewEndPlanDateTime).Where(x => x.NewPlanDateTime.HasValue && System.DateTime.Now <= x.NewPlanDateTime.Value && x.NewPlanDateTime.Value.ToString("yyyy-MM-dd") == System.DateTime.Now.ToString("yyyy-MM-dd")).Take(1).ToList();
}
var result = tempList.Select(x => new
{
TeacherName = x.TeacherName ?? "",
TeacherIcon = x.TeacherIcon ?? "",
ClassName = x.ClassName ?? "",
CourseName = x.CourseName ?? "",
CourseNum = x.CourseNum ?? "",
StartTime = x.StartTime ?? "",
EndTime = x.EndTime ?? "",
x.ClassPlanId,
x.ClassId,
x.ClassRoomId,
x.Group_Id,
x.School_Id,
x.TeacherId,
x.ClassTimeId,
DateYStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("yyyy") : "",
DateMStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("MM") : "",
DateDStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("dd") : "",
x.ClassStatus,
SuiPaiList = string.IsNullOrWhiteSpace(x.SuiPai) ? new List<string>() : JsonHelper.DeserializeObject<List<string>>(x.SuiPai),
});
return ApiResult.Success(data: result);
if (tempList != null && tempList.Any())
{///查询最近2天的课程
var classPlanList = classModule.GetClassTimeByClassId(tempList.FirstOrDefault()?.ClassId ?? 0, 100000);
//tempList.AddRange(list.OrderBy(x => x.NewEndPlanDateTime).Where(x => x.NewPlanDateTime.HasValue && System.DateTime.Now <= x.NewPlanDateTime.Value && x.NewPlanDateTime.Value.ToString("yyyy-MM-dd") == System.DateTime.Now.AddDays(1).ToString("yyyy-MM-dd")));
var newClassPlanList = classPlanList.OrderBy(x => x.NewEndPlanDateTime).Where(x => x.NewPlanDateTime.HasValue && System.DateTime.Now <= x.NewPlanDateTime.Value && x.NewPlanDateTime.Value <= System.DateTime.Now.AddDays(1)).ToList();
List<object> result = new List<object>();
newClassPlanList.AddRange(tempList);
foreach (var item in newClassPlanList.GroupBy(x => x.NewPlanDateTime.Value.ToString("yyyy-MM-dd")))
{
result.Add(new
{
DayStr = item.Key,
result = newClassPlanList.OrderBy(x=>x.NewPlanDateTime).Where(x => x.NewPlanDateTime.Value.ToString("yyyy-MM-dd") == item.Key).Select(x => new
{
TeacherName = x.TeacherName ?? "",
TeacherIcon = x.TeacherHead ?? "",
ClassName = x.ClassName ?? "",
CourseName = x.CourseName ?? "",
CourseNum = x.CourseNum ?? "",
StartTime = x.StartTime ?? "",
EndTime = x.EndTime ?? "",
x.RoomName,
x.ClassPlanId,
x.ClassId,
x.ClassRoomId,
x.Group_Id,
x.School_Id,
x.TeacherId,
x.ClassTimeId,
DateYStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("yyyy") : "",
DateMStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("MM") : "",
DateDStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("dd") : "",
x.ClassStatus,
SuiPaiList = string.IsNullOrWhiteSpace(x.SuiPai) ? new List<string>() : JsonHelper.DeserializeObject<List<string>>(x.SuiPai),
})
});
}
var lastResult = new
{
tempList.FirstOrDefault()?.TeacherName,
tempList.FirstOrDefault()?.TeacherHead,
tempList.FirstOrDefault()?.ClassName,
tempList.FirstOrDefault()?.CourseName,
StartTime = tempList.FirstOrDefault()?.StartTime ?? "",
EndTime = tempList.FirstOrDefault()?.EndTime ?? "",
result
};
return ApiResult.Success(data: lastResult);
}
return ApiResult.Failed("暂无排课安排");
//var result = tempList.Select(x => new
//{
// TeacherName = x.TeacherName ?? "",
// TeacherIcon = x.TeacherHead ?? "",
// ClassName = x.ClassName ?? "",
// CourseName = x.CourseName ?? "",
// CourseNum = x.CourseNum ?? "",
// StartTime = x.StartTime ?? "",
// EndTime = x.EndTime ?? "",
// x.ClassPlanId,
// x.ClassId,
// x.ClassRoomId,
// x.Group_Id,
// x.School_Id,
// x.TeacherId,
// x.ClassTimeId,
// DateYStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("yyyy") : "",
// DateMStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("MM") : "",
// DateDStr = x.NewPlanDateTime.HasValue ? x.NewPlanDateTime.Value.ToString("dd") : "",
// x.ClassStatus,
// SuiPaiList = string.IsNullOrWhiteSpace(x.SuiPai) ? new List<string>() : JsonHelper.DeserializeObject<List<string>>(x.SuiPai),
//});
}
}
......
This diff is collapsed.
{
"ConnectionStrings": {
"DefaultConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient",
"FinanceConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=test_reborn_finance;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"FinanceConnectionPName": "MySql.Data.MySqlClient",
"DataStatisticsConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_datastatistics;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DataStatisticsConnectionPName": "MySql.Data.MySqlClient",
"LogConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_sys;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"LogConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 86400,
"IsSendMsg": 2,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.36:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"ErpViewFileSiteUrl": "http://imgfile.oytour.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"WkHtmlToPdfPath": "D:/wkhtmltopdf/bin/",
"FinanceKey": "FinanceMallInsertToERPViitto2020",
"PaymentFinanceApi": "http://192.168.1.13:8083/api/Mall/InsertFinanceBatchForMallOut",
"FinanceDateBase": "test_reborn_finance",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019",
"QueenName": "vt_sys_message_test"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//未填写 未打分 下降比例
"OKRMatterValue": "30,100,100",
//是否是线上环境
"IsOnline": false,
//退课流程编号
"BackClassFlowId": 1,
//分区校长岗位编号
"SchoolPostId": 3,
//教务长
"JiaoWuZhang": 8,
//留学就业部门主管审核编号[王涛]
"StudyAbroadDirectorId": 64,
//留学就业部门负责人审核编号[姚顺先]
"StudyAbroadManagerId": 52,
//合同默认抬头
"ContractDefaultTitle": "JH-DZ-CD-",
//消息推送AppId
"PushAppId": "JiaHeJiaoYu",
//是否推送消息
"IsPushMessage": "1",
//超过下班时间60分钟不能打卡
"MoreThanMinutes": 60
"ConnectionStrings": {
"DefaultConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_edu;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DefaultConnectionPName": "MySql.Data.MySqlClient",
"FinanceConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=test_reborn_finance;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"FinanceConnectionPName": "MySql.Data.MySqlClient",
"DataStatisticsConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_datastatistics;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"DataStatisticsConnectionPName": "MySql.Data.MySqlClient",
"LogConnection": "server=192.168.20.214;user id=reborn;password=Reborn@2018;database=reborn_sys;CharSet=utf8mb4; Convert Zero Datetime=true; ",
"LogConnectionPName": "MySql.Data.MySqlClient"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"SettlementRate": "0.60",
"JwtSecretKey": "@VIITTOREBORN*2018",
"JwtExpirTime": 86400,
"IsSendMsg": 2,
"AllowedHosts": "*",
"OpenValidation": "False",
"UploadSiteUrl": "http://192.168.1.36:8120",
"ViewFileSiteUrl": "https://viitto-1301420277.cos.ap-chengdu.myqcloud.com",
"ErpViewFileSiteUrl": "http://imgfile.oytour.com",
"Mongo": "mongodb://47.96.25.130:27017",
"MongoDBName": "Edu",
"WkHtmlToPdfPath": "D:/wkhtmltopdf/bin/",
"FinanceKey": "FinanceMallInsertToERPViitto2020",
"PaymentFinanceApi": "http://192.168.1.13:8083/api/Mall/InsertFinanceBatchForMallIn",
"IncomeFinanceApi": "http://192.168.20.9:8083/api/Mall/InsertFinanceBatchForMallOut",
"sTenpayNotifyUrl": "http://eduapi.oytour.com/api/WeChatPay/WxPayCallback", //下单回调地址
"sTenpayNotifyRefundUrl": "http://eduapi.oytour.com/api/WeChatPay/Refunds", //退款回调地址
"FinanceDateBase": "test_reborn_finance",
"RabbitMqConfig": {
"HostName": "47.96.25.130",
"VirtualHost": "/",
"Port": 5672,
"UserName": "guest",
"Password": "viitto2019",
"QueenName": "vt_sys_message_test"
},
"RedisSetting": {
"RedisServer": "47.96.23.199",
"RedisPort": "6379",
"RedisPwd": "Viitto2018"
},
"VirtualDirectory": "WebFile",
//未填写 未打分 下降比例
"OKRMatterValue": "30,100,100",
//是否是线上环境
"IsOnline": false,
//退课流程编号
"BackClassFlowId": 1,
//分区校长岗位编号
"SchoolPostId": 3,
//教务长
"JiaoWuZhang": 8,
//留学就业部门主管审核编号[王涛]
"StudyAbroadDirectorId": 64,
//留学就业部门负责人审核编号[姚顺先]
"StudyAbroadManagerId": 52,
//合同默认抬头
"ContractDefaultTitle": "JH-DZ-CD-",
//消息推送AppId
"PushAppId": "JiaHeJiaoYu",
//是否推送消息
"IsPushMessage": "1",
//超过下班时间60分钟不能打卡
"MoreThanMinutes": 60
}
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment