1、控制器方法:

  1. private string SendRedPackge(string OpenId, int Amount, string LuckyCode)
  2. {
  3. Models.PayWeiXinModel pModel = new Models.PayWeiXinModel();
  4. Html_Tools.Common.PayForWeiXinHelp PayHelp = new Html_Tools.Common.PayForWeiXinHelp();
  5. string result = string.Empty;
  6.  
  7. //接叐收红包的用户 用户在wxappid下的openid
  8. pModel.re_openid = OpenId;//"oFIYdszuDXVqVCtwZ-yIcbIS262k";
  9. //付款金额,单位分
  10. pModel.total_amount = Amount;
  11. //最小红包金额,单位分
  12. pModel.min_value = Amount;
  13. //最大红包金额,单位分
  14. pModel.max_value = Amount;
  15. //商户订单号
  16. pModel.mch_billno = LuckyCode;
  17. //调用方法
  18. string postData = PayHelp.DoDataForPayWeiXin(pModel);
  19. //发送
  20. result = PayHelp.PayForWeiXin(postData);
  21. XmlDocument doc = new XmlDocument();
  22. doc.LoadXml(result);
  23. var rmodel=new Models.WeiXinRedPackgeResultModel();
  24. Html_Tools.Common.WeiXinMPHelper.FillEntityFromXml(rmodel, doc);
  25. if (rmodel.result_code.Equals("SUCCESS"))
  26. {
  27. return "红包已成功发放,请及时领取";
  28. }
  29. else
  30. {
  31. Html_Tools.Common.ToolsHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 发送红包异常信息:" + result + "\r\n");
              pBll.DrawPrize(OpenId, LuckyCode, false);
  32. return "不好意思,红包发送出错啦。";
  33. }
  34. }

