|
|
|
|
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>
|
|
|
|
|
/// 微信支付接口,官方API:https://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);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|