忽略dll文件git
This commit is contained in:
@@ -1,91 +1,91 @@
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信扫码付款
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxH5PayCreateOrderRequest : WxJsPayDataBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号 ,5到32个字符、 只能包含字母数字或者下划线,区分大小写,每次下单请求确保在商户系统唯一
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
[XmlElement("attach")]
|
||||
public string Attach { get; set; }
|
||||
/// <summary>
|
||||
/// 商品描述
|
||||
/// </summary>
|
||||
[XmlElement("body")]
|
||||
public string Body { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总金额,以分为单位,不允许包含任何字、符号
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int TotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// H5支付
|
||||
/// </summary>
|
||||
[XmlElement("trade_type")]
|
||||
public string TradeType { get; set; } = "MWEB";
|
||||
|
||||
[XmlElement("notify_url")]
|
||||
public string NotifyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单生成的机器 IP
|
||||
/// </summary>
|
||||
[XmlElement("spbill_create_ip")]
|
||||
public string MchCreateIp { get; set; } = NetworkHelper.GetPublicIp();
|
||||
|
||||
/// <summary>
|
||||
/// 商品Id
|
||||
/// </summary>
|
||||
[XmlElement("product_id")]
|
||||
public string ProductId { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绝对过期时间 yyyyMMddHHmmss
|
||||
/// </summary>
|
||||
[XmlElement("time_expire")]
|
||||
public string TimeExpire { get; set; }
|
||||
|
||||
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public int StoreId { get; set; }
|
||||
|
||||
|
||||
public WxH5PayCreateOrderRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信扫码付款
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxH5PayCreateOrderRequest : WxJsPayDataBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号 ,5到32个字符、 只能包含字母数字或者下划线,区分大小写,每次下单请求确保在商户系统唯一
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
[XmlElement("attach")]
|
||||
public string Attach { get; set; }
|
||||
/// <summary>
|
||||
/// 商品描述
|
||||
/// </summary>
|
||||
[XmlElement("body")]
|
||||
public string Body { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总金额,以分为单位,不允许包含任何字、符号
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int TotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// H5支付
|
||||
/// </summary>
|
||||
[XmlElement("trade_type")]
|
||||
public string TradeType { get; set; } = "MWEB";
|
||||
|
||||
[XmlElement("notify_url")]
|
||||
public string NotifyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单生成的机器 IP
|
||||
/// </summary>
|
||||
[XmlElement("spbill_create_ip")]
|
||||
public string MchCreateIp { get; set; } = NetworkHelper.GetPublicIp();
|
||||
|
||||
/// <summary>
|
||||
/// 商品Id
|
||||
/// </summary>
|
||||
[XmlElement("product_id")]
|
||||
public string ProductId { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绝对过期时间 yyyyMMddHHmmss
|
||||
/// </summary>
|
||||
[XmlElement("time_expire")]
|
||||
public string TimeExpire { get; set; }
|
||||
|
||||
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public int StoreId { get; set; }
|
||||
|
||||
|
||||
public WxH5PayCreateOrderRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,88 +1,88 @@
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxJsPayCreateOrderRequest: WxJsPayDataBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号 ,5到32个字符、 只能包含字母数字或者下划线,区分大小写,每次下单请求确保在商户系统唯一
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
[XmlElement("attach")]
|
||||
public string Attach { get; set; }
|
||||
/// <summary>
|
||||
/// 商品描述
|
||||
/// </summary>
|
||||
[XmlElement("body")]
|
||||
public string Body { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总金额,以分为单位,不允许包含任何字、符号
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int TotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原生JS
|
||||
/// </summary>
|
||||
[XmlElement("trade_type")]
|
||||
public string TradeType { get; set; } = "JSAPI";//NATIVE
|
||||
|
||||
[XmlElement("notify_url")]
|
||||
public string NotifyUrl { get; set; }
|
||||
/// <summary>
|
||||
/// 微信用户关注商家公众号的openid
|
||||
/// </summary>
|
||||
[XmlElement("openid")]
|
||||
public string UserOpenId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单生成的机器 IP
|
||||
/// </summary>
|
||||
[XmlElement("spbill_create_ip")]
|
||||
public string MchCreateIp { get; set; } = NetworkHelper.GetPublicIp();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绝对过期时间 yyyyMMddHHmmss
|
||||
/// </summary>
|
||||
[XmlElement("time_expire")]
|
||||
public string TimeExpire { get; set; }
|
||||
|
||||
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public int StoreId { get; set; }
|
||||
|
||||
public WxJsPayCreateOrderRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxJsPayCreateOrderRequest: WxJsPayDataBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号 ,5到32个字符、 只能包含字母数字或者下划线,区分大小写,每次下单请求确保在商户系统唯一
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
[XmlElement("attach")]
|
||||
public string Attach { get; set; }
|
||||
/// <summary>
|
||||
/// 商品描述
|
||||
/// </summary>
|
||||
[XmlElement("body")]
|
||||
public string Body { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总金额,以分为单位,不允许包含任何字、符号
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int TotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原生JS
|
||||
/// </summary>
|
||||
[XmlElement("trade_type")]
|
||||
public string TradeType { get; set; } = "JSAPI";//NATIVE
|
||||
|
||||
[XmlElement("notify_url")]
|
||||
public string NotifyUrl { get; set; }
|
||||
/// <summary>
|
||||
/// 微信用户关注商家公众号的openid
|
||||
/// </summary>
|
||||
[XmlElement("openid")]
|
||||
public string UserOpenId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单生成的机器 IP
|
||||
/// </summary>
|
||||
[XmlElement("spbill_create_ip")]
|
||||
public string MchCreateIp { get; set; } = NetworkHelper.GetPublicIp();
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绝对过期时间 yyyyMMddHHmmss
|
||||
/// </summary>
|
||||
[XmlElement("time_expire")]
|
||||
public string TimeExpire { get; set; }
|
||||
|
||||
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public int StoreId { get; set; }
|
||||
|
||||
public WxJsPayCreateOrderRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,20 @@
|
||||
using Hncore.Pass.PaymentCenter.WxPay.WechatJsPay;
|
||||
using Newtonsoft.Json;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.Pay.WxPay
|
||||
{
|
||||
public class WxJsPayCreateOrderResponse: WxJsPayDataBase
|
||||
{
|
||||
[XmlElement("appId")]
|
||||
public string appId { get; set; }
|
||||
[XmlElement("timeStamp")]
|
||||
public string timeStamp { get; set; }
|
||||
public string nonceStr { get; set; }
|
||||
public string prepay_id { get; set; }
|
||||
public string signType { get; set; }
|
||||
public string paySign { get; set; }
|
||||
[JsonIgnore]
|
||||
public string package => $"prepay_id={this.prepay_id}";
|
||||
}
|
||||
}
|
||||
using Hncore.Pass.PaymentCenter.WxPay.WechatJsPay;
|
||||
using Newtonsoft.Json;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.Pay.WxPay
|
||||
{
|
||||
public class WxJsPayCreateOrderResponse: WxJsPayDataBase
|
||||
{
|
||||
[XmlElement("appId")]
|
||||
public string appId { get; set; }
|
||||
[XmlElement("timeStamp")]
|
||||
public string timeStamp { get; set; }
|
||||
public string nonceStr { get; set; }
|
||||
public string prepay_id { get; set; }
|
||||
public string signType { get; set; }
|
||||
public string paySign { get; set; }
|
||||
[JsonIgnore]
|
||||
public string package => $"prepay_id={this.prepay_id}";
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,166 +1,166 @@
|
||||
using Hncore.Infrastructure.Common;
|
||||
using Hncore.Infrastructure.Extension;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付,H5支付 数据签名校验
|
||||
/// </summary>
|
||||
public class WxPayChecker: SortedDictionary<string, string>
|
||||
{
|
||||
public string SignType { get; set; } = "MD5";// "HMAC-SHA256";
|
||||
public string MchKey { get; set; }
|
||||
|
||||
/**
|
||||
* 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
|
||||
* @return 时间戳
|
||||
*/
|
||||
public string GenerateTimeStamp()
|
||||
{
|
||||
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
return Convert.ToInt64(ts.TotalSeconds).ToString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成随机串,随机串包含字母或数字
|
||||
* @return 随机串
|
||||
*/
|
||||
public string GenerateNonceStr()
|
||||
{
|
||||
return Guid.NewGuid().ToString("N");
|
||||
}
|
||||
|
||||
public virtual string CreateSign()
|
||||
{
|
||||
string sign = "";
|
||||
foreach (var item in this)
|
||||
{
|
||||
if (item.Key == "sign"|| item.Key == "paySign") continue;
|
||||
sign += item.Key + "=" + item.Value + "&";
|
||||
}
|
||||
if(this.MchKey.Has())
|
||||
sign += "key=" + this.MchKey;
|
||||
LogHelper.Trace("CreateSign Str", sign);
|
||||
if (SignType == "MD5")
|
||||
{
|
||||
sign = SecurityHelper.GetMd5Hash(sign);
|
||||
}
|
||||
else if (SignType == "HMAC-SHA256")
|
||||
{
|
||||
sign = CalcHMACSHA256Hash(sign, this.MchKey);
|
||||
}
|
||||
this["sign"] = sign;
|
||||
return sign;
|
||||
}
|
||||
|
||||
public bool IsSet(string key)
|
||||
{
|
||||
if (!this.ContainsKey(key)) return false;
|
||||
return this[key].Has();
|
||||
}
|
||||
|
||||
public virtual bool CheckSign()
|
||||
{
|
||||
//如果没有设置签名,则跳过检测
|
||||
if (!this.IsSet("sign"))
|
||||
{
|
||||
LogHelper.Error("CheckSign", "签名不存在!");
|
||||
return false;
|
||||
}
|
||||
//获取接收到的签名
|
||||
string return_sign = this["sign"];
|
||||
|
||||
//在本地计算新的签名
|
||||
string cal_sign = CreateSign();
|
||||
|
||||
if (cal_sign == return_sign)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private string CalcHMACSHA256Hash(string plaintext, string salt)
|
||||
{
|
||||
string result = "";
|
||||
var enc = Encoding.Default;
|
||||
byte[]
|
||||
baText2BeHashed = enc.GetBytes(plaintext),
|
||||
baSalt = enc.GetBytes(salt);
|
||||
System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
|
||||
byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
|
||||
result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x2")).ToArray());
|
||||
return result;
|
||||
}
|
||||
|
||||
public string ToXml()
|
||||
{
|
||||
CreateSign();
|
||||
StringBuilder sb = new StringBuilder("<xml>\n");
|
||||
foreach (var item in this)
|
||||
{
|
||||
string key = item.Key;
|
||||
sb.Append("\t<").Append(key).Append("><![CDATA[").Append(item.Value).Append("]]></").Append(key)
|
||||
.Append(">\n");
|
||||
}
|
||||
|
||||
return sb.Append("</xml>").ToString();
|
||||
}
|
||||
|
||||
public WxPayChecker FromXml(string xml)
|
||||
{
|
||||
if (string.IsNullOrEmpty(xml))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
LogHelper.Info("FromXml", xml);
|
||||
|
||||
this.Clear();
|
||||
XmlDocument xmlDoc = new XmlDocument() { XmlResolver = null };
|
||||
xmlDoc.LoadXml(xml);
|
||||
XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
|
||||
XmlNodeList nodes = xmlNode.ChildNodes;
|
||||
foreach (XmlNode xn in nodes)
|
||||
{
|
||||
XmlElement xe = (XmlElement)xn;
|
||||
this[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
|
||||
}
|
||||
if (!CheckSign())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public WxPayChecker FromXmlNoCheckSign(string xml)
|
||||
{
|
||||
if (string.IsNullOrEmpty(xml))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
LogHelper.Info("FromXml", xml);
|
||||
|
||||
this.Clear();
|
||||
XmlDocument xmlDoc = new XmlDocument() { XmlResolver = null };
|
||||
xmlDoc.LoadXml(xml);
|
||||
XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
|
||||
XmlNodeList nodes = xmlNode.ChildNodes;
|
||||
foreach (XmlNode xn in nodes)
|
||||
{
|
||||
XmlElement xe = (XmlElement)xn;
|
||||
this[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
using Hncore.Infrastructure.Common;
|
||||
using Hncore.Infrastructure.Extension;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Security.Cryptography;
|
||||
using System.Text;
|
||||
using System.Xml;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付,H5支付 数据签名校验
|
||||
/// </summary>
|
||||
public class WxPayChecker: SortedDictionary<string, string>
|
||||
{
|
||||
public string SignType { get; set; } = "MD5";// "HMAC-SHA256";
|
||||
public string MchKey { get; set; }
|
||||
|
||||
/**
|
||||
* 生成时间戳,标准北京时间,时区为东八区,自1970年1月1日 0点0分0秒以来的秒数
|
||||
* @return 时间戳
|
||||
*/
|
||||
public string GenerateTimeStamp()
|
||||
{
|
||||
TimeSpan ts = DateTime.UtcNow - new DateTime(1970, 1, 1, 0, 0, 0, 0);
|
||||
return Convert.ToInt64(ts.TotalSeconds).ToString();
|
||||
}
|
||||
|
||||
/**
|
||||
* 生成随机串,随机串包含字母或数字
|
||||
* @return 随机串
|
||||
*/
|
||||
public string GenerateNonceStr()
|
||||
{
|
||||
return Guid.NewGuid().ToString("N");
|
||||
}
|
||||
|
||||
public virtual string CreateSign()
|
||||
{
|
||||
string sign = "";
|
||||
foreach (var item in this)
|
||||
{
|
||||
if (item.Key == "sign"|| item.Key == "paySign") continue;
|
||||
sign += item.Key + "=" + item.Value + "&";
|
||||
}
|
||||
if(this.MchKey.Has())
|
||||
sign += "key=" + this.MchKey;
|
||||
LogHelper.Trace("CreateSign Str", sign);
|
||||
if (SignType == "MD5")
|
||||
{
|
||||
sign = SecurityHelper.GetMd5Hash(sign);
|
||||
}
|
||||
else if (SignType == "HMAC-SHA256")
|
||||
{
|
||||
sign = CalcHMACSHA256Hash(sign, this.MchKey);
|
||||
}
|
||||
this["sign"] = sign;
|
||||
return sign;
|
||||
}
|
||||
|
||||
public bool IsSet(string key)
|
||||
{
|
||||
if (!this.ContainsKey(key)) return false;
|
||||
return this[key].Has();
|
||||
}
|
||||
|
||||
public virtual bool CheckSign()
|
||||
{
|
||||
//如果没有设置签名,则跳过检测
|
||||
if (!this.IsSet("sign"))
|
||||
{
|
||||
LogHelper.Error("CheckSign", "签名不存在!");
|
||||
return false;
|
||||
}
|
||||
//获取接收到的签名
|
||||
string return_sign = this["sign"];
|
||||
|
||||
//在本地计算新的签名
|
||||
string cal_sign = CreateSign();
|
||||
|
||||
if (cal_sign == return_sign)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
private string CalcHMACSHA256Hash(string plaintext, string salt)
|
||||
{
|
||||
string result = "";
|
||||
var enc = Encoding.Default;
|
||||
byte[]
|
||||
baText2BeHashed = enc.GetBytes(plaintext),
|
||||
baSalt = enc.GetBytes(salt);
|
||||
System.Security.Cryptography.HMACSHA256 hasher = new HMACSHA256(baSalt);
|
||||
byte[] baHashedText = hasher.ComputeHash(baText2BeHashed);
|
||||
result = string.Join("", baHashedText.ToList().Select(b => b.ToString("x2")).ToArray());
|
||||
return result;
|
||||
}
|
||||
|
||||
public string ToXml()
|
||||
{
|
||||
CreateSign();
|
||||
StringBuilder sb = new StringBuilder("<xml>\n");
|
||||
foreach (var item in this)
|
||||
{
|
||||
string key = item.Key;
|
||||
sb.Append("\t<").Append(key).Append("><![CDATA[").Append(item.Value).Append("]]></").Append(key)
|
||||
.Append(">\n");
|
||||
}
|
||||
|
||||
return sb.Append("</xml>").ToString();
|
||||
}
|
||||
|
||||
public WxPayChecker FromXml(string xml)
|
||||
{
|
||||
if (string.IsNullOrEmpty(xml))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
LogHelper.Info("FromXml", xml);
|
||||
|
||||
this.Clear();
|
||||
XmlDocument xmlDoc = new XmlDocument() { XmlResolver = null };
|
||||
xmlDoc.LoadXml(xml);
|
||||
XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
|
||||
XmlNodeList nodes = xmlNode.ChildNodes;
|
||||
foreach (XmlNode xn in nodes)
|
||||
{
|
||||
XmlElement xe = (XmlElement)xn;
|
||||
this[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
|
||||
}
|
||||
if (!CheckSign())
|
||||
{
|
||||
return null;
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
public WxPayChecker FromXmlNoCheckSign(string xml)
|
||||
{
|
||||
if (string.IsNullOrEmpty(xml))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
LogHelper.Info("FromXml", xml);
|
||||
|
||||
this.Clear();
|
||||
XmlDocument xmlDoc = new XmlDocument() { XmlResolver = null };
|
||||
xmlDoc.LoadXml(xml);
|
||||
XmlNode xmlNode = xmlDoc.FirstChild;//获取到根节点<xml>
|
||||
XmlNodeList nodes = xmlNode.ChildNodes;
|
||||
foreach (XmlNode xn in nodes)
|
||||
{
|
||||
XmlElement xe = (XmlElement)xn;
|
||||
this[xe.Name] = xe.InnerText;//获取xml的键值对到WxPayData内部的数据中
|
||||
}
|
||||
return this;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,51 +1,51 @@
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付 数据签名校验
|
||||
/// </summary>
|
||||
public class WxJsPayDataBase
|
||||
{
|
||||
public string GenerateNonceStr()
|
||||
{
|
||||
return Guid.NewGuid().ToString("N");
|
||||
}
|
||||
public WxPayChecker ToPayData()
|
||||
{
|
||||
var type = GetType();
|
||||
var properties = type.GetProperties();
|
||||
|
||||
var data = new WxPayChecker();
|
||||
foreach (var property in properties)
|
||||
{
|
||||
var xmlAttr = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
|
||||
|
||||
if (!xmlAttr.Any())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
string name = ((XmlElementAttribute)xmlAttr[0]).ElementName;
|
||||
|
||||
object valueObj = property.GetValue(this, null);
|
||||
|
||||
if (valueObj == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
string value = valueObj.ToString();
|
||||
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
data[name] = value;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
using System;
|
||||
using System.Linq;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付 数据签名校验
|
||||
/// </summary>
|
||||
public class WxJsPayDataBase
|
||||
{
|
||||
public string GenerateNonceStr()
|
||||
{
|
||||
return Guid.NewGuid().ToString("N");
|
||||
}
|
||||
public WxPayChecker ToPayData()
|
||||
{
|
||||
var type = GetType();
|
||||
var properties = type.GetProperties();
|
||||
|
||||
var data = new WxPayChecker();
|
||||
foreach (var property in properties)
|
||||
{
|
||||
var xmlAttr = property.GetCustomAttributes(typeof(XmlElementAttribute), false);
|
||||
|
||||
if (!xmlAttr.Any())
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
string name = ((XmlElementAttribute)xmlAttr[0]).ElementName;
|
||||
|
||||
object valueObj = property.GetValue(this, null);
|
||||
|
||||
if (valueObj == null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
string value = valueObj.ToString();
|
||||
|
||||
if (!string.IsNullOrEmpty(value))
|
||||
{
|
||||
data[name] = value;
|
||||
}
|
||||
}
|
||||
return data;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,50 +1,50 @@
|
||||
using Hncore.Infrastructure.Extension;
|
||||
using System;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付 数据签名校验
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxJsPayInfo: WxJsPayDataBase
|
||||
{
|
||||
public WxJsPayInfo(string appId,string signType,string package,string key)
|
||||
{
|
||||
this.appId = appId;
|
||||
this.signType = signType;
|
||||
this.package = package;
|
||||
this.nonceStr = this.GenerateNonceStr();
|
||||
this.timeStamp = DateTime.Now.GetUnixTimeStamp().ToString();
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
[XmlElement("appId")]
|
||||
public string appId { get; set; }
|
||||
|
||||
[XmlElement("timeStamp")]
|
||||
public string timeStamp { get; set; }
|
||||
|
||||
[XmlElement("nonceStr")]
|
||||
public string nonceStr { get; set; }
|
||||
|
||||
[XmlElement("signType")]
|
||||
public string signType { get; set; }
|
||||
|
||||
[XmlElement("package")]
|
||||
public string package { get; set; }
|
||||
|
||||
private string key;
|
||||
public string paySign => getSign();
|
||||
|
||||
private string getSign()
|
||||
{
|
||||
var data = this.ToPayData();
|
||||
data.SignType = this.signType;
|
||||
data.MchKey = this.key;
|
||||
return data.CreateSign();
|
||||
}
|
||||
}
|
||||
using Hncore.Infrastructure.Extension;
|
||||
using System;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付 数据签名校验
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxJsPayInfo: WxJsPayDataBase
|
||||
{
|
||||
public WxJsPayInfo(string appId,string signType,string package,string key)
|
||||
{
|
||||
this.appId = appId;
|
||||
this.signType = signType;
|
||||
this.package = package;
|
||||
this.nonceStr = this.GenerateNonceStr();
|
||||
this.timeStamp = DateTime.Now.GetUnixTimeStamp().ToString();
|
||||
this.key = key;
|
||||
}
|
||||
|
||||
[XmlElement("appId")]
|
||||
public string appId { get; set; }
|
||||
|
||||
[XmlElement("timeStamp")]
|
||||
public string timeStamp { get; set; }
|
||||
|
||||
[XmlElement("nonceStr")]
|
||||
public string nonceStr { get; set; }
|
||||
|
||||
[XmlElement("signType")]
|
||||
public string signType { get; set; }
|
||||
|
||||
[XmlElement("package")]
|
||||
public string package { get; set; }
|
||||
|
||||
private string key;
|
||||
public string paySign => getSign();
|
||||
|
||||
private string getSign()
|
||||
{
|
||||
var data = this.ToPayData();
|
||||
data.SignType = this.signType;
|
||||
data.MchKey = this.key;
|
||||
return data.CreateSign();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,39 +1,39 @@
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxJsPayOrderQueryRequest : WxJsPayDataBase
|
||||
{
|
||||
[XmlElement("transaction_id")]
|
||||
public string TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
public WxJsPayOrderQueryRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信小程序、公众号支付
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxJsPayOrderQueryRequest : WxJsPayDataBase
|
||||
{
|
||||
[XmlElement("transaction_id")]
|
||||
public string TransactionId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
public WxJsPayOrderQueryRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,161 +1,161 @@
|
||||
using Hncore.Infrastructure.Common;
|
||||
using Hncore.Infrastructure.Serializer;
|
||||
using Hncore.Pass.PaymentCenter.Model;
|
||||
using Hncore.Pass.PaymentCenter.WxPay.WechatJsPay;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.Pay.WxPay
|
||||
{
|
||||
public class WxPayClient
|
||||
{
|
||||
public static readonly string url = "https://api.mch.weixin.qq.com";
|
||||
IHttpClientFactory m_HttpClientFactory;
|
||||
public WxPayClient(IHttpClientFactory _HttpClientFactory)
|
||||
{
|
||||
m_HttpClientFactory = _HttpClientFactory;
|
||||
}
|
||||
|
||||
public async Task<string> CreatePayOrderAsync(WxJsPayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("ScanPayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!payData.IsSet("prepay_id"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var appId = payData["appid"];
|
||||
var package = $"prepay_id={payData["prepay_id"]}";
|
||||
var resp = new WxJsPayInfo(appId, payData.SignType, package, mchInfo.Key);
|
||||
return resp.ToJson();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task<string> JsPayCreateOrderAsync(WxJsPayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("ScanPayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!payData.IsSet("prepay_id"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var appId = payData["appid"];
|
||||
var package = $"prepay_id={payData["prepay_id"]}";
|
||||
var resp = new WxJsPayInfo(appId, payData.SignType, package, mchInfo.Key);
|
||||
return resp.ToJson();
|
||||
}
|
||||
|
||||
public async Task<string> ScanPayCreateOrderAsync(WxScanPayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
LogHelper.Info("ScanPayCreateOrderAsync body", body);
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("ScanPayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
if (!payData.IsSet("code_url"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var code_url = payData["code_url"];
|
||||
return code_url;
|
||||
}
|
||||
|
||||
public async Task<string> H5PayCreateOrderAsync(WxH5PayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("H5PayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
if (!payData.IsSet("mweb_url"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var code_url = payData["mweb_url"];
|
||||
return code_url;
|
||||
}
|
||||
|
||||
|
||||
public async Task<bool> OrderQuery(WxJsPayOrderQueryRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
request.MchId = mchInfo.MchId;
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/orderquery", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
|
||||
if (payData["return_code"].ToString() == "SUCCESS" &&
|
||||
payData["result_code"].ToString() == "SUCCESS")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
using Hncore.Infrastructure.Common;
|
||||
using Hncore.Infrastructure.Serializer;
|
||||
using Hncore.Pass.PaymentCenter.Model;
|
||||
using Hncore.Pass.PaymentCenter.WxPay.WechatJsPay;
|
||||
using System;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.Pay.WxPay
|
||||
{
|
||||
public class WxPayClient
|
||||
{
|
||||
public static readonly string url = "https://api.mch.weixin.qq.com";
|
||||
IHttpClientFactory m_HttpClientFactory;
|
||||
public WxPayClient(IHttpClientFactory _HttpClientFactory)
|
||||
{
|
||||
m_HttpClientFactory = _HttpClientFactory;
|
||||
}
|
||||
|
||||
public async Task<string> CreatePayOrderAsync(WxJsPayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("ScanPayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!payData.IsSet("prepay_id"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var appId = payData["appid"];
|
||||
var package = $"prepay_id={payData["prepay_id"]}";
|
||||
var resp = new WxJsPayInfo(appId, payData.SignType, package, mchInfo.Key);
|
||||
return resp.ToJson();
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
public async Task<string> JsPayCreateOrderAsync(WxJsPayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("ScanPayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
|
||||
|
||||
|
||||
if (!payData.IsSet("prepay_id"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var appId = payData["appid"];
|
||||
var package = $"prepay_id={payData["prepay_id"]}";
|
||||
var resp = new WxJsPayInfo(appId, payData.SignType, package, mchInfo.Key);
|
||||
return resp.ToJson();
|
||||
}
|
||||
|
||||
public async Task<string> ScanPayCreateOrderAsync(WxScanPayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
LogHelper.Info("ScanPayCreateOrderAsync body", body);
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("ScanPayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
if (!payData.IsSet("code_url"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var code_url = payData["code_url"];
|
||||
return code_url;
|
||||
}
|
||||
|
||||
public async Task<string> H5PayCreateOrderAsync(WxH5PayCreateOrderRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/unifiedorder", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
if (payData.IsSet("err_code_des"))
|
||||
{
|
||||
LogHelper.Error("H5PayCreateOrderAsync Error", payData["err_code_des"]);
|
||||
return "";
|
||||
}
|
||||
if (!payData.IsSet("mweb_url"))
|
||||
{
|
||||
return "";
|
||||
}
|
||||
var code_url = payData["mweb_url"];
|
||||
return code_url;
|
||||
}
|
||||
|
||||
|
||||
public async Task<bool> OrderQuery(WxJsPayOrderQueryRequest request, MchInfo mchInfo)
|
||||
{
|
||||
var httpClient = m_HttpClientFactory.CreateClient();
|
||||
request.MchId = mchInfo.MchId;
|
||||
var payData = request.ToPayData();
|
||||
payData.MchKey = mchInfo.Key;
|
||||
var body = payData.ToXml();
|
||||
httpClient.Timeout = TimeSpan.FromMinutes(5);
|
||||
var response = await httpClient
|
||||
.PostAsync($"{url}/pay/orderquery", new StringContent(body));
|
||||
|
||||
var resText = await response.Content.ReadAsStringAsync();
|
||||
payData.FromXml(resText);
|
||||
|
||||
if (payData["return_code"].ToString() == "SUCCESS" &&
|
||||
payData["result_code"].ToString() == "SUCCESS")
|
||||
{
|
||||
return true;
|
||||
}
|
||||
else
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,91 +1,91 @@
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信扫码付款
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxScanPayCreateOrderRequest : WxJsPayDataBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号 ,5到32个字符、 只能包含字母数字或者下划线,区分大小写,每次下单请求确保在商户系统唯一
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
[XmlElement("attach")]
|
||||
public string Attach { get; set; }
|
||||
/// <summary>
|
||||
/// 商品描述
|
||||
/// </summary>
|
||||
[XmlElement("body")]
|
||||
public string Body { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总金额,以分为单位,不允许包含任何字、符号
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int TotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原生JS
|
||||
/// </summary>
|
||||
[XmlElement("trade_type")]
|
||||
public string TradeType { get; set; } = "NATIVE";
|
||||
|
||||
[XmlElement("notify_url")]
|
||||
public string NotifyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单生成的机器 IP
|
||||
/// </summary>
|
||||
[XmlElement("spbill_create_ip")]
|
||||
public string MchCreateIp { get; set; } = NetworkHelper.GetPublicIp();
|
||||
|
||||
/// <summary>
|
||||
/// 商品Id
|
||||
/// </summary>
|
||||
[XmlElement("product_id")]
|
||||
public string ProductId { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绝对过期时间 yyyyMMddHHmmss
|
||||
/// </summary>
|
||||
[XmlElement("time_expire")]
|
||||
public string TimeExpire { get; set; }
|
||||
|
||||
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public int StoreId { get; set; }
|
||||
|
||||
|
||||
public WxScanPayCreateOrderRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
using Hncore.Infrastructure.Common;
|
||||
using System.Xml;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.WxPay.WechatJsPay
|
||||
{
|
||||
/// <summary>
|
||||
/// 微信扫码付款
|
||||
/// </summary>
|
||||
[XmlRoot("xml", Namespace = "")]
|
||||
public class WxScanPayCreateOrderRequest : WxJsPayDataBase
|
||||
{
|
||||
/// <summary>
|
||||
/// 商户系统内部的订单号 ,5到32个字符、 只能包含字母数字或者下划线,区分大小写,每次下单请求确保在商户系统唯一
|
||||
/// </summary>
|
||||
[XmlElement("out_trade_no")]
|
||||
public string OutTradeNo { get; set; }
|
||||
|
||||
[XmlElement("attach")]
|
||||
public string Attach { get; set; }
|
||||
/// <summary>
|
||||
/// 商品描述
|
||||
/// </summary>
|
||||
[XmlElement("body")]
|
||||
public string Body { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 总金额,以分为单位,不允许包含任何字、符号
|
||||
/// </summary>
|
||||
[XmlElement("total_fee")]
|
||||
public int TotalFee { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 原生JS
|
||||
/// </summary>
|
||||
[XmlElement("trade_type")]
|
||||
public string TradeType { get; set; } = "NATIVE";
|
||||
|
||||
[XmlElement("notify_url")]
|
||||
public string NotifyUrl { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("appid")]
|
||||
public string AppId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 公众账号或小程序ID
|
||||
/// </summary>
|
||||
[XmlElement("mch_id")]
|
||||
public string MchId { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 订单生成的机器 IP
|
||||
/// </summary>
|
||||
[XmlElement("spbill_create_ip")]
|
||||
public string MchCreateIp { get; set; } = NetworkHelper.GetPublicIp();
|
||||
|
||||
/// <summary>
|
||||
/// 商品Id
|
||||
/// </summary>
|
||||
[XmlElement("product_id")]
|
||||
public string ProductId { get; set; }
|
||||
|
||||
|
||||
|
||||
/// <summary>
|
||||
/// 随机字符串
|
||||
/// </summary>
|
||||
[XmlElement("nonce_str")]
|
||||
public string NonceStr { get; set; }
|
||||
|
||||
/// <summary>
|
||||
/// 绝对过期时间 yyyyMMddHHmmss
|
||||
/// </summary>
|
||||
[XmlElement("time_expire")]
|
||||
public string TimeExpire { get; set; }
|
||||
|
||||
|
||||
public int TenantId { get; set; }
|
||||
|
||||
public int StoreId { get; set; }
|
||||
|
||||
|
||||
public WxScanPayCreateOrderRequest()
|
||||
{
|
||||
this.NonceStr =this.GenerateNonceStr();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +1,20 @@
|
||||
using Hncore.Pass.PaymentCenter.WxPay.WechatJsPay;
|
||||
using Newtonsoft.Json;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.Pay.WxPay
|
||||
{
|
||||
public class WxScanPayCreateOrderResponse : WxJsPayDataBase
|
||||
{
|
||||
[XmlElement("appId")]
|
||||
public string appId { get; set; }
|
||||
[XmlElement("timeStamp")]
|
||||
public string timeStamp { get; set; }
|
||||
public string nonceStr { get; set; }
|
||||
public string prepay_id { get; set; }
|
||||
public string signType { get; set; }
|
||||
public string paySign { get; set; }
|
||||
[JsonIgnore]
|
||||
public string package => $"prepay_id={this.prepay_id}";
|
||||
}
|
||||
}
|
||||
using Hncore.Pass.PaymentCenter.WxPay.WechatJsPay;
|
||||
using Newtonsoft.Json;
|
||||
using System.Xml.Serialization;
|
||||
|
||||
namespace Hncore.Pass.PaymentCenter.Pay.WxPay
|
||||
{
|
||||
public class WxScanPayCreateOrderResponse : WxJsPayDataBase
|
||||
{
|
||||
[XmlElement("appId")]
|
||||
public string appId { get; set; }
|
||||
[XmlElement("timeStamp")]
|
||||
public string timeStamp { get; set; }
|
||||
public string nonceStr { get; set; }
|
||||
public string prepay_id { get; set; }
|
||||
public string signType { get; set; }
|
||||
public string paySign { get; set; }
|
||||
[JsonIgnore]
|
||||
public string package => $"prepay_id={this.prepay_id}";
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user