2、工具类PayForWeiXinHelp方法:

  1. public class PayForWeiXinHelp
  2. {
  3.  
  4. /// <summary>
  5. /// 调用微信支付接口前处理数据,包括sign验证等
  6. /// </summary>
  7. /// <param name="payForWeiXin"></param>
  8. /// <returns></returns>
  9. public string DoDataForPayWeiXin(Models.PayWeiXinModel payForWeiXin)
  10. {
  11. #region 处理nonce_str随机字符串,不长于 32 位(本程序生成长度为16位的)
  12. string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
  13. payForWeiXin.nonce_str = RandomStr(str, );
  14. #endregion
  15.  
  16. #region 商户信息从config文件中读取
  17. //商户支付密钥key
  18. string key = WeiXinConfig.key;
  19. //商户号
  20. payForWeiXin.mch_id = WeiXinConfig.mch_id;
  21. //商户 appid
  22. payForWeiXin.wxappid = WeiXinConfig.wxappid;
  23. //提供方名称
  24. payForWeiXin.nick_name = WeiXinConfig.nick_name;
  25. //红包収送者名称
  26. payForWeiXin.send_name = WeiXinConfig.send_name;
  27. //红包収放总人数
  28. payForWeiXin.total_num = int.Parse(WeiXinConfig.total_num);
  29. //红包祝福诧
  30. payForWeiXin.wishing = WeiXinConfig.wishing;
  31. //活劢名称
  32. payForWeiXin.act_name = WeiXinConfig.act_name;
  33. payForWeiXin.act_id = "act_id";
  34. //备注信息
  35. payForWeiXin.remark = WeiXinConfig.remark;
  36. //商户logo的url
  37. payForWeiXin.logo_imgurl = WeiXinConfig.logo_imgurl;
  38. //分享文案
  39. payForWeiXin.share_content = WeiXinConfig.share_content;
  40. //分享链接
  41. payForWeiXin.share_url = WeiXinConfig.share_url;
  42. //分享的图片url
  43. payForWeiXin.share_imgurl = WeiXinConfig.share_imgurl;
  44. //调用接口的机器 Ip 地址
  45. payForWeiXin.client_ip = WeiXinConfig.client_ip;
  46. #endregion
  47.  
  48. #region 订单信息
  49. //生成订单号组成: mch_id+yyyymmdd+10 位一天内不能重复的数字
  50. //生成10位不重复的数字
  51. payForWeiXin.mch_billno = payForWeiXin.mch_billno+System.DateTime.Now.ToString("yyyyMMddHHmmss");
  52. #endregion
  53.  
  54. string postData = @"<xml>
  55. <mch_billno><![CDATA[{0}]]></mch_billno>
  56. <mch_id><![CDATA[{1}]]></mch_id>
  57. <wxappid><![CDATA[{2}]]></wxappid>
  58. <send_name><![CDATA[{3}]]></send_name>
  59. <re_openid><![CDATA[{4}]]></re_openid>
  60. <total_amount><![CDATA[{5}]]></total_amount>
  61. <total_num><![CDATA[{6}]]></total_num>
  62. <wishing><![CDATA[{7}]]></wishing>
  63. <client_ip><![CDATA[{8}]]></client_ip>
  64. <act_name><![CDATA[{9}]]></act_name>
  65. <remark><![CDATA[{10}]]></remark>
  66. <nonce_str><![CDATA[{11}]]></nonce_str>";
  67. postData = string.Format(postData,
  68. payForWeiXin.mch_billno,
  69. payForWeiXin.mch_id,
  70. payForWeiXin.wxappid,
  71. payForWeiXin.send_name,
  72. payForWeiXin.re_openid,
  73. payForWeiXin.total_amount,
  74. payForWeiXin.total_num,
  75. payForWeiXin.wishing,
  76. payForWeiXin.client_ip,
  77. payForWeiXin.act_name,
  78. payForWeiXin.remark,
  79. payForWeiXin.nonce_str
  80. );
  81.  
  82. //原始传入参数
  83. string[] signTemp = { "mch_billno=" + payForWeiXin.mch_billno, "mch_id=" + payForWeiXin.mch_id, "wxappid=" + payForWeiXin.wxappid, "send_name=" + payForWeiXin.send_name, "re_openid=" + payForWeiXin.re_openid, "total_amount=" + payForWeiXin.total_amount, "total_num=" + payForWeiXin.total_num, "wishing=" + payForWeiXin.wishing, "client_ip=" + payForWeiXin.client_ip, "act_name=" + payForWeiXin.act_name, "remark=" + payForWeiXin.remark, "nonce_str=" + payForWeiXin.nonce_str };
  84.  
  85. List<string> signList = signTemp.ToList();
  86.  
  87. #region 处理支付签名
  88. //对signList按照ASCII码从小到大的顺序排序
  89. signList.Sort();
  90.  
  91. string signOld = string.Empty;
  92. //string payForWeiXinOld = string.Empty;
  93. int i = ;
  94. foreach (string temp in signList)
  95. {
  96. signOld += temp + "&";
  97. i++;
  98. }
  99. //signOld = signOld.Substring(0, signOld.Length - 1);
  100. //拼接Key
  101. signOld += "key=" + key;
  102. //处理支付签名
  103. payForWeiXin.sign = GetMD5Hash(signOld).ToUpper();
  104. #endregion
  105. postData += "<sign><![CDATA[{0}]]></sign></xml>";
  106. postData = string.Format(postData, payForWeiXin.sign);
  107. return postData;
  108. }
  109.  
  110. /// <summary>
  111. /// 调用微信支付接口
  112. /// </summary>
  113. /// <param name="payForWeiXin"></param>
  114. /// <returns></returns>
  115. public string PayForWeiXin(string postData)
  116. {
  117. string result = string.Empty;
  118. try
  119. {
  120. result = PostPage("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", postData);
  121. }
  122. catch (Exception ex)
  123. {
  124.  
  125. }
  126. return result;
  127. }
  128.  
  129. /// <summary>
  130. /// post微信请求
  131. /// </summary>
  132. /// <param name="posturl"></param>
  133. /// <param name="postData"></param>
  134. /// <returns></returns>
  135. public string PostPage(string posturl, string postData)
  136. {
  137. Stream outstream = null;
  138. Stream instream = null;
  139. StreamReader sr = null;
  140. HttpWebResponse response = null;
  141. HttpWebRequest request = null;
  142. Encoding encoding = Encoding.UTF8;
  143. byte[] data = encoding.GetBytes(postData);
  144. // 准备请求...
  145. try
  146. {
  147. //CerPath证书路径
  148. string certPath = WeiXinConfig.certPath;
  149. //证书密码
  150. string password = WeiXinConfig.password;
  151. X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, password, X509KeyStorageFlags.MachineKeySet);
  152.  
  153. // 设置参数
  154. request = WebRequest.Create(posturl) as HttpWebRequest;
  155. CookieContainer cookieContainer = new CookieContainer();
  156. request.CookieContainer = cookieContainer;
  157. request.AllowAutoRedirect = true;
  158. request.Method = "POST";
  159. request.ContentType = "text/xml";
  160. request.ContentLength = data.Length;
  161. request.ClientCertificates.Add(cert);
  162. outstream = request.GetRequestStream();
  163. outstream.Write(data, , data.Length);
  164. outstream.Close();
  165. //发送请求并获取相应回应数据
  166. response = request.GetResponse() as HttpWebResponse;
  167. //直到request.GetResponse()程序才开始向目标网页发送Post请求
  168. instream = response.GetResponseStream();
  169. sr = new StreamReader(instream, encoding);
  170. //返回结果网页(html)代码
  171. string content = sr.ReadToEnd();
  172. string err = string.Empty;
  173. return content;
  174.  
  175. }
  176. catch (Exception ex)
  177. {
  178. string err = ex.Message;
  179. return string.Empty;
  180. }
  181. }
  182.  
  183. public string RandomStr(string str, int Length)
  184. {
  185. string result = string.Empty;
  186. Random rd = new Random();
  187. for (int i = ; i < Length; i++)
  188. {
  189. result += str[rd.Next(str.Length)];
  190. }
  191. return result;
  192. }
  193.  
  194. /// <summary>
  195. /// Md5加密
  196. /// </summary>
  197. /// <param name="s"></param>
  198. /// <returns></returns>
  199. public static String Encrypt(String s)
  200. {
  201. MD5 md5 = new MD5CryptoServiceProvider();
  202. byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
  203. bytes = md5.ComputeHash(bytes);
  204. md5.Clear();
  205. string ret = "";
  206. for (int i = ; i < bytes.Length; i++)
  207. {
  208. ret += Convert.ToString(bytes[i], ).PadLeft(, '');
  209. }
  210. return ret.PadLeft(, '');
  211. }
  212.  
  213. public static string GetMD5Hash(string value)
  214. {
  215. var md5 = MD5.Create();
  216. var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
  217. var sb = new StringBuilder();
  218. foreach (byte b in bs)
  219. {
  220. sb.Append(b.ToString("x2"));
  221. }
  222. //所有字符转为大写
  223. return sb.ToString();
  224. }
  225.  
  226. public static void FillEntityFromXml<T>(this T entity, System.Xml.XmlDocument doc)
  227. {
  228. Dictionary<string, string> Dic = new Dictionary<string, string>();
  229. System.Xml.XmlNodeList nodelist = doc.DocumentElement.ChildNodes;
  230. if (nodelist.Count > )
  231. {
  232. Type t = entity.GetType();
  233. foreach (System.Xml.XmlElement el in nodelist)//读元素值
  234. {
  235. System.Reflection.PropertyInfo proInfo = t.GetProperty(el.Name);//访问Obj的类型的属性Value的属性信息(propertyInfo)
  236. if (proInfo != null)
  237. {
  238. string str2 = proInfo.PropertyType.Name;
  239. if (str2 == null)
  240. {
  241. goto Label_018A;
  242. }
  243. if (!(str2 == "DateTime"))
  244. {
  245. if (str2 == "Boolean")
  246. {
  247. goto Label_00E9;
  248. }
  249. if (str2 == "Int64")
  250. {
  251. goto Label_0134;
  252. }
  253. goto Label_018A;
  254. }
  255. proInfo.SetValue(entity, new DateTime(long.Parse(el.InnerText)), null);
  256. }
  257. continue;
  258. Label_00E9:
  259. proInfo.SetValue(entity, el.InnerText == "", null);
  260. continue;
  261. Label_0134:
  262. proInfo.SetValue(entity, long.Parse(el.InnerText), null);
  263. continue;
  264. Label_018A:
  265. proInfo.SetValue(entity, el.InnerText, null);
  266. }
  267. }
  268. }
  269.  
  270. }

