微信支付教程系列之现金红包

目录

(一)微信公众号开发之VS远程调试
(二)微信公众号开发之基础梳理
(三)微信公众号开发之自动消息回复和自定义菜单
(四)微信公众号开发之网页授权获取用户基本信息
(五)微信公众号开发之网页中及时获取当前用户Openid及注意事项
(六)微信公众号开发之扫码支付
(七)微信公众号开发之公众号支付
(八)微信公众号开发之现金红包

微信支付教程系列之现金红包

最近最弄这个微信支付的功能,然后扫码、公众号支付,这些都做了,闲着无聊,就看了看微信支付的其他功能,发现还有一个叫“现金红包”的玩意,想着自己平时也喜欢发红包玩玩,但是就没试过写程序来实现,所以,心中就萌发了这个,搞一搞微信红包的功能,想尝试一下。

首先,先去查看的,当然是官方的API了,但是看了之后,心中跟以前初次接触微信支付那样,心中万头草泥马在奔腾。我们想哈,一个这么大的公司,我相信你们不缺技术人员吧,为什么你们就不能每个功能模块,按照语言大类,分别写一个demo出来呢?你特么,就简简单单的写几个接口给“我们”看。其中,为啥,“我们”要加双引号呢?因为,我觉得啊,腾讯这边,写的这个文档,只给那些有4、5年工作经验以上的,老手,对代码和程序非常熟悉的人看的。因为,刚出来工作,或者才工作一两年的,看这些接口,真特么的是一头雾水的。不知道我写的这些,腾讯公司的人会不会看得到,看到了,会不会找我去面谈呢?毕竟,我也是准备过深圳发展的人,O(∩_∩)O哈哈~

后来,不费话了,我贴一下官方的API来给看看,地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_5

红包发放说明

用于企业向微信用户个人发现金红包

