欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C#公眾號開發(fā)之給用戶發(fā)紅包

 更新時間:2020年09月13日 08:41:55   作者:小碼農(nóng)i  
這篇文章主要為大家詳細介紹了C#公眾號開發(fā)之給用戶發(fā)紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

紅包功能簡單介紹:

1、商戶調(diào)用接口時,通過指定發(fā)送對象以及發(fā)送金額的方式發(fā)放紅包,這樣的方式,允許商戶靈活的應用于各種各樣豐富的活動場景

2、領(lǐng)取到紅包后,用戶的資金直接進入微信零錢,避免繁復的領(lǐng)獎流程,帶給用戶微信支付原生的流暢體驗

現(xiàn)金紅包官網(wǎng)文檔地址

調(diào)用現(xiàn)金紅包接口需要使用到證書,請前往商戶平臺下載證書

官網(wǎng)有關(guān)詳細證書的介紹,點擊查看

因為發(fā)送現(xiàn)金紅包是從商戶平臺余額扣款,所以商戶平臺的賬戶余額必須有充足的余額

下面是調(diào)用紅包接口詳細代碼:

1、簽名的MD5加密類:

/// <summary>
/// MD5UtilHelper 的摘要說明。
/// </summary>
public class MD5UtilHelper
{
 public MD5UtilHelper()
 {
  //
  // TODO: 在此處添加構(gòu)造函數(shù)邏輯
  //
 }

 /// <summary>
   /// 獲取大寫的MD5簽名結(jié)果
 /// </summary>
 /// <param name="encypStr"></param>
 /// <param name="charset"></param>
 /// <returns></returns>
 public static string GetMD5(string encypStr, string charset)
 {
  string retStr;
  MD5CryptoServiceProvider m5 = new MD5CryptoServiceProvider();

  //創(chuàng)建md5對象
  byte[] inputBye;
  byte[] outputBye;

  //使用GB2312編碼方式把字符串轉(zhuǎn)化為字節(jié)數(shù)組.
  try
  {
   inputBye = Encoding.GetEncoding(charset).GetBytes(encypStr);
  }
  catch (Exception ex)
  {
   inputBye = Encoding.GetEncoding("GB2312").GetBytes(encypStr);
  }
  outputBye = m5.ComputeHash(inputBye);

  retStr = System.BitConverter.ToString(outputBye);
  retStr = retStr.Replace("-", "").ToUpper();
  return retStr;
 }
}

2、處理參數(shù)的類:

public class RequestHandler
 {

  public RequestHandler(HttpContext httpContext)
  {
   Parameters = new Hashtable();

   this.HttpContext = httpContext ?? HttpContext.Current;

  }
  /// <summary>
  /// 密鑰
  /// </summary>
  private string Key;

  protected HttpContext HttpContext;

  /// <summary>
  /// 請求的參數(shù)
  /// </summary>
  protected Hashtable Parameters;

  /// <summary>
  /// debug信息
  /// </summary>
  private string DebugInfo;

  /// <summary>
  /// 初始化函數(shù)
  /// </summary>
  public virtual void Init()
  {
  }
  /// <summary>
  /// 獲取debug信息
  /// </summary>
  /// <returns></returns>
  public String GetDebugInfo()
  {
   return DebugInfo;
  }
  /// <summary>
  /// 獲取密鑰
  /// </summary>
  /// <returns></returns>
  public string GetKey()
  {
   return Key;
  }
  /// <summary>
  /// 設(shè)置密鑰
  /// </summary>
  /// <param name="key"></param>
  public void SetKey(string key)
  {
   this.Key = key;
  }

  /// <summary>
  /// 設(shè)置參數(shù)值
  /// </summary>
  /// <param name="parameter"></param>
  /// <param name="parameterValue"></param>
  public void SetParameter(string parameter, string parameterValue)
  {
   if (parameter != null && parameter != "")
   {
    if (Parameters.Contains(parameter))
    {
     Parameters.Remove(parameter);
    }

    Parameters.Add(parameter, parameterValue);
   }
  }


  /// <summary>
  /// 創(chuàng)建md5摘要,規(guī)則是:按參數(shù)名稱a-z排序,遇到空值的參數(shù)不參加簽名
  /// </summary>
  /// <param name="key">參數(shù)名</param>
  /// <param name="value">參數(shù)值</param>
  /// key和value通常用于填充最后一組參數(shù)
  /// <returns></returns>
  public virtual string CreateMd5Sign(string key, string value)
  {
   StringBuilder sb = new StringBuilder();

   ArrayList akeys = new ArrayList(Parameters.Keys);
   akeys.Sort();

   foreach (string k in akeys)
   {
    string v = (string)Parameters[k];
    if (null != v && "".CompareTo(v) != 0
     && "sign".CompareTo(k) != 0 && "key".CompareTo(k) != 0)
    {
     sb.Append(k + "=" + v + "&");
    }
   }

   sb.Append(key + "=" + value);
   string sign = MD5UtilHelper.GetMD5(sb.ToString(), GetCharset()).ToUpper();

   return sign;
  }

  /// <summary>
  /// 輸出XML
  /// </summary>
  /// <returns></returns>
  public string ParseXML()
  {
   StringBuilder sb = new StringBuilder();
   sb.Append("<xml>");
   foreach (string k in Parameters.Keys)
   {
    string v = (string)Parameters[k];
    if (Regex.IsMatch(v, @"^[0-9.]$"))
    {

     sb.Append("<" + k + ">" + v + "</" + k + ">");
    }
    else
    {
     sb.Append("<" + k + "><![CDATA[" + v + "]]></" + k + ">");
    }

   }
   sb.Append("</xml>");
   return sb.ToString();
  }


  /// <summary>
  /// 設(shè)置debug信息
  /// </summary>
  /// <param name="debugInfo"></param>
  public void SetDebugInfo(String debugInfo)
  {
   this.DebugInfo = debugInfo;
  }

  public Hashtable GetAllParameters()
  {
   return this.Parameters;
  }

  protected virtual string GetCharset()
  {
   return this.HttpContext.Request.ContentEncoding.BodyName;
  }
 }