第三方app抽奖发送微信红包实现的更多相关文章

  1. 第三方app抽奖发送微信红包

    1.控制器方法: private string SendRedPackge(string OpenId, int Amount, string LuckyCode) { Models.PayWeiXi ...

  2. 基于微信红包插件的原理实现android任何APP自动发送评论(已开源)

    背景 地址:https://github.com/huijimuhe/postman 核心就是android的AccessibilityService,回复功能api需要23以上版本才行. 其实很像在 ...

  3. 微信授权登陆接入第三方App(步骤总结)Android

    微信授权登陆接入第三方App(步骤总结)Android Android App实现第三方微信登录

  4. (实用篇)php官方微信接口大全(微信支付、微信红包、微信摇一摇、微信小店)

    微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class ...

  5. PHP实现微信随机红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  6. Python微信红包算法

    sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频) https://study.163.com/course/introduction.htm?courseId=1005269003& ...

  7. 小程序发微信红包后端Nodejs实现

    前提条件 1.有一个微信开放平台 https://open.weixin.qq.com/ 2.有一个微信公众平台 https://mp.weixin.qq.com  并且开通微信支付 3.有一个微信小 ...

  8. PHP实现微信红包算法和微信红包的架构设计简介

    微信红包的架构设计简介: 原文:https://www.zybuluo.com/yulin718/note/93148 @来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微 ...

  9. [转载]Android平台第三方应用分享到微信开发

    一.申请APPID 微信公共平台和微博分享一样,也需要申请一个ID,来作为调起微信.分享到微信的唯一标识. 申请微信APPID可以到微信平台http://open.weixin.qq.com/app/ ...

