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

1、控制器方法:

 private string SendRedPackge(string OpenId, int Amount, string LuckyCode)
        {
            Models.PayWeiXinModel pModel = new Models.PayWeiXinModel();
            Html_Tools.Common.PayForWeiXinHelp PayHelp = new Html_Tools.Common.PayForWeiXinHelp();
            string result = string.Empty;

            //接叐收红包的用户 用户在wxappid下的openid
            pModel.re_openid = OpenId;//"oFIYdszuDXVqVCtwZ-yIcbIS262k";
            //付款金额,单位分
            pModel.total_amount = Amount;
            //最小红包金额,单位分
            pModel.min_value = Amount;
            //最大红包金额,单位分
            pModel.max_value = Amount;
            //商户订单号
            pModel.mch_billno = LuckyCode;
            //调用方法
            string postData = PayHelp.DoDataForPayWeiXin(pModel);
            //发送
            result = PayHelp.PayForWeiXin(postData);
            XmlDocument doc = new XmlDocument();
            doc.LoadXml(result);
            var rmodel=new Models.WeiXinRedPackgeResultModel();
            Html_Tools.Common.WeiXinMPHelper.FillEntityFromXml(rmodel, doc);
            if (rmodel.result_code.Equals("SUCCESS"))
            {
                return "红包已成功发放,请及时领取";
            }
            else
            {
                Html_Tools.Common.ToolsHelper.WriteLog(DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " 发送红包异常信息:" + result + "\r\n");          pBll.DrawPrize(OpenId, LuckyCode, false);
                return "不好意思,红包发送出错啦。";
            }
        }