3、調(diào)用現(xiàn)金紅包處理類:

 /// <summary>
 /// 企業(yè)號微信支付接口
 /// </summary>
 public static class TenPay
 {

  #region 企業(yè)向用戶發(fā)紅包
  /// <summary>
  /// 用于企業(yè)向微信用戶個人發(fā)紅包
  /// 目前支持向指定微信用戶的openid個人發(fā)紅包
  /// </summary>
  /// <param name="certPassword">apiclient_cert.p12證書密碼即商戶號</param>
  /// <param name="data">微信支付需要post的xml數(shù)據(jù)</param>
  /// <param name="certPath">apiclient_cert.p12的證書物理位置(例如:E:\projects\文檔\微信商戶平臺證書\商戶平臺API證書</param>
  /// <param name="timeOut"></param>
  /// <returns></returns>
  public static string Sendredpack(string data, string certPassword,string certPath, int timeOut = Config.TIME_OUT)
  {
   var urlFormat = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
   string cert = certPath;

   ServicePointManager.ServerCertificateValidationCallback = new RemoteCertificateValidationCallback(CheckValidationResult);
   X509Certificate2 cer = new X509Certificate2(cert, certPassword, X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.MachineKeySet);

   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);//設(shè)置指針讀取位置

   HttpWebRequest request = (HttpWebRequest)WebRequest.Create(urlFormat);
   request.ClientCertificates.Add(cer);
   request.Method = "POST";
   request.Timeout = timeOut;

   request.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/31.0.1650.57 Safari/537.36";

   #region 輸入二進制流
   if (ms != null)
   {
    ms.Position = 0;
    //直接寫入流
    Stream requestStream = request.GetRequestStream();
    byte[] buffer = new byte[1024];
    int bytesRead = 0;
    while ((bytesRead = ms.Read(buffer, 0, buffer.Length)) != 0)
    {
     requestStream.Write(buffer, 0, bytesRead);
    }
    ms.Close();//關(guān)閉文件訪問
   }
   #endregion

   HttpWebResponse response = (HttpWebResponse)request.GetResponse();

   using (Stream responseStream = response.GetResponseStream())
   {
    using (StreamReader myStreamReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8")))
    {
     string retString = myStreamReader.ReadToEnd();
     return retString;
    }
   }
  }
  private static bool CheckValidationResult(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors errors)
  {
   if (errors == SslPolicyErrors.None)
    return true;
   return false;
  }
  #endregion

 }

4、調(diào)用現(xiàn)金紅包接口