随机推荐

  1. 探索super()的执行顺序和__mro__方法

    class Base(object): def func(self): print('Base.func') class Foo(Base): def func(self): # 方式一:根据mro的 ...

  2. xavier_uniform/xavier_normal

    import math from torch.autograd import Variable import torch import torch.nn as nn import warnings w ...

  3. 批处理实现自动Git push

    用Git用的多,每次修改文件后都需要敲几条命令: git add git commit git push ······ 太麻烦了 于是想到使用批处理(.bat)来自动化这个过程(注意:Windows环 ...

  4. bio,nio,aio的区别 select,poll,epoll的区别

    先了解一些基本概念,什么是socket?什么是I/O操作 unix(like)世界里,一切皆文件,而文件是什么呢?文件就是一串二进制流而已,不管socket,还是FIFO.管道.终端,对我们来说,一切 ...

  5. IDC机房跳线

    服务网卡口与配线架 这里有一根网线 记录方式 签 A:23FM-23U-T07 (配线架网线) B:23FM-23U-NIC1(服务器网线) 在配线架的机柜旁边一定写明了 跳线的对面的   交换和配线 ...

  6. BZOJ3438 小M的作物(和拓展)

    题目链接:戳我 我们如果要选择一种种植情况的话,一定是其他的选择都不可行了.这种决策问题用最小割来处理最好不过. 建图方式--A为源点,B为汇点.然后将每个点分别向A,B连边,边权为种植它的价值.组合 ...

  7. 【技术分享:python 应用之三】使用 python 修改 excel 表格的 sheet 名称

    原始需求:已经下载好了 Excel 文件,但是 Excel 里的 sheet 的名称想要修改一下,比如原本默认的是sheet1,需要修成“DNEWCD_JQJSHMX”.需求比较简单,直接上代码吧! ...

  8. pyCharm报错"your evaluation license has expired, pycharm will now exit"解决方法(实测)

    一.修改C:\Windows\System32\drivers\etc 目录下的hosts文件 1.打开hosts文件,路径是 c:\windows\system32\drivers\etc\host ...

  9. Mongodb分片副本集集群搭建

    一.环境准备 1.1.主机信息(机器配置要求见硬件及开发标准规范文档V1.0) 序号 主机名 IP 1 DB_01 10.202.105.52 2 DB_02 10.202.105.53 3 DB_0 ...

  10. wannalfy 挑战赛8 F 白云的树(树形dp)

    链接:https://www.nowcoder.com/acm/contest/57/F 时间限制:C/C++ 2秒,其他语言4秒 空间限制:C/C++ 262144K,其他语言524288K 64b ...