2、工具类PayForWeiXinHelp方法:

 public class PayForWeiXinHelp
    {

        /// <summary>
        /// 调用微信支付接口前处理数据,包括sign验证等
        /// </summary>
        /// <param name="payForWeiXin"></param>
        /// <returns></returns>
        public string DoDataForPayWeiXin(Models.PayWeiXinModel payForWeiXin)
        {
            #region 处理nonce_str随机字符串,不长于 32 位(本程序生成长度为16位的)
            string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
            payForWeiXin.nonce_str = RandomStr(str, 16);
            #endregion

            #region 商户信息从config文件中读取
            //商户支付密钥key
            string key = WeiXinConfig.key;
            //商户号
            payForWeiXin.mch_id = WeiXinConfig.mch_id;
            //商户 appid
            payForWeiXin.wxappid = WeiXinConfig.wxappid;
            //提供方名称
            payForWeiXin.nick_name = WeiXinConfig.nick_name;
            //红包収送者名称
            payForWeiXin.send_name = WeiXinConfig.send_name;
            //红包収放总人数
            payForWeiXin.total_num = int.Parse(WeiXinConfig.total_num);
            //红包祝福诧
            payForWeiXin.wishing = WeiXinConfig.wishing;
            //活劢名称
            payForWeiXin.act_name = WeiXinConfig.act_name;
            payForWeiXin.act_id = "act_id";
            //备注信息
            payForWeiXin.remark = WeiXinConfig.remark;
            //商户logo的url
            payForWeiXin.logo_imgurl = WeiXinConfig.logo_imgurl;
            //分享文案
            payForWeiXin.share_content = WeiXinConfig.share_content;
            //分享链接
            payForWeiXin.share_url = WeiXinConfig.share_url;
            //分享的图片url
            payForWeiXin.share_imgurl = WeiXinConfig.share_imgurl;
            //调用接口的机器 Ip 地址
            payForWeiXin.client_ip = WeiXinConfig.client_ip;
            #endregion

            #region 订单信息
            //生成订单号组成: mch_id+yyyymmdd+10 位一天内不能重复的数字
            //生成10位不重复的数字
            payForWeiXin.mch_billno = payForWeiXin.mch_billno+System.DateTime.Now.ToString("yyyyMMddHHmmss");
            #endregion

            string postData = @"<xml>
                                 <mch_billno><![CDATA[{0}]]></mch_billno>
                                 <mch_id><![CDATA[{1}]]></mch_id>
                                 <wxappid><![CDATA[{2}]]></wxappid>
                                 <send_name><![CDATA[{3}]]></send_name>
                                 <re_openid><![CDATA[{4}]]></re_openid>
                                 <total_amount><![CDATA[{5}]]></total_amount>
                                 <total_num><![CDATA[{6}]]></total_num>
                                 <wishing><![CDATA[{7}]]></wishing>
                                 <client_ip><![CDATA[{8}]]></client_ip>
                                 <act_name><![CDATA[{9}]]></act_name>
                                 <remark><![CDATA[{10}]]></remark>
                                 <nonce_str><![CDATA[{11}]]></nonce_str>";
            postData = string.Format(postData,
                                            payForWeiXin.mch_billno,
                                            payForWeiXin.mch_id,
                                            payForWeiXin.wxappid,
                                            payForWeiXin.send_name,
                                            payForWeiXin.re_openid,
                                            payForWeiXin.total_amount,
                                            payForWeiXin.total_num,
                                            payForWeiXin.wishing,
                                            payForWeiXin.client_ip,
                                            payForWeiXin.act_name,
                                            payForWeiXin.remark,
                                            payForWeiXin.nonce_str
                                );

            //原始传入参数
            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 };

            List<string> signList = signTemp.ToList();

            #region 处理支付签名
            //对signList按照ASCII码从小到大的顺序排序
            signList.Sort();

            string signOld = string.Empty;
            //string payForWeiXinOld = string.Empty;
            int i = 0;
            foreach (string temp in signList)
            {
                signOld += temp + "&";
                i++;
            }
            //signOld = signOld.Substring(0, signOld.Length - 1);
            //拼接Key
            signOld += "key=" + key;
            //处理支付签名
            payForWeiXin.sign = GetMD5Hash(signOld).ToUpper();
            #endregion
            postData += "<sign><![CDATA[{0}]]></sign></xml>";
            postData = string.Format(postData, payForWeiXin.sign);
            return postData;
        }

        /// <summary>
        /// 调用微信支付接口
        /// </summary>
        /// <param name="payForWeiXin"></param>
        /// <returns></returns>
        public string PayForWeiXin(string postData)
        {
            string result = string.Empty;
            try
            {
                result = PostPage("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", postData);
            }
            catch (Exception ex)
            {

            }
            return result;
        }

        /// <summary>
        /// post微信请求
        /// </summary>
        /// <param name="posturl"></param>
        /// <param name="postData"></param>
        /// <returns></returns>
        public string PostPage(string posturl, string postData)
        {
            Stream outstream = null;
            Stream instream = null;
            StreamReader sr = null;
            HttpWebResponse response = null;
            HttpWebRequest request = null;
            Encoding encoding = Encoding.UTF8;
            byte[] data = encoding.GetBytes(postData);
            // 准备请求...
            try
            {
                //CerPath证书路径
                string certPath = WeiXinConfig.certPath;
                //证书密码
                string password = WeiXinConfig.password;
                X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, password, X509KeyStorageFlags.MachineKeySet);

                // 设置参数
                request = WebRequest.Create(posturl) as HttpWebRequest;
                CookieContainer cookieContainer = new CookieContainer();
                request.CookieContainer = cookieContainer;
                request.AllowAutoRedirect = true;
                request.Method = "POST";
                request.ContentType = "text/xml";
                request.ContentLength = data.Length;
                request.ClientCertificates.Add(cert);
                outstream = request.GetRequestStream();
                outstream.Write(data, 0, data.Length);
                outstream.Close();
                //发送请求并获取相应回应数据
                response = request.GetResponse() as HttpWebResponse;
                //直到request.GetResponse()程序才开始向目标网页发送Post请求
                instream = response.GetResponseStream();
                sr = new StreamReader(instream, encoding);
                //返回结果网页(html)代码
                string content = sr.ReadToEnd();
                string err = string.Empty;
                return content;

            }
            catch (Exception ex)
            {
                string err = ex.Message;
                return string.Empty;
            }
        }

        public string RandomStr(string str, int Length)
        {
            string result = string.Empty;
            Random rd = new Random();
            for (int i = 0; i < Length; i++)
            {
                result += str[rd.Next(str.Length)];
            }
            return result;
        }

        /// <summary>
        /// Md5加密
        /// </summary>
        /// <param name="s"></param>
        /// <returns></returns>
        public static String Encrypt(String s)
        {
            MD5 md5 = new MD5CryptoServiceProvider();
            byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
            bytes = md5.ComputeHash(bytes);
            md5.Clear();
            string ret = "";
            for (int i = 0; i < bytes.Length; i++)
            {
                ret += Convert.ToString(bytes[i], 16).PadLeft(2, ‘0‘);
            }
            return ret.PadLeft(32, ‘0‘);
        }

        public static string GetMD5Hash(string value)
        {
            var md5 = MD5.Create();
            var bs = md5.ComputeHash(Encoding.UTF8.GetBytes(value));
            var sb = new StringBuilder();
            foreach (byte b in bs)
            {
                sb.Append(b.ToString("x2"));
            }
            //所有字符转为大写
            return sb.ToString();
        }

 public static void FillEntityFromXml<T>(this T entity, System.Xml.XmlDocument doc)
        {
            Dictionary<string, string> Dic = new Dictionary<string, string>();
            System.Xml.XmlNodeList nodelist = doc.DocumentElement.ChildNodes;
            if (nodelist.Count > 0)
            {
                Type t = entity.GetType();
                foreach (System.Xml.XmlElement el in nodelist)//读元素值
                {
                    System.Reflection.PropertyInfo proInfo = t.GetProperty(el.Name);//访问Obj的类型的属性Value的属性信息(propertyInfo)
                    if (proInfo != null)
                    {
                        string str2 = proInfo.PropertyType.Name;
                        if (str2 == null)
                        {
                            goto Label_018A;
                        }
                        if (!(str2 == "DateTime"))
                        {
                            if (str2 == "Boolean")
                            {
                                goto Label_00E9;
                            }
                            if (str2 == "Int64")
                            {
                                goto Label_0134;
                            }
                            goto Label_018A;
                        }
                        proInfo.SetValue(entity, new DateTime(long.Parse(el.InnerText)), null);
                    }
                    continue;
                Label_00E9:
                    proInfo.SetValue(entity, el.InnerText == "1", null);
                        continue;
                Label_0134:
                    proInfo.SetValue(entity, long.Parse(el.InnerText), null);
                    continue;
                Label_018A:
                    proInfo.SetValue(entity, el.InnerText, null);
                }
            }
        }

    }
时间: 2024-10-06 14:19:52

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

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

背景 地址:https://github.com/huijimuhe/postman 核心就是android的AccessibilityService,回复功能api需要23以上版本才行. 其实很像在做单元测试.你可以有n种方式实现发帖功能,这只是一个比较邪火的方式,亲测过一次,可行.这里我以网易新闻客户端举例. 模拟你在手机端的物理动作:选择新闻->回复->退回新闻列表->进入下一个新闻->回复->退回新闻列表刷新->进入->回复.... 做的不精细,只是探究到

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

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

微信红包发送规则

微信红包发送规则 1. 发送频率规则 ◆ 每分钟发送红包数量不得超过1800个: ◆ 北京时间0:00-8:00不触发红包赠送:(如果以上规则不满足您的需求,请发邮件至[email protected]获取升级指引) 2. 红包规则 ◆ 单个红包金额介于[1.00元,200.00元]之间: ◆ 同一个红包只能发送给一个用户:(如果以上规则不满足您的需求,请发邮件至[email protected]获取升级指引)

微信h5页面中跳转下载第三方app的办法

需求:在微信h5页面中下载第三方app -- 安卓, 直接下载apk文件包:iphone,跳转AppStore 分析:微信不支持,在微信中屏蔽了apk文件的下载以及AppStore的跳转(且除非和TX有合作的应用,否则也不支持通过scheme跳转第三方app) 变通方法: 一.借助TX的应用市场 --'应用宝':将app上架应用宝,在微信中点击下载按钮(app的应用宝微下载地址),安卓则可跳转应用直接进行下载,iphone则会自动跳转Appstore(需在TX开发平台进行配置) 总结:虽然这种方

第三方聚合支付vs微信支付宝支付,有何区别?

自移动支付逐步取缔了现金支付后,现在我们在商户的收银台上会看到各种二维码牌,一般比较经常看到的主要是微信L牌.支付宝二维码L牌,有部分商户会直接打印二维码帖子在桌面上.现在很多人估计会听到有些朋友是做微信和支付宝的移动支付,那么他们所说的做微信和支付宝的移动支付究竟是什么?聚合支付品牌有哪些?微信作为聚合支付品牌国内支付龙头企业,根据微信在2018年发布的<2018微信年度数据报告>显示,2018年,微信每个月有10.82亿用户保持活跃,每天有450亿次信息发送出去,每天有4.1亿音视频呼叫成

微信红包的架构设计简介

@来源于QCon某高可用架构群整理,整理朱玉华. 背景:有某个朋友在朋友圈咨询微信红包的架构,于是乎有了下面的文字(有误请提出,谢谢) 概况:2014年微信红包使用数据库硬抗整个流量,2015年使用cache抗流量. 微信的金额什么时候算? 答:微信金额是拆的时候实时算出来,不是预先分配的,采用的是纯内存计算,不需要预算空间存储.. 采取实时计算金额的考虑:预算需要占存储,实时效率很高,预算才效率低. 实时性:为什么明明抢到红包,点开后发现没有? 答:2014年的红包一点开就知道金额,分两次操作

微信红包随机算法

最近看了一篇文章,讲微信红包随机算法的.感觉很不错,所以自己实现了下,并进行了简单测试. 算法 算法很简单,不是提前算好,而是抢红包时计算: 红包里的金额怎么算?为什么出现各个红包金额相差很大?答:随机,额度在0.01和剩余平均值*2之间. 实现 实现上述算法的逻辑主要是: public static double getRandomMoney(RedPackage _redPackage) { // remainSize 剩余的红包数量 // remainMoney 剩余的钱 if (_red

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

微信入口绑定,微信事件处理,微信API全部操作包含在这些文件中.内容有:微信摇一摇接口/微信多客服接口/微信支付接口/微信红包接口/微信卡券接口/微信小店接口/JSAPI <?php class WxApi { const appId = ""; const appSecret = ""; const mchid = ""; //商户号 const privatekey = ""; //私钥 public $parame

Android平台第三方应用分享到微信开发

[转载]Android平台第三方应用分享到微信开发 一.申请APPID 微信公共平台和微博分享一样,也需要申请一个ID,来作为调起微信.分享到微信的唯一标识. 申请微信APPID可以到微信平台http://open.weixin.qq.com/app/list/?lang=zh_CN上申请.具体的申请流程网站上有很详细的介绍,我这里就仅列出一些注意事项: (1)申请APPID时的应用名字审核通过之后将不允许更改,所以申请时的应用名字一定要提前确定好.微信官方也有详细说明,如下图: (2)应用签名