#region 發(fā)送紅包
bool fals = false; //記錄發(fā)送紅包是否成功
string xmlResult = null; //現(xiàn)金紅包接口返回的xml
string certPath = null; //證書在服務(wù)器的物理位置
string data = null; //調(diào)用現(xiàn)金紅包接口需要的數(shù)據(jù)
try
{
 //創(chuàng)建支付應答對象
 RequestHandler packageReqHandler = new RequestHandler(null);
 //初始化
 packageReqHandler.Init();
 string nonceStr = TenPayV3Util.GetNoncestr(); //時間戳
 //設(shè)置package訂單參數(shù)
 packageReqHandler.SetParameter("nonce_str", nonceStr); //隨機字符串,不長于32位
 packageReqHandler.SetParameter("mch_billno", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"] + model.JournalNumber);//商戶訂單號(每個訂單號必須唯一)組成:mch_id+yyyymmdd+10位一天內(nèi)不能重復的數(shù)字。接口根據(jù)商戶訂單號支持重入,如出現(xiàn)超時可再調(diào)用。
 packageReqHandler.SetParameter("mch_id", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"]); //微信支付分配的商戶號
 packageReqHandler.SetParameter("wxappid", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_AppId"]);//微信分配的公眾賬號ID(企業(yè)號corpid即為此appId)。接口傳入的所有appid應該為公眾號的appid(在mp.weixin.qq.com申請的),不能為APP的appid(在open.weixin.qq.com申請的)。 
 packageReqHandler.SetParameter("send_name", "測試");//商戶名稱
 packageReqHandler.SetParameter("re_openid", model.BankCard); //用戶openid 接受紅包的用戶用戶在wxappid下的openid
 packageReqHandler.SetParameter("total_amount", Convert.ToInt32((decimal)(model.Amount * 100M)).ToString(CultureInfo.InvariantCulture)); //付款金額 單位分
 packageReqHandler.SetParameter("total_num", "1"); //紅包發(fā)放總?cè)藬?shù)
 packageReqHandler.SetParameter("wishing", "測試紅包"); //紅包祝福語
 packageReqHandler.SetParameter("client_ip", HttpContext.Current.Request.UserHostAddress);//Ip地址
 packageReqHandler.SetParameter("act_name", "測試紅包");//活動名稱
 packageReqHandler.SetParameter("remark", "測試紅包");  //備注
 string sign = packageReqHandler.CreateMd5Sign("key", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_Key"]);
 packageReqHandler.SetParameter("sign", sign);      //簽名
 data = packageReqHandler.ParseXML();
 certPath = Server.MapPath("~/") + System.Configuration.ConfigurationManager.AppSettings["certPath"];
 xmlResult = Sendredpack(data, System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"],certPath);
 var res = XDocument.Parse(xmlResult);
 string return_code = res.Element("xml").Element("return_code").Value;
 if ("SUCCESS".Equals(return_code))
 {
  string result_code = res.Element("xml").Element("result_code").Value;
  if ("SUCCESS".Equals(result_code))
  {
   fals = true;
  }
 }
}
catch (Exception exception)
{
}
#endregion

注意:證書所在文件夾權(quán)限,IIS必須有權(quán)限對該文件夾操作的權(quán)限。

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C#實現(xiàn)學生模塊的增刪改查

    C#實現(xiàn)學生模塊的增刪改查

    這篇文章主要為大家詳細介紹了C#實現(xiàn)學生模塊的增刪改查,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • C#操作INI文件的方法詳解

    C#操作INI文件的方法詳解

    INI文件全稱是Initialization File的縮寫,即初始化文件,是windows系統(tǒng)的系統(tǒng)配置文件所采用的存儲格式,統(tǒng)管windows的各項配置。本文介紹了C#操作INI文件的方法,需要的可以參考一下
    2022-10-10
  • 淺談C#手機號換成111XXXX1111 這種顯示的解決思路

    淺談C#手機號換成111XXXX1111 這種顯示的解決思路

    下面小編就為大家?guī)硪黄獪\談C#手機號換成111XXXX1111 這種顯示的解決思路。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-11-11
  • c# WPF中CheckBox樣式的使用總結(jié)

    c# WPF中CheckBox樣式的使用總結(jié)

    這篇文章主要介紹了c# WPF中CheckBox樣式的使用總結(jié),幫助大家更好的理解和學習使用c#,感興趣的朋友可以了解下
    2021-03-03
  • C# TSC打印二維碼和條形碼的實現(xiàn)方法

    C# TSC打印二維碼和條形碼的實現(xiàn)方法

    下面小編就為大家分享一篇C# TSC打印二維碼和條形碼的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-01-01
  • 基于WPF實現(xiàn)蒙板控件的示例代碼

    基于WPF實現(xiàn)蒙板控件的示例代碼

    這篇文章主要為大家詳細介紹了WPF實現(xiàn)蒙板控件,文中的示例代碼講解詳細,對我們學習或工作有一定幫助,感興趣的小伙伴可以了解一下
    2023-03-03
  • LZW壓縮算法 C#源碼

    LZW壓縮算法 C#源碼

    本文分享了一個LZW壓縮算法的C#源碼,有需要的朋友可以參考一下。
    2016-06-06
  • C#操作Byte數(shù)組和十六進制進行互轉(zhuǎn)

    C#操作Byte數(shù)組和十六進制進行互轉(zhuǎn)

    這篇文章介紹了C#操作Byte數(shù)組和十六進制進行互轉(zhuǎn)的的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-05-05
  • C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中

    C#.NET中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中

    這篇文章主要給大家介紹C#.net中如何批量插入大量數(shù)據(jù)到數(shù)據(jù)庫中,本文涉及到C#.net中批量插入數(shù)據(jù)到數(shù)據(jù)庫中方面的內(nèi)容,對C#.net批量插入數(shù)據(jù)到數(shù)據(jù)庫中感興趣的朋友可以參考下本篇文章
    2015-10-10
  • C#中的協(xié)變與逆變小結(jié)

    C#中的協(xié)變與逆變小結(jié)

    這篇文章主要介紹了C#中的協(xié)變與逆變的相關(guān)知識,在泛型或委托中,如果不使用協(xié)變或逆變,那么泛型類型是一個固定類型,而使用協(xié)變或逆變的話,則泛型類型可以實現(xiàn)多態(tài)化,需要的朋友可以參考下
    2021-10-10

最新評論