C#公眾號(hào)開(kāi)發(fā)之給用戶發(fā)紅包
紅包功能簡(jiǎn)單介紹:
1、商戶調(diào)用接口時(shí),通過(guò)指定發(fā)送對(duì)象以及發(fā)送金額的方式發(fā)放紅包,這樣的方式,允許商戶靈活的應(yīng)用于各種各樣豐富的活動(dòng)場(chǎng)景
2、領(lǐng)取到紅包后,用戶的資金直接進(jìn)入微信零錢,避免繁復(fù)的領(lǐng)獎(jiǎng)流程,帶給用戶微信支付原生的流暢體驗(yàn)
現(xiàn)金紅包官網(wǎng)文檔地址
調(diào)用現(xiàn)金紅包接口需要使用到證書,請(qǐng)前往商戶平臺(tái)下載證書
官網(wǎng)有關(guān)詳細(xì)證書的介紹,點(diǎn)擊查看
因?yàn)榘l(fā)送現(xiàn)金紅包是從商戶平臺(tái)余額扣款,所以商戶平臺(tái)的賬戶余額必須有充足的余額
下面是調(diào)用紅包接口詳細(xì)代碼:
1、簽名的MD5加密類:
/// <summary>
/// MD5UtilHelper 的摘要說(shuō)明。
/// </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對(duì)象
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>
/// 請(qǐng)求的參數(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è)號(hào)微信支付接口
/// </summary>
public static class TenPay
{
#region 企業(yè)向用戶發(fā)紅包
/// <summary>
/// 用于企業(yè)向微信用戶個(gè)人發(fā)紅包
/// 目前支持向指定微信用戶的openid個(gè)人發(fā)紅包
/// </summary>
/// <param name="certPassword">apiclient_cert.p12證書密碼即商戶號(hào)</param>
/// <param name="data">微信支付需要post的xml數(shù)據(jù)</param>
/// <param name="certPath">apiclient_cert.p12的證書物理位置(例如:E:\projects\文檔\微信商戶平臺(tái)證書\商戶平臺(tái)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 輸入二進(jìn)制流
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)閉文件訪問(wè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)建支付應(yīng)答對(duì)象
RequestHandler packageReqHandler = new RequestHandler(null);
//初始化
packageReqHandler.Init();
string nonceStr = TenPayV3Util.GetNoncestr(); //時(shí)間戳
//設(shè)置package訂單參數(shù)
packageReqHandler.SetParameter("nonce_str", nonceStr); //隨機(jī)字符串,不長(zhǎng)于32位
packageReqHandler.SetParameter("mch_billno", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"] + model.JournalNumber);//商戶訂單號(hào)(每個(gè)訂單號(hào)必須唯一)組成:mch_id+yyyymmdd+10位一天內(nèi)不能重復(fù)的數(shù)字。接口根據(jù)商戶訂單號(hào)支持重入,如出現(xiàn)超時(shí)可再調(diào)用。
packageReqHandler.SetParameter("mch_id", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"]); //微信支付分配的商戶號(hào)
packageReqHandler.SetParameter("wxappid", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_AppId"]);//微信分配的公眾賬號(hào)ID(企業(yè)號(hào)corpid即為此appId)。接口傳入的所有appid應(yīng)該為公眾號(hào)的appid(在mp.weixin.qq.com申請(qǐng)的),不能為APP的appid(在open.weixin.qq.com申請(qǐng)的)。
packageReqHandler.SetParameter("send_name", "測(cè)試");//商戶名稱
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", "測(cè)試紅包"); //紅包祝福語(yǔ)
packageReqHandler.SetParameter("client_ip", HttpContext.Current.Request.UserHostAddress);//Ip地址
packageReqHandler.SetParameter("act_name", "測(cè)試紅包");//活動(dòng)名稱
packageReqHandler.SetParameter("remark", "測(cè)試紅包"); //備注
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)限對(duì)該文件夾操作的權(quán)限。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:C#支付寶新版支付請(qǐng)求接口調(diào)用
欄 目:C#教程
下一篇:WPF實(shí)現(xiàn)控件拖動(dòng)的示例代碼
本文標(biāo)題:C#公眾號(hào)開(kāi)發(fā)之給用戶發(fā)紅包
本文地址:http://www.jygsgssxh.com/a1/C_jiaocheng/5118.html
您可能感興趣的文章
- 01-10C#微信公眾平臺(tái)開(kāi)發(fā)之高級(jí)群發(fā)接口
- 01-10C#微信公眾平臺(tái)開(kāi)發(fā)之a(chǎn)ccess
- 01-10C#微信開(kāi)發(fā)之微信公眾號(hào)標(biāo)簽管理功能
- 01-10C#微信公眾號(hào)與訂閱號(hào)接口開(kāi)發(fā)示例代碼
- 01-10微信公眾平臺(tái)開(kāi)發(fā)教程(三) 基礎(chǔ)框架搭建
- 01-10C# MVC 微信支付教程系列之公眾號(hào)支付代碼
- 01-10C#微信公眾號(hào)開(kāi)發(fā) 微信事件交互
- 01-10微信開(kāi)發(fā)--企業(yè)轉(zhuǎn)賬到用戶
- 01-10C#微信開(kāi)發(fā)之自定義菜單管理
- 01-10C#微信開(kāi)發(fā)之接收 / 返回文本消息


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問(wèn)題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 01-10C#通過(guò)反射獲取當(dāng)前工程中所有窗體并
- 01-10關(guān)于ASP網(wǎng)頁(yè)無(wú)法打開(kāi)的解決方案
- 01-10WinForm限制窗體不能移到屏幕外的方法
- 01-10WinForm繪制圓角的方法
- 01-10C#實(shí)現(xiàn)txt定位指定行完整實(shí)例
- 01-10WinForm實(shí)現(xiàn)仿視頻播放器左下角滾動(dòng)新
- 01-10C#停止線程的方法
- 01-10C#實(shí)現(xiàn)清空回收站的方法
- 01-10C#通過(guò)重寫Panel改變邊框顏色與寬度的
- 01-10C#實(shí)現(xiàn)讀取注冊(cè)表監(jiān)控當(dāng)前操作系統(tǒng)已
隨機(jī)閱讀
- 01-10delphi制作wav文件的方法
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開(kāi)原生自帶讀寫NTFS功能(圖文
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10SublimeText編譯C開(kāi)發(fā)環(huán)境設(shè)置