目前支持向指定微信用户的openid发放指定金额红包。(获取openid参见微信公众平台开发者文档:网页授权获取用户基本信息

如需操作请登录https://pay.weixin.qq.com/

这第一段话:第一、就是告诉你们,现在红包,只能通过openid来发,不能通过我们的微信号(微信号是你的唯一id,在自己微信上可以看得到,openid也是唯一,但是在自己的微信上看不到,只能通过接口来获取自己的openid,至于怎么后去,上面有链接,可以通过网页授权来获取)来发红包。第二呢,就是告诉你,你要知道怎么后去openid。这个怎么获取openid,我这里就不介绍了,这个属于微信支付最基础的了,如果你获取不到openid,那么基本上所有功能你都做不了。如果不知道怎么弄的,还是看看官方的文档,或者百度找找。我记得,好像我也有写过相关的教程,但是我不记得有没有发在博客园了。好了,先不扯这个。

接下来,看完了段话,我们来看真正的API,如下:

接口调用请求说明

请求Url https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack
是否需要证书 是(证书及使用说明详见商户证书
请求方式 POST

这一段呢,就是告诉你,小盆友们,我这个是http请求的,所以,要用到HttpWebRequest  这玩意,如果你不懂,哼哼,我也不会给demo你的,自己度娘去(是不是想骂他,那你骂吧,别骂我就行,因为接下来,我告诉你怎么整)。接下来呢,这次这好家伙,需要用到证书了,这个怎么用啊,证书怎么添加啊,还是一头雾水是吧?那您继续骂,骂够了,咱继续往下走。接下来,请求方式,是POST,这个,应该懂的人比较多,应该没啥问题,心里终于好受一些了。好,这一段到这。我们继续往下走。。。

请求参数

字段名 字段 必填 示例值 类型 说明
随机字符串 nonce_str 5K8264ILTKCH16CQ2502SI8ZNMTM67VS String(32) 随机字符串,不长于32位
签名 sign C380BEC2BFD727A4B6845133519F3AD6 String(32) 详见签名生成算法
商户订单号 mch_billno 10000098201411111234567890 String(28)
商户订单号(每个订单号必须唯一)

组成:mch_id+yyyymmdd+10位一天内不能重复的数字。

接口根据商户订单号支持重入,如出现超时可再调用。

商户号 mch_id 10000098 String(32) 微信支付分配的商户号
公众账号appid wxappid wx8888888888888888 String(32) 微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。
商户名称 send_name 天虹百货 String(32) 红包发送者名称
用户openid re_openid oxTWIuGaIt6gTKsQRLau2M0yL16E String(32)
接受红包的用户

用户在wxappid下的openid

付款金额 total_amount 1000 int 付款金额,单位分
红包发放总人数 total_num 1 int
红包发放总人数

total_num=1

红包祝福语 wishing 感谢您参加猜灯谜活动,祝您元宵节快乐! String(128) 红包祝福语
Ip地址 client_ip 192.168.0.1 String(15) 调用接口的机器Ip地址
活动名称 act_name 猜灯谜抢红包活动 String(32) 活动名称
备注 remark 猜越多得越多,快来抢! String(256) 备注信息

这里面呢,就是请求的参数了,每个都有相应的解释,所以,我就不多讲了。然后呢,这些个参数就是让你传参的,但是我们弄好之后呢,到底是传一个对象呢,还是字符串呢?一般用过请求的同伴都知道是字符串的格式,字符串也有好几种,分json和xml,这次微信支付里面用到的就是xml了,我们看他的demo,如下:

数据示例:

<xml>

<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>

<mch_billno><![CDATA[0010010404201411170000046545]]></mch_billno>

<mch_id><![CDATA[888]]></mch_id>

<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>

<send_name><![CDATA[send_name]]></send_name>

<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>

<total_amount><![CDATA[200]]></total_amount>

<total_num><![CDATA[1]]></total_num>

<wishing><![CDATA[恭喜发财]]></wishing>

<client_ip><![CDATA[127.0.0.1]]></client_ip>

<act_name><![CDATA[新年红包]]></act_name>

<remark><![CDATA[新年红包]]></remark>

<nonce_str><![CDATA[50780e0cca98c8c8e814883e5caa672e]]></nonce_str>

</xml>

通过上面,我们就很详细的知道,我们要的是xml了,非常幸运的是,微信支付的demo里面,有这个转xml的代码,所以,下面我的代码里面,就直接用他的了。接下来,我们就开始实战了。

首先,我们就新建一个窗体(虽然我用窗体,但是用在web上,也是一样通用的)来,如下:

然后双击“测试微信红包”,自动生成代码如吓:

 /// <summary>
        /// 发送微信红包
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnSendRedPack_Click(object sender, EventArgs e)
        {
            string strData = GetJsApiParameters();
            string strUrl = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";//这个就是发送红包的API接口了

            string strResult = WxRedPackPost(strUrl, strData);

        } 

上面的strData的来源,别紧张,我会把代码贴出来的,如下(记住,我每个都有注释,自己认真看):

         /// <summary>
        /// 构造参数
        /// </summary>
        /// <returns></returns>
        public string GetJsApiParameters()
        {
            int iMin = 1000;
            int iMax = 9999;
            Random rd = new Random();//构造随机数
            string strMch_billno = WxPayConfig.MCHID + DateTime.Now.ToString("yyyyMMddHHmmss") + rd.Next(iMin, iMax).ToString();
            WxPayData jsApiParam = new WxPayData();
            jsApiParam.SetValue("act_name", "活动名称:功能测试");//活动名称
            jsApiParam.SetValue("client_ip", "192.168.1.216");//这里填写的是我本机的内网ip,实际应用不知道需不需要改。
            jsApiParam.SetValue("mch_billno", strMch_billno);//商户订单号,商户订单号(每个订单号必须唯一)组成:mch_id+yyyymmdd+10位一天内不能重复的数字。 接口根据商户订单号支持重入,如出现超时可再调用。
            jsApiParam.SetValue("mch_id", WxPayConfig.MCHID);//商户号,微信支付分配的商户号
            jsApiParam.SetValue("nonce_str", WxPayApi.GenerateNonceStr());//随机字符串,不长于32位
            jsApiParam.SetValue("remark", "备注信息,梁明晓");//备注信息
            jsApiParam.SetValue("re_openid", "oZk_xsvzIqH2Xz_RPycJEYuTHAXx");//接收者的openid
            jsApiParam.SetValue("send_name", "雅达电子");//商户名称,红包发送者名称
            jsApiParam.SetValue("total_amount", 100);//红包金额,单位分
            jsApiParam.SetValue("total_num", 1);//红包发放总人数
            jsApiParam.SetValue("wishing", "感谢您参加猜灯谜活动,祝您元宵节快乐!");//红包祝福语
            jsApiParam.SetValue("wxappid", WxPayConfig.APPID);//公众账号appid,微信分配的公众账号ID(企业号corpid即为此appId)。接口传入的所有appid应该为公众号的appid(在mp.weixin.qq.com申请的),不能为APP的appid(在open.weixin.qq.com申请的)。
            jsApiParam.SetValue("sign", jsApiParam.MakeSign());//签名,切记,这个签名参数必须放在最后,因为他生成的签名,跟前面的参数有关系

            string parameters = jsApiParam.ToXml();
            return parameters;
        }

上述这些:WxPayData,WxPayConfig,WxPayApi是在微信支付的demo中直接拿过来用的,你们也直接拿过来用就行,官方demo下载地址:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=11_1

缺少的代码就剩下:WxRedPackPost这个了,也会给你,统统都给你,O(∩_∩)O哈哈~(记住哈,改写的,我都写了注释,自己认真看)

     /// <summary>
        /// 提交请求
        /// </summary>
        /// <param name="posturl"></param>
        /// <param name="postData"></param>
        /// <returns></returns>
        public string WxRedPackPost(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 = @"F:\Jeffrey9061\SVN\Project\CompanyProject\西安培华微信用户实时更新客户端\西安培华微信用户实时更新客户端\" + WxPayConfig.SSLCERT_PATH;
                //证书密码
                string password = WxPayConfig.SSLCERT_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;
            }
        }  

好,到此大功告成,下面是红包发送的截图:

原文地址:https://www.cnblogs.com/nangong/p/1a2add4356c7bcbab5990c89cbe37d38.html

原文地址:https://www.cnblogs.com/zhangxiaoyong/p/9268983.html

时间: 2024-11-15 00:30:35

微信支付教程系列之现金红包的相关文章

【原创分享&#183;微信支付】 C# 微信支付教程系列之扫码支付

微信支付教程系列之扫码支付 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多.例如我们在地铁.公交站常见的那些自动售货机(不错,就是那种投硬币,就可以自动出货的那种机器)中都用到.以前,那种机器,只能通过投硬币或者纸币,但是,这里面也有一定的风险

微信支付教程系列之扫码支付

微信支付教程系列之扫码支付 http://www.cnblogs.com/nangong/p/9fa625bfb92a986125f0ba72704c46ec.html 今天,我们来一起探讨一下这个微信扫码支付.何为扫码支付呢?这里面,扫的码就是二维码了,就是我们经常扫一扫的那种二维码图片,例如,我们自己添加好友的时候,可以通过输入对方的微信号,也可以扫一扫对方的二维码.扫码支付,作为,微信支付里面,不可或缺的一个功能,对商品的支付提供了极为方便的体验,用途也非常的多.例如我们在地铁.公交站常见

C# MVC 微信支付教程系列之公众号支付

微信支付教程系列之公众号支付   今天,我们接着讲微信支付的系列教程,前面,我们讲了这个微信红包和扫码支付.现在,我们讲讲这个公众号支付.公众号支付的应用环境常见的用户通过公众号,然后再通过公众号里面的菜单链接,进入公众号的商城,然后在里面完成购买和支付功能,我们可以看看官方对这个公众号支付的场景的解释,链接:https://pay.weixin.qq.com/wiki/doc/api/jsapi.php?chapter=7_1,通过这个官方的解释,那我们大概清楚这个公众号的用途了,下面,我就说

在douphp中加入微信支付教程

本教程结合推送模板消息效果更佳!如果您在用douphp的订单会员模块并且在微信端使用,那么在处理订单的时候可以使用微信付款!前提条件:开通微信支付微信公众号会员关注了你的微信公众号 直接使用微信提供的sdk就可以,具体的操作办法如下! 1.下载微信提供的公众号内支付的sdk文件!下载地址:https://pay.weixin.qq.com/wiki/doc/api/download/WxpayAPI_php_v3.zip2.解压后我们放在m/目录下即可(按照sdk/doc文件夹内的word文档修

iOS中 最新微信支付/最全的微信支付教程具体解释 韩俊强的博客

亲们, 首先让我们来看一下微信支付的流程吧. 1. 注冊微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些參数. 2. 下载微信支付sdk 3. client请求订单,后台与微信后台交互.返回给client支付參数 4. 调用微信client.由微信client和微信server打交道: 5. client和服务端都会收到支付结果:(前台消息不可靠.我们须要去后台验证,假设后台没有收到支付通知.后台去微信server验证然后将结果返回给client)

iOS中 最新微信支付/最全的微信支付教程详解 韩俊强的博客

每日更新关注:http://weibo.com/hanjunqiang  新浪微博! 亲们, 首先让我们来看一下微信支付的流程吧. 1. 注册微信开放平台,创建应用获取appid,appSecret,申请支付功能,申请成功之后会返回一些参数. 2. 下载微信支付sdk 3. 客户端请求订单,后台与微信后台交互,返回给客户端支付参数 4. 调用微信客户端,由微信客户端和微信服务器打交道: 5. 客户端和服务端都会收到支付结果:(前台消息不可靠,我们需要去后台验证,如果后台没有收到支付通知,后台去微

基于PHP的微信支付教程

微信支付作为各大移动支付方式之一,本课程只要向大家介绍并使用微信支付的常用功能,进而集合到已有的项目中去,希望各位能够快速上手并掌握实战"干货". 出处至:汇智网  hubwiz.com 准备工作 关于微信支付 1. 生活中的微信支付 ??目前我们日常生活中接触得比较多的线上电子支付方式主要有两种,一种是支付宝,另一种就是微信支付了,微信支付是集成在微信客户端的支付功能,所谓微信客户端,主要是微信的移动应用,例如安卓(Android)微信APP.IOS微信APP,用户可以通过手机的微信

C# MVC 微信支付之微信模板消息推送

微信支付之微信模板消息推送 今天我要跟大家分享的是"模板消息"的推送,这玩意呢,你说用途嘛,那还是真真的牛逼呐.原因在哪?就是因为它是依赖微信生存的呀,所以他能不牛逼吗?现在的社会,人多多少少都有或轻或重的"强迫症".就是,看到有未读消息,都要去看一下.特别是现在的微信,大部分可以几个小时不看手机QQ有没有新消息来,但是这大部分人绝对做不到一个小时不看微信有没有消息来.现在的微信,真特么是神一样的存在,几乎人人手机上都会有微信.而且,如果你的公众号是服务号的话,这个

微信公众号可通过现金红包接口发放微信支付现金红包(附开发教程)

农历新年将至,支付宝红包打了一仗,微信在朋友圈屏蔽了它的分享,但单防守还不行,进攻才是最好的防守.昨日,微信支付现金红包接口正式开放,只需开通微信支付,即可接入现金红包.微信公众号也可以发放现金红包了! 通过现金红包接口,公众号开发者可以策划相关运营活动,向用户发放微信支付现金红包,更好的达到品牌推广及回馈用户的效果. 1.商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2.领取到红包后,用户的资金直接进入微信零钱,避免繁复的领