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.

484 lines
19 KiB

2 years ago
using Microsoft.VisualStudio.TestTools.UnitTesting;
using Senparc.CO2NET.Extensions;
using Senparc.Weixin.Helpers;
using Senparc.Weixin.TenPayV3.Apis.Marketing;
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.Tests
{
public partial class MarketingApisTests
{
#region 代金券接口
CreateStockReturnJson createStockResult = null;
DistributeStockReturnJson distributeStockResult = null;
/// <summary>
/// 创建代金券接口批次测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_1.shtml
/// </summary>
[TestMethod()]
public void CreateStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 代金券批次发放使用规则 发放10张优惠券 预算1000分 每个用户限领10张 开启防刷
var stock_use_rule = new CreateStockRequsetData.Stock_Use_Rule(2, 4, null, 2, false, true);
// 代金券使用规则 指明可使用本批次代金券的商户号
var coupon_use_rule = new CreateStockRequsetData.Coupon_Use_Rule(null, null, null, null, null, null, null, new string[] { TenPayV3Info.MchId/*"1610625015"*/ });
// TODO:流水号?这样是否有效?
var out_request_no = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6));
var requestData = new CreateStockRequsetData("单元测试代金券批次", "用于单元测试", TenPayV3Info.MchId, new TenpayDateTime(DateTime.Now.AddMinutes(1)), new TenpayDateTime(DateTime.Now.AddMinutes(30)), stock_use_rule, null, coupon_use_rule, true, "NORMAL", out_request_no);
/*
* 使
*/
var marketingApis = new MarketingApis();
try
{
// stock_type = "NORMAL" 的情况
createStockResult = marketingApis.CreateStockAsync(requestData).GetAwaiter().GetResult();
}
catch (Exception ex)
{
Assert.IsInstanceOfType(ex, typeof(TenpayApiRequestException));
Console.WriteLine(ex.Message);
Assert.IsTrue(ex.Message.Contains("必填"));
}
try
{
//修改参数
requestData.coupon_use_rule.fixed_normal_coupon = new CreateStockRequsetData.Coupon_Use_Rule.Fixed_Normal_Coupon(6, 1);
createStockResult = marketingApis.CreateStockAsync(requestData).GetAwaiter().GetResult();
}
catch (Exception ex)
{
Assert.IsInstanceOfType(ex, typeof(TenpayApiRequestException));
Console.WriteLine(ex.Message);
Assert.IsTrue(ex.Message.Contains("必须等于"));
}
try
{
//修改参数
requestData.coupon_use_rule.fixed_normal_coupon.coupon_amount = 2;// coupon_amount = max_coupons * max_coupons_per_user
createStockResult = marketingApis.CreateStockAsync(requestData).GetAwaiter().GetResult();
}
catch (Exception ex)
{
Assert.IsInstanceOfType(ex, typeof(TenpayApiRequestException));
Console.WriteLine(ex.Message);
Assert.IsTrue(ex.Message.Contains("必须小于等于"));
}
//修改参数
requestData.coupon_use_rule.fixed_normal_coupon.transaction_minimum = 2;// coupon_amount = max_coupons * max_coupons_per_user
createStockResult = marketingApis.CreateStockAsync(requestData).GetAwaiter().GetResult();
Assert.IsTrue(createStockResult.ResultCode.Additional.Contains("可用商户不符合规则,请检查"));
//修改参数
requestData.no_cash = false;//只有当参数为 false 时,可以使用本商户,否则只能使用其他商户
createStockResult = marketingApis.CreateStockAsync(requestData).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 创建代金券接口批次结果:" + createStockResult.ToJson(true));
Assert.IsNotNull(createStockResult);
Assert.IsTrue(createStockResult.ResultCode.Success);
Assert.IsTrue(createStockResult.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 激活代金券批次接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_3.shtml
/// </summary>
[TestMethod()]
public void StartStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未创建代金券批次 则创建新的代金券批次
if (createStockResult is null)
{
CreateStockAsyncTest();
}
var requestData = new StartStockRequsetData(TenPayV3Info.MchId);
var marketingApis = new MarketingApis();
var result = marketingApis.StartStockAsync(createStockResult.stock_id, requestData).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 激活代金券批次接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 发放代金券批次接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_2.shtml
/// </summary>
[TestMethod()]
public void DistributeStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未创建代金券批次 则创建新的代金券批次 并且激活
if (createStockResult is null)
{
StartStockAsyncTest();
}
var out_request_no = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6));
var requestData = new DistributeStockRequsetData(createStockResult.stock_id, out_request_no, TenPayV3Info.AppId, TenPayV3Info.MchId);
var marketingApis = new MarketingApis();
distributeStockResult = marketingApis.DistributeStockAsync(openId, requestData).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 发放代金券批次接口结果:" + distributeStockResult.ToJson(true));
Assert.IsNotNull(distributeStockResult);
Assert.IsTrue(distributeStockResult.ResultCode.Success);
Assert.IsTrue(distributeStockResult.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 暂停发放代金券批次接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_13.shtml
/// </summary>
[TestMethod()]
public void PauseStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未创建代金券批次 则创建新的代金券批次 并且激活
if (createStockResult is null)
{
StartStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.PauseStockAsync(createStockResult.stock_id, TenPayV3Info.MchId).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 暂停发放代金券批次接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 重启发放代金券批次接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_14.shtml
/// </summary>
[TestMethod()]
public void RestartStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未创建代金券批次 则创建新的代金券批次 激活 然后暂停发放
if (createStockResult is null)
{
PauseStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.RestartStockAsync(createStockResult.stock_id, TenPayV3Info.MchId).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 重启发放代金券批次接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 条件查询代金券批次接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_4.shtml
/// </summary>
[TestMethod()]
public void QueryStocksAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
var marketingApis = new MarketingApis();
var result = marketingApis.QueryStocksAsync(0, 10, TenPayV3Info.MchId).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 条件查询代金券批次接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 查询代金券批次详情接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_5.shtml
/// </summary>
[TestMethod()]
public void QueryStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未创建代金券批次 则创建新的代金券批次
if (createStockResult is null)
{
CreateStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.QueryStockAsync(createStockResult.stock_id, TenPayV3Info.MchId).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 查询代金券批次详情接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 查询代金券详情接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_6.shtml
/// </summary>
[TestMethod()]
public void QueryCouponAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未发放代金券 则发放代金券
if (distributeStockResult is null)
{
DistributeStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.QueryCouponAsync(distributeStockResult.coupon_id, TenPayV3Info.AppId, openId).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 查询代金券详情接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 查询代金券可用商户接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_7.shtml
/// </summary>
[TestMethod()]
public void QueryMerchantsStockAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未发放代金券 则创建放代金券
if (createStockResult is null)
{
CreateStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.QueryMerchantsStockAsync(0, 50, TenPayV3Info.MchId, createStockResult.stock_id).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 查询代金券可用商户接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 查询代金券可用单品接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_8.shtml
/// </summary>
[TestMethod()]
public void QueryItemsAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未发放代金券 则创建代金券
if (createStockResult is null)
{
CreateStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.QueryItemsAsync(0, 50, TenPayV3Info.MchId, createStockResult.stock_id).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 查询代金券可用单品接口结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 根据商户号查用户的券接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_9.shtml
/// </summary>
[TestMethod()]
public void QueryCouponsAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
// 如果还未发放代金券 则创建代金券
if (createStockResult is null)
{
CreateStockAsyncTest();
}
var marketingApis = new MarketingApis();
var result = marketingApis.QueryCouponsAsync(openId, TenPayV3Info.AppId, createStockResult.stock_id, null, TenPayV3Info.MchId, null, null).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 下载批次核销明细结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
/// <summary>
/// 下载批次核销明细接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_10.shtml
/// </summary>
[TestMethod()]
public void DownloadStockUseFlowAsyncTest()
{
// 如果还未发放代金券 则创建代金券
//if (createStockResult is null)
//{
// CreateStockAsyncTest();
//}
var stock_id = "15918471";//15918329,15918470 //改成上一天某一个ID //createStockResult.stock_id;
var filePath = $"{stock_id}_{SystemTime.Now.ToString("HHmmss")}-StockUseFlow.csv";
Console.WriteLine("FilePath:" + filePath);
var fs = new FileStream(filePath, FileMode.OpenOrCreate);
var marketingApis = new MarketingApis();
var result = marketingApis.DownloadStockUseFlowAsync(stock_id, fs).GetAwaiter().GetResult();
fs.Flush();
Console.WriteLine("FileStream Length:" + fs.Length);
fs.Close();
Console.WriteLine("微信支付 V3 下载批次退款明细结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
Assert.IsTrue(File.Exists(filePath));
////校验文件
//var fileHash = CO2NET.Helpers.FileHelper.GetFileHash(filePath, result.hash_type);
//Assert.AreEqual(result.hash_value.ToUpper(), fileHash);
}
/// <summary>
/// 下载批次核销明细接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_11.shtml
/// </summary>
[TestMethod()]
public void DownloadStockRefundFlowAsyncTest()
{
// 如果还未发放代金券 则创建代金券
if (createStockResult is null)
{
CreateStockAsyncTest();
}
var stock_id = createStockResult.stock_id;
var filePath = $"{stock_id}_{SystemTime.Now.ToString("HHmmss")}-StockRefundFlow.csv";
Console.WriteLine("FilePath:" + filePath);
var fs = new FileStream(filePath, FileMode.OpenOrCreate);
var marketingApis = new MarketingApis();
var result = marketingApis.DownloadStockRefundFlowAsync(stock_id, fs).GetAwaiter().GetResult();
fs.Flush();
Console.WriteLine("FileStream Length:" + fs.Length);
fs.Close();
Console.WriteLine("微信支付 V3 交易账单查询结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
Assert.IsTrue(File.Exists(filePath));
////校验文件
//var fileHash = CO2NET.Helpers.FileHelper.GetFileHash(filePath, result.hash_type);
//Assert.AreEqual(result.hash_value.ToUpper(), fileHash);
}
/// <summary>
/// 设置营销事件消息通知地址接口测试
/// https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter9_1_12.shtml
/// </summary>
[TestMethod()]
public void SetNotifyUrlAsyncTest()
{
var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting);
var TenPayV3Info = TenPayV3InfoCollection.Data[key];
var marketingApis = new MarketingApis();
var notifyUrl = "https://sdk.weixin.senparc.com/TenPayApiV3/FavorNotifyCallback";
var requestData = new SetNotifyUrlRequsetData(TenPayV3Info.MchId, notifyUrl, null);
var result = marketingApis.SetNotifyUrlAsync(requestData).GetAwaiter().GetResult();
Console.WriteLine("微信支付 V3 设置营销事件消息通知地址结果:" + result.ToJson(true));
Assert.IsNotNull(result);
Assert.IsTrue(result.ResultCode.Success);
Assert.IsTrue(result.VerifySignSuccess == true);//通过验证
}
#endregion
}
}