using Microsoft.VisualStudio.TestTools.UnitTesting; using Senparc.CO2NET.Extensions; using Senparc.Weixin.Helpers; using Senparc.Weixin.TenPayV3.Apis; using Senparc.Weixin.TenPayV3.Apis.BasePay; using Senparc.Weixin.TenPayV3.Entities; using Senparc.Weixin.TenPayV3.Helpers; using Senparc.Weixin.TenPayV3.Test; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.ConstrainedExecution; using System.Text; using System.Xml.Linq; namespace Senparc.Weixin.TenPayV3.Apis.Tests { [TestClass()] public class BasePayApisTests : BaseTenPayTest { string openId = "olPjZjsXuQPJoV0HlruZkNzKc91E";//换成测试人的 OpenId #region 订单证书 [TestMethod()] public void CertificatesTest() { BasePayApis basePayApis = new BasePayApis(); var certs = basePayApis.CertificatesAsync().GetAwaiter().GetResult(); Assert.IsNotNull(certs); Console.WriteLine(certs.ToJson(true)); Assert.IsTrue(certs.ResultCode.Success); Assert.IsNull(certs.VerifySignSuccess);//不参与验证 Console.WriteLine(); var tenpayV3Setting = Senparc.Weixin.Config.SenparcWeixinSetting.TenpayV3Setting; var cert = certs.data.First(); var pubKey = SecurityHelper.AesGcmDecryptCiphertext(tenpayV3Setting.TenPayV3_APIv3Key, cert.encrypt_certificate.nonce, cert.encrypt_certificate.associated_data, cert.encrypt_certificate.ciphertext); Console.WriteLine(pubKey); Assert.IsNotNull(pubKey); } [TestMethod()] public void GetPublicKeysAsyncTest() { BasePayApis basePayApis = new BasePayApis(); var publicKeys = basePayApis.GetPublicKeysAsync().GetAwaiter().GetResult(); Assert.IsNotNull(publicKeys); Console.WriteLine(publicKeys.ToJson(true)); } #endregion #region 下单接口 TransactionsRequestData jsApiRequestData = null; [TestMethod()] public void JsAPiAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); //TODO: JsApiRequestData修改构造函数参数顺序 jsApiRequestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1)), null, TenPayV3Info.TenPayV3Notify, null, new() { currency = "CNY", total = price }, new(openId), null, null, null); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.JsApiAsync(jsApiRequestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void AppAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); TransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1)), null, TenPayV3Info.TenPayV3Notify, null, new() { currency = "CNY", total = price }, null, null, null, null); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.AppAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void H5AsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); //注意:H5下单scene_info参数必填 TransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1)), null, TenPayV3Info.TenPayV3Notify, null, new() { currency = "CNY", total = price }, null, null, null, new("14.23.150.211", null, null, new("Android", null, null, null, null))); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.H5Async(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void NativeAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); TransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, name, sp_billno, new TenpayDateTime(DateTime.Now.AddHours(1)), null, TenPayV3Info.TenPayV3Notify, null, new() { currency = "CNY", total = price }, null, null, null, null); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.NativeAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void JsApiCombineAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var combine_sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); var orderIndex = 0; //获取新的子订单 Func getSubOrder = () => { orderIndex++; var out_trade_no = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6) + orderIndex); Console.WriteLine(orderIndex + " SubOrder \t" + out_trade_no); return new(TenPayV3Info.MchId, name + orderIndex, new(price + orderIndex, "CNY"), out_trade_no, null, "子订单测试" + orderIndex, null); }; var subOrders = new List { getSubOrder() }; CombineTransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, combine_sp_billno, null, subOrders, new(openId), null, null, TenPayV3Info.TenPayV3Notify); BasePayApis basePayApis = new BasePayApis(); JsApiReturnJson result = null; var errorMsg = "sub_orders 参数必须在 2 到 10 之间!"; //测试 1 个子订单 result = basePayApis.JsApiCombineAsync(requestData).GetAwaiter().GetResult(); Assert.IsFalse(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == null);//未通过验证 Assert.AreEqual(errorMsg, result.ResultCode.ErrorMessage); //测试 2 个子订单 subOrders.Add(getSubOrder()); Console.WriteLine("2 个子订单,Request:" + requestData.ToJson(true)); result = basePayApis.JsApiCombineAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("2 个子订单:" + result.ToJson()); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 //测试 10 个子订单 for (int i = 2; i < 10; i++) { subOrders.Add(getSubOrder()); } result = basePayApis.JsApiCombineAsync(requestData).GetAwaiter().GetResult(); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 Console.WriteLine("10 个子订单:" + result.ToJson()); //测试 11 个子订单 subOrders.Add(getSubOrder()); result = basePayApis.JsApiCombineAsync(requestData).GetAwaiter().GetResult(); Assert.IsFalse(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == null);//未通过验证 Assert.AreEqual(errorMsg, result.ResultCode.ErrorMessage); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void AppCombineAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var combine_sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); CombineTransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, combine_sp_billno, null, new CombineTransactionsRequestData.Sub_Order[] { new(TenPayV3Info.MchId, name, new(price, "CNY"), sp_billno, null, "子订单测试1", null) }, new(openId), null, null, TenPayV3Info.TenPayV3Notify); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.AppCombineAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void H5CombineAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var combine_sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); //注意:H5下单scene_info参数必填 CombineTransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, combine_sp_billno, new("14.23.150.211", null, new("Android", null, null, null, null)), new CombineTransactionsRequestData.Sub_Order[] { new(TenPayV3Info.MchId, name, new(price, "CNY"), sp_billno, null, "子订单测试1", null) }, new(openId), null, null, TenPayV3Info.TenPayV3Notify); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.H5CombineAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void NativeCombineAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var price = 100; var name = "单元测试-" + DateTime.Now.ToString(); var combine_sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); var sp_billno = string.Format("{0}{1}{2}", TenPayV3Info.MchId/*10位*/, SystemTime.Now.ToString("yyyyMMddHHmmss"), TenPayV3Util.BuildRandomStr(6)); CombineTransactionsRequestData requestData = new(TenPayV3Info.AppId, TenPayV3Info.MchId, combine_sp_billno, null, new CombineTransactionsRequestData.Sub_Order[] { new(TenPayV3Info.MchId, name, new(price, "CNY"), sp_billno, null, "子订单测试1", null) }, new(openId), null, null, TenPayV3Info.TenPayV3Notify); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.NativeCombineAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 预支付结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } #endregion #region 订单操作接口 [TestMethod()] public void OrderQueryByTransactionIdAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var transaction_id = "transaction_id";//TODO: 这里应该填上已有订单的transaction_id BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.OrderQueryByTransactionIdAsync(transaction_id, TenPayV3Info.MchId).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 订单查询结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void OrderQueryByOutTradeNoAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; //先获取下一个订单 if (jsApiRequestData == null) { JsAPiAsyncTest(); } var out_trade_no = jsApiRequestData.out_trade_no;// 这里应该填上已有订单的out_trade_no Console.WriteLine("out_trade_no:" + out_trade_no); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.OrderQueryByOutTradeNoAsync(out_trade_no, TenPayV3Info.MchId).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 订单查询结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } //[TestMethod()] public void CloseOrderAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var out_trade_no = "out_trade_no";//TODO: 这里应该填上已有订单的out_trade_no BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.CloseOrderAsync(out_trade_no, TenPayV3Info.MchId).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 订单关闭结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void CombineOrderQueryAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var combine_out_trade_no = "combine_out_trade_no";//TODO: 这里应该填上已有订单的combine_out_trade_no BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.CombineOrderQueryAsync(combine_out_trade_no).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 合单查询结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } //[TestMethod()] public void CloseCombineOrderAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var combine_out_trade_no = "combine_out_trade_no";//TODO: 这里应该填上已有合单的combine_out_trade_no BasePayApis basePayApis = new BasePayApis(); //查询合单 构建Sub_Orders var CombineOrder = basePayApis.CombineOrderQueryAsync(combine_out_trade_no).GetAwaiter().GetResult(); var sub_orders = new CloseCombineOrderRequestData.Sub_Order[CombineOrder.sub_orders.Length]; for (var i = 0; i != sub_orders.Length; ++i) { sub_orders[i].mchid = CombineOrder.sub_orders[i].mchid; sub_orders[i].out_trade_no = CombineOrder.sub_orders[i].out_trade_no; } CloseCombineOrderRequestData requestData = new(TenPayV3Info.AppId, sub_orders); var result = basePayApis.CloseCombineOrderAsync(combine_out_trade_no, requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 合单关闭结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } #endregion #region 退款操作接口 //[TestMethod()] public void RefundAsyncTest() { var key = TenPayHelper.GetRegisterKey(Config.SenparcWeixinSetting); var TenPayV3Info = TenPayV3InfoCollection.Data[key]; var transaction_id = "transaction_id";//TODO: 应该填入订单的transaction_id var out_refund_no = "out_refund_no";//TODO: out_refund_no BasePayApis basePayApis = new BasePayApis(); //查询订单获得订单金额 var total = basePayApis.OrderQueryByOutTradeNoAsync(out_refund_no, TenPayV3Info.MchId).GetAwaiter().GetResult().amount.total; //请求退款 RefundRequsetData requestData = new(transaction_id, null, out_refund_no, "退款单元测试", null, null, new(total, null, total, "CNY"), null); var result = basePayApis.RefundAsync(requestData).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 退款结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } [TestMethod()] public void RefundQueryAsyncTest() { var out_refund_no = "out_refund_no";//TODO: 这里应该填上已有订单的out_refund_no BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.RefundQueryAsync(out_refund_no).GetAwaiter().GetResult(); Console.WriteLine("微信支付 V3 退款查询结果:" + result.ToJson(true)); Assert.IsNotNull(result); Assert.IsTrue(result.ResultCode.Success); Assert.IsTrue(result.VerifySignSuccess == true);//通过验证 } #endregion #region 交易账单接口 [TestMethod()] public void TradeBillQueryAsyncTest() { var bill_date = "2021-08-29";//格式YYYY-MM-DD var filePath = $"{bill_date}_{SystemTime.Now.ToString("HHmmss")}-TradeBill.csv"; Console.WriteLine("FilePath:" + filePath); var fs = new FileStream(filePath, FileMode.OpenOrCreate); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.TradeBillQueryAsync(bill_date, fileStream: 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); } [TestMethod()] public void FundflowBillQueryAsyncTest() { var bill_date = "2021-08-27";//格式YYYY-MM-DD var filePath = $"{bill_date}-FundflowBillQuery.csv"; Console.WriteLine("FilePath:" + filePath); var fs = new FileStream(filePath, FileMode.OpenOrCreate); BasePayApis basePayApis = new BasePayApis(); var result = basePayApis.FundflowBillQueryAsync(bill_date, 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); } #endregion } }