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

181 lines
7.8 KiB
C#

9 months ago
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using POSV.Utils;
using System.Security.Cryptography.X509Certificates;
namespace POSV
{
/// <summary>
/// 微信支付接口官方APIhttps://pay.weixin.qq.com/wiki/doc/api/index.html
/// </summary>
public static class WxPayV3
{
/// <summary>
/// 统一支付接口
/// 统一支付接口可接受JSAPI/NATIVE/APP 下预支付订单返回预支付订单号。NATIVE 支付返回二维码code_url。
/// </summary>
/// <param name="dataInfo">微信支付需要post的Data数据</param>
/// <param name="timeOut"></param>
/// <returns></returns>
public static UnifiedorderResult Unifiedorder(WxPayV3UnifiedorderRequestData dataInfo, int timeOut = Constant.TIMEOUT)
{
var urlFormat = "https://api.mch.weixin.qq.com/pay/unifiedorder";
var data = dataInfo.ParseXML();//获取XML
//throw new Exception(data.HtmlEncode());
MemoryStream ms = new MemoryStream();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms, timeOut: timeOut);
return new UnifiedorderResult(resultXml);
}
/// <summary>
/// Native
/// </summary>
/// <param name="appId">开放平台账户的唯一标识</param>
/// <param name="timesTamp">时间戳</param>
/// <param name="mchId">商户Id</param>
/// <param name="nonceStr">32 位内的随机串,防重发</param>
/// <param name="productId">商品唯一id</param>
/// <param name="sign">签名</param>
public static string NativePay(string appId, string timesTamp, string mchId, string nonceStr, string productId, string sign)
{
var urlFormat = "weixin://wxpay/bizpayurl?sign={0}&appid={1}&mch_id={2}&product_id={3}&time_stamp={4}&nonce_str={5}";
var url = string.Format(urlFormat, sign, appId, mchId, productId, timesTamp, nonceStr);
return url;
}
/// <summary>
/// 短链接转换接口
/// </summary>
/// <param name="dataInfo"></param>
/// <returns></returns>
public static ShortUrlResult ShortUrl(WxPayV3ShortUrlRequestData dataInfo)
{
var urlFormat = "https://api.mch.weixin.qq.com/tools/shorturl";
var data = dataInfo.ParseXML();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms);
return new ShortUrlResult(resultXml);
}
/// <summary>
/// 撤销订单接口
/// </summary>
/// <param name="dataInfo"></param>
/// <returns></returns>
public static ReverseResult Reverse(WxPayV3ReverseRequestData dataInfo)
{
var urlFormat = "https://api.mch.weixin.qq.com/secapi/pay/reverse";
var data = dataInfo.ParseXML();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms);
return new ReverseResult(resultXml);
}
/// <summary>
/// 刷卡支付
/// 提交被扫支付
/// </summary>
/// <param name="dataInfo"></param>
/// <returns></returns>
public static MicropayResult MicroPay(WxPayV3MicroPayRequestData dataInfo)
{
var urlFormat = "https://api.mch.weixin.qq.com/pay/micropay";
var data = dataInfo.ParseXML();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = POSV.Helper.HttpHelper.Post(urlFormat, data);
//var resultXml = RequestUtility.HttpPost(urlFormat , null , ms);
return new MicropayResult(resultXml);
}
/// <summary>
/// 订单查询接口
/// </summary>
/// <param name="dataInfo"></param>
/// <returns></returns>
public static OrderQueryResult OrderQuery(WxPayV3OrderQueryRequestData dataInfo)
{
var urlFormat = "https://api.mch.weixin.qq.com/pay/orderquery";
var data = dataInfo.ParseXML();//获取XML
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms);
return new OrderQueryResult(resultXml);
}
/// <summary>
/// 关闭订单接口
/// </summary>
/// <param name="dataInfo">关闭订单需要post的xml数据</param>
/// <returns></returns>
public static CloseOrderResult CloseOrder(WxPayV3CloseOrderRequestData dataInfo)
{
var urlFormat = "https://api.mch.weixin.qq.com/pay/closeorder";
var data = dataInfo.ParseXML();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms);
return new CloseOrderResult(resultXml);
}
/// <summary>
/// 退款接口
/// </summary>
/// <param name="dataInfo"></param>
/// <returns></returns>
public static OrderRefundResult OrderRefund(WxPayV3OrderRefundRequestData dataInfo, X509Certificate2 cert)
{
var urlFormat = "https://api.mch.weixin.qq.com/secapi/pay/refund";
var data = dataInfo.ParseXML();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms, null, null, null, cert);
return new OrderRefundResult(resultXml);
}
/// <summary>
/// 退款查询接口
/// </summary>
/// <param name="dataInfo"></param>
/// <returns></returns>
public static RefundQueryResult RefundQuery(WxPayV3RefundQueryRequestData dataInfo)
{
var urlFormat = "https://api.mch.weixin.qq.com/pay/refundquery";
var data = dataInfo.ParseXML();
var formDataBytes = data == null ? new byte[0] : Encoding.UTF8.GetBytes(data);
MemoryStream ms = new MemoryStream();
ms.Write(formDataBytes, 0, formDataBytes.Length);
ms.Seek(0, SeekOrigin.Begin);//设置指针读取位置
var resultXml = RequestUtility.HttpPost(urlFormat, null, ms);
return new RefundQueryResult(resultXml);
}
}
}