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.

143 lines
7.2 KiB

2 years ago
#region Apache License Version 2.0
/*----------------------------------------------------------------
Copyright 2022 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) 2022 Senparc
VehicleParkingApis.cs
V3
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.VehicleParking;
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支付分停车接口
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_1.shtml 下的【支付分停车】所有接口
/// </summary>
public partial class VehicleParkingApis
{
private ISenparcWeixinSettingForTenpayV3 _tenpayV3Setting;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="senparcWeixinSettingForTenpayV3"></param>
public VehicleParkingApis(ISenparcWeixinSettingForTenpayV3 senparcWeixinSettingForTenpayV3 = null)
{
_tenpayV3Setting = senparcWeixinSettingForTenpayV3 ?? Senparc.Weixin.Config.SenparcWeixinSetting.TenpayV3Setting;
}
/// <summary>
/// 返回可用的微信支付地址(自动判断是否使用沙箱)
/// </summary>
/// <param name="urlFormat">如:<code>https://api.mch.weixin.qq.com/{0}pay/unifiedorder</code></param>
/// <returns></returns>
// TODO: 重复使用
private static string ReurnPayApiUrl(string urlFormat)
{
return string.Format(urlFormat, Senparc.Weixin.Config.UseSandBoxPay ? "sandboxnew/" : "");
}
/// <summary>
/// 查询车牌服务开通信息接口
/// <para>该接口仅支持停车场景,商户首先请求查询车牌服务开通信息接口,确认该车牌,是否被该用户开通车主服务。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_1.shtml </para>
/// </summary>
/// <param name="appid">appid是商户在微信申请公众号或移动应用成功后分配的账号ID登录平台为mp.weixin.qq.com或open.weixin.qq.com</param>
/// <param name="plate_number">车牌号,仅包括省份+车牌,不包括特殊字符。</param>
/// <param name="plate_color">车牌颜色枚举值BLUE蓝色 GREEN绿色 YELLOW黄色 BLACK黑色 WHITE白色 LIMEGREEN黄绿色</param>
/// <param name="openid">用户在商户对应appid下的唯一标识</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<QueryServiceReturnJson> QueryServiceAsync(string appid, string plate_number, string plate_color, string openid, int timeOut = Config.TIME_OUT)
{
var url = ReurnPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/vehicle/parking/services/find?appid={appid}&plate_number={plate_number}&plate_color={plate_color}&openid={openid}");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<QueryServiceReturnJson>(url, null, timeOut, ApiRequestMethod.GET);
}
/// <summary>
/// 创建停车入场接口
/// <para>车辆入场以后,商户调用该接口,创建停车入场信息</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_2.shtml </para>
/// </summary>
/// <param name="data">微信支付需要POST的Data数据</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<CreateParkingReturnJson> CreateParkingAsync(CreateParkingRequestData data, int timeOut = Config.TIME_OUT)
{
var url = ReurnPayApiUrl(Senparc.Weixin.Config.TenPayV3Host + "/{0}v3/vehicle/parking/parkings");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<CreateParkingReturnJson>(url, data, timeOut);
}
/// <summary>
/// 扣费受理接口
/// <para>商户请求扣费受理接口,会完成订单受理。微信支付进行异步扣款,支付完成后,会将订单支付结果发送给商户。</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_3.shtml </para>
/// </summary>
/// <param name="data">微信支付需要POST的Data数据</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<PayParkingReturnJson> PayParkingAsync(PayParkingRequestData data, int timeOut = Config.TIME_OUT)
{
//TODO: 方法名是否恰当?
var url = ReurnPayApiUrl(Senparc.Weixin.Config.TenPayV3Host + "/{0}v3/vehicle/transactions/parking");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<PayParkingReturnJson>(url, data, timeOut);
}
/// <summary>
/// 查询订单接口
/// <para>商户通过商户订单号,来查询订单信息</para>
/// <para>更多详细请参考 https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter8_8_4.shtml </para>
/// </summary>
/// <param name="out_trade_no">商户系统内部订单号,只能是数字、大小写字母,且在同一个商户号下唯一</param>
/// <param name="timeOut">超时时间单位为ms</param>
/// <returns></returns>
public async Task<QueryParkingReturnJson> QueryParkingAsync(string out_trade_no, int timeOut = Config.TIME_OUT)
{
var url = ReurnPayApiUrl($"{Senparc.Weixin.Config.TenPayV3Host}/{{0}}v3/vehicle/transactions/out-trade-no/{out_trade_no}");
TenPayApiRequest tenPayApiRequest = new(_tenpayV3Setting);
return await tenPayApiRequest.RequestAsync<QueryParkingReturnJson>(url, null, timeOut, ApiRequestMethod.GET);
}
}
}