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#

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.

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);
}
}
}