服务器之家:专注于服务器技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C# - C#公众号开发之给用户发红包

C#公众号开发之给用户发红包

2022-02-27 15:48小码农i C#

这篇文章主要为大家详细介绍了C#公众号开发之给用户发红包,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

红包功能简单介绍:

1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景

2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验

现金红包官网文档地址

调用现金红包接口需要使用到证书,请前往商户平台下载证书

官网有关详细证书的介绍,点击查看

因为发送现金红包是从商户平台余额扣款,所以商户平台的账户余额必须有充足的余额

下面是调用红包接口详细代码:

1、签名的MD5加密类:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/// <summary>
/// MD5UtilHelper 的摘要说明。
/// </summary>
public class MD5UtilHelper
{
 public MD5UtilHelper()
 {
  //
  // TODO: 在此处添加构造函数逻辑
  //
 }
 
 /// <summary>
   /// 获取大写的MD5签名结果
 /// </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();
 
  //创建md5对象
  byte[] inputBye;
  byte[] outputBye;
 
  //使用GB2312编码方式把字符串转化为字节数组.
  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、处理参数的类:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
public class RequestHandler
 {
 
  public RequestHandler(HttpContext httpContext)
  {
   Parameters = new Hashtable();
 
   this.HttpContext = httpContext ?? HttpContext.Current;
 
  }
  /// <summary>
  /// 密钥
  /// </summary>
  private string Key;
 
  protected HttpContext HttpContext;
 
  /// <summary>
  /// 请求的参数
  /// </summary>
  protected Hashtable Parameters;
 
  /// <summary>
  /// debug信息
  /// </summary>
  private string DebugInfo;
 
  /// <summary>
  /// 初始化函数
  /// </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>
  /// 设置密钥
  /// </summary>
  /// <param name="key"></param>
  public void SetKey(string key)
  {
   this.Key = key;
  }
 
  /// <summary>
  /// 设置参数值
  /// </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>
  /// 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
  /// </summary>
  /// <param name="key">参数名</param>
  /// <param name="value">参数值</param>
  /// key和value通常用于填充最后一组参数
  /// <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>
  /// 设置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、调用现金红包处理类:

 

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
/// <summary>
/// 企业号微信支付接口
/// </summary>
public static class TenPay
{
 
 #region 企业向用户发红包
 /// <summary>
 /// 用于企业向微信用户个人发红包
 /// 目前支持向指定微信用户的openid个人发红包
 /// </summary>
 /// <param name="certPassword">apiclient_cert.p12证书密码即商户号</param>
 /// <param name="data">微信支付需要post的xml数据</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);//设置指针读取位置
 
  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();//关闭文件访问
  }
  #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、调用现金红包接口

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#region 发送红包
bool fals = false; //记录发送红包是否成功
string xmlResult = null; //现金红包接口返回的xml
string certPath = null; //证书在服务器的物理位置
string data = null; //调用现金红包接口需要的数据
try
{
 //创建支付应答对象
 RequestHandler packageReqHandler = new RequestHandler(null);
 //初始化
 packageReqHandler.Init();
 string nonceStr = TenPayV3Util.GetNoncestr(); //时间戳
 //设置package订单参数
 packageReqHandler.SetParameter("nonce_str", nonceStr); //随机字符串,不长于32位
 packageReqHandler.SetParameter("mch_billno", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"] + model.JournalNumber);//商户订单号(每个订单号必须唯一)组成:mch_id+yyyymmdd+10位一天内不能重复的数字。接口根据商户订单号支持重入,如出现超时可再调用。
 packageReqHandler.SetParameter("mch_id", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_MchId"]); //微信支付分配的商户号
 packageReqHandler.SetParameter("wxappid", System.Configuration.ConfigurationManager.AppSettings["TenPayV3_AppId"]);//微信分配的公众账号ID(企业号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"); //红包发放总人数
 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

注意:证书所在文件夹权限,IIS必须有权限对该文件夹操作的权限。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://blog.csdn.net/lx_nhs/article/details/81302387

延伸 · 阅读

精彩推荐
  • C#深入理解C#的数组

    深入理解C#的数组

    本篇文章主要介绍了C#的数组,数组是一种数据结构,详细的介绍了数组的声明和访问等,有兴趣的可以了解一下。...

    佳园9492021-12-10
  • C#SQLite在C#中的安装与操作技巧

    SQLite在C#中的安装与操作技巧

    SQLite,是一款轻型的数据库,用于本地的数据储存。其优点有很多,下面通过本文给大家介绍SQLite在C#中的安装与操作技巧,感兴趣的的朋友参考下吧...

    蓝曈魅11162022-01-20
  • C#VS2012 程序打包部署图文详解

    VS2012 程序打包部署图文详解

    VS2012虽然没有集成打包工具,但它为我们提供了下载的端口,需要我们手动安装一个插件InstallShield。网上有很多第三方的打包工具,但为什么偏要使用微软...

    张信秀7712021-12-15
  • C#如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    如何使用C#将Tensorflow训练的.pb文件用在生产环境详解

    这篇文章主要给大家介绍了关于如何使用C#将Tensorflow训练的.pb文件用在生产环境的相关资料,文中通过示例代码介绍的非常详细,需要的朋友可以参考借鉴...

    bbird201811792022-03-05
  • C#利用C#实现网络爬虫

    利用C#实现网络爬虫

    这篇文章主要介绍了利用C#实现网络爬虫,完整的介绍了C#实现网络爬虫详细过程,感兴趣的小伙伴们可以参考一下...

    C#教程网11852021-11-16
  • C#三十分钟快速掌握C# 6.0知识点

    三十分钟快速掌握C# 6.0知识点

    这篇文章主要介绍了C# 6.0的相关知识点,文中介绍的非常详细,通过这篇文字可以让大家在三十分钟内快速的掌握C# 6.0,需要的朋友可以参考借鉴,下面来...

    雨夜潇湘8272021-12-28
  • C#C#微信公众号与订阅号接口开发示例代码

    C#微信公众号与订阅号接口开发示例代码

    这篇文章主要介绍了C#微信公众号与订阅号接口开发示例代码,结合实例形式简单分析了C#针对微信接口的调用与处理技巧,需要的朋友可以参考下...

    smartsmile20127762021-11-25
  • C#C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    C#设计模式之Strategy策略模式解决007大破密码危机问题示例

    这篇文章主要介绍了C#设计模式之Strategy策略模式解决007大破密码危机问题,简单描述了策略模式的定义并结合加密解密算法实例分析了C#策略模式的具体使用...

    GhostRider10972022-01-21