You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
13 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#region Apache License Version 2.0
/*----------------------------------------------------------------
Copyright 2023 Jeffrey Su & Suzhou Senparc Network Technology Co.,Ltd.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
except in compliance with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed under the
License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
either express or implied. See the License for the specific language governing permissions
and limitations under the License.
Detail: https://github.com/JeffreySu/WeiXinMPSDK/blob/master/license.md
----------------------------------------------------------------*/
#endregion Apache License Version 2.0
/*----------------------------------------------------------------
Copyright (C) 2023 Senparc
文件名ComplaintApis.cs
文件功能描述微信支付V3消费者投诉2.0接口
创建标识Senparc - 20210926
----------------------------------------------------------------*/
using Senparc.CO2NET.Extensions;
using Senparc.CO2NET.Helpers;
using Senparc.CO2NET.Trace;
using Senparc.Weixin.Entities;
using Senparc.Weixin.TenPayV3.Apis.Entities;
using Senparc.Weixin.TenPayV3.Apis.Complaint;
using Senparc.Weixin.TenPayV3.Entities;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Senparc.Weixin.TenPayV3.Apis
{
/// <summary>
/// 微信支付V3消费者投诉2.0接口
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_11.shtml 下的【消费者投诉2.0】所有接口
/// </summary>
public partial class ComplaintApis
{
private ISenparcWeixinSettingForTenpayV3 _tenpayV3Setting;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="senparcWeixinSettingForTenpayV3"></param>
public ComplaintApis(ISenparcWeixinSettingForTenpayV3 senparcWeixinSettingForTenpayV3 = null)
{
_tenpayV3Setting = senparcWeixinSettingForTenpayV3 ?? Senparc.Weixin.Config.SenparcWeixinSetting.TenpayV3Setting;
}
/// <summary>
/// 查询投诉单列表接口
/// <para>商户可通过调用此接口,查询指定时间段的所有用户投诉信息,以分页输出查询结果。对于服务商、渠道商,可通过调用此接口,查询指定子商户号对应子商户的投诉信息,若不指定则查询所有子商户投诉信息。</para>
/// <para>注意商户上送敏感信息时使用微信支付平台公钥加密证书序列号包含在请求HTTP头部的Wechatpay-Serial详见接口规则</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_11.shtml </para>
/// </summary>
/// <param name="begin_date">投诉发生的开始日期格式为YYYY-MM-DD。注意查询日期跨度不超过30天当前查询为实时查询</param>
/// <param name="end_date">投诉发生的结束日期格式为YYYY-MM-DD。注意查询日期跨度不超过30天当前查询为实时查询</param>
/// <param name="complainted_mchid">投诉单对应的被诉商户号, 可为null</param>
/// <param name="limit">设置该次请求返回的最大投诉条数范围【1,50】,商户自定义字段不传默认为10。注如遇到提示“当前查询结果数据量过大”是回包触发微信支付下行数据包大小限制请缩小入参limit并重试。</param>
/// <param name="offset">该次请求的分页开始位置从0开始计数例如offset=10表示从第11条记录开始返回不传默认为0 。</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<QueryComplaintsReturnJson> QueryComplaintsAsync(TenpayDateTime begin_date, TenpayDateTime end_date, string complainted_mchid, int limit = 10, int offset = 0, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/merchant-service/complaints-v2?limit={limit}&offset={offset}&begin_date={begin_date?.ToString()}&end_date={end_date?.ToString()}");
url += complainted_mchid is not null ? $"&complainted_mchid={complainted_mchid}" : "";
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<QueryComplaintsReturnJson>(url, null, timeOut, ApiRequestMethod.GET);
}
/// <summary>
/// 查询投诉单详情接口
/// <para>商户可通过调用此接口,查询指定投诉单的用户投诉详情,包含投诉内容、投诉关联订单、投诉人联系方式等信息,方便商户处理投诉。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_13.shtml </para>
/// </summary>
/// <param name="complaint_id">投诉单对应的投诉单号</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<QueryComplaintReturnJson> QueryComplaintAsync(string complaint_id, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/merchant-service/complaints-v2/{complaint_id}");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<QueryComplaintReturnJson>(url, null, timeOut, ApiRequestMethod.GET);
}
/// <summary>
/// 查询投诉协商历史接口
/// <para>商户可通过调用此接口,查询指定投诉的用户商户协商历史,以分页输出查询结果,方便商户根据处理历史来制定后续处理方案。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_12.shtml </para>
/// </summary>
/// <param name="complaint_id">投诉单对应的投诉单号</param>
/// <param name="limit">设置该次请求返回的最大协商历史条数,范围[1,300]不传默认为100。 注如遇到提示“当前查询结果数据量过大”是回包触发微信支付下行数据包大小限制请缩小入参limit并重试。</param>
/// <param name="offset">该次请求的分页开始位置从0开始计数例如offset=10表示从第11条记录开始返回不传默认为0。</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<QueryNegotiationHistorysReturnJson> QueryNegotiationHistorysAsync(string complaint_id, int limit = 10, int offset = 0, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/merchant-service/complaints-v2/{complaint_id}/negotiation-historys?limit={limit}&offset={offset}");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<QueryNegotiationHistorysReturnJson>(url, null, timeOut, ApiRequestMethod.GET);
}
/// <summary>
/// 创建投诉通知回调地址接口
/// <para>商户通过调用此接口创建投诉通知回调URL当用户产生新投诉且投诉状态已变更时微信支付会通过回 调URL通知商户。对于服务商、渠道商会收到所有子商户的投诉信息推送。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_2.shtml </para>
/// </summary>
/// <param name="data">微信支付需要POST的Data数据</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<CreateComplaintNotifyUrlReturnJson> CreateComplaintNotifyUrlAsync(CreateComplaintNotifyUrlRequestData data, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl(Senparc.Weixin.Config.TenPayV3Host + "/{0}v3/merchant-service/complaint-notifications");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<CreateComplaintNotifyUrlReturnJson>(url, data, timeOut);
}
/// <summary>
/// 查询投诉通知回调地址接口
/// <para>商户通过调用此接口查询投诉通知的回调URL。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_3.shtml </para>
/// </summary>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<QueryComplaintNotifyUrlReturnJson> QueryComplaintNotifyUrlAsync(int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl(Senparc.Weixin.Config.TenPayV3Host + "/{0}v3/merchant-service/complaint-notifications");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<QueryComplaintNotifyUrlReturnJson>(url, null, timeOut, ApiRequestMethod.GET);
}
/// <summary>
/// 更新投诉通知回调地址接口
/// <para>商户通过调用此接口更新投诉通知的回调URL。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_4.shtml </para>
/// </summary>
/// <param name="data">微信支付需要POST的Data数据</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<ModifyComplaintNotifyUrlReturnJson> ModifyComplaintNotifyUrlAsync(ModifyComplaintNotifyUrlRequestData data, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl(Senparc.Weixin.Config.TenPayV3Host + "/{0}v3/merchant-service/complaint-notifications");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<ModifyComplaintNotifyUrlReturnJson>(url, data, timeOut);
}
/// <summary>
/// 删除投诉通知回调地址接口
/// <para>当商户不再需要推送通知时可通过调用此接口删除投诉通知的回调URL取消通知回调。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_5.shtml </para>
/// </summary>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<ReturnJsonBase> DeleteComplaintNotifyUrlAsync(int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl(Senparc.Weixin.Config.TenPayV3Host + "/{0}v3/merchant-service/complaint-notifications");
//TODO: 此处新增DELETE方法 待测试是否有问题
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<ReturnJsonBase>(url, null, timeOut, ApiRequestMethod.DELETE);
}
/// <summary>
/// 提交回复接口
/// <para>商户可通过调用此接口提交回复内容。其中上传图片凭证需首先调用商户上传反馈图片接口得到图片id再将id填入请求。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_14.shtml </para>
/// </summary>
/// <param name="data">微信支付需要POST的Data数据</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<ReturnJsonBase> ResponseAsync(ResponseRequestData data, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/merchant-service/complaints-v2/{data.complaint_id}/response");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<ReturnJsonBase>(url, data, timeOut);
}
/// <summary>
/// 反馈处理完成接口
/// <para>商户可通过调用此接口,反馈投诉单已处理完成。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter10_2_15.shtml </para>
/// </summary>
/// <param name="data">微信支付需要POST的Data数据</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<ReturnJsonBase> CompleteComplaintAsync(CompleteComplaintRequestData data, int timeOut = Config.TIME_OUT)
{
var url = BasePayApis.GetPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/merchant-service/complaints-v2/{data.complaint_id}/complete");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<ReturnJsonBase>(url, data, timeOut);
}
//TODO: 图片上传接口
}
}