C#开发微信门户及应用(33)--微信现金红包的封装及使用
我在上篇随笔《C#开发微信门户及应用(32)--微信支付接入和API封装使用》介绍为微信支付的API封装及使用,其中介绍了如何配置好支付环境,并对扫码支付的两种方式如何在C#开发中使用进行了介绍,本随笔继续介绍微信支付的相关内容,介绍其中的微信现金红包和裂变红包的封装和使用。
在上篇随笔后,经过对整个微信框架的完善和重构,已经完成了对微信支付、企业付款、现金红包、代金券及各种卡劵进行了封装完成,并把其中微信支付及摇一摇红包部分等内容作为公众号和企业号通用的部分,这些支付相关的接口在公众号和企业号里面,都可以进行调用的,在经过一系列的优化整理后,把这些内容逐一进行介绍,希望大家喜欢支持。
1、现金红包的概念及使用
1)使用场景
微信支付现金红包向微信支付商户开发,具体能力如下:
◆ 商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景
◆ 领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验
◆ 每分钟发送红包数量不得超过1800个;
◆ 同一个商户号,每分钟最多给同一个用户发送一个红包;
红包规则
◆ 单个红包金额介于[1.00元,200.00元]之间;
◆ 同一个红包只能发送给一个用户;(如果以上规则不满足您的需求,请发邮件至wxhongbao@tencent.com获取升级指引)
◆ 红包发放后72小时未被领取将进行退款
3) 微信红包接口调用流程
◆ 后台API调用:待进入联调过程时与开发进行详细沟通;
◆ 告知服务器:告知服务器接收微信红包的用户openID,告知服务器该用户获得的金额;
◆ 从商务号扣款:服务器获取信息后从对应的商务号扣取对应的金额;
◆ 调用失败:因不符合发送规则,商务号余额不足等原因造成调用失败,反馈至调用方;
◆ 发送成功:以微信红包公众账号发送对应红包至对应用户;
2、 现金红包API接口的说明及C#的封装
用于企业向微信用户个人发现金红包,目前支持向指定微信用户的openid发放指定金额红包。
虽然可以通过微信的商户后台进行现金红包的发放,但我们也可以利用微信提供的接口API进行现金红包的发送。
接口调用请求说明
请求Url | https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack |
---|---|
是否需要证书 | 是(证书及使用说明详见商户证书) |
请求方式 | 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) | 备注信息 |
数据示例:
<xml>
<xml>
<sign><![CDATA[E1EE61A91C8E90F299DE6AE075D60A2D]]></sign>
<mch_billno><![CDATA[]]></mch_billno>
<mch_id><![CDATA[]]></mch_id>
<wxappid><![CDATA[wxcbda96de0b165486]]></wxappid>
<send_name><![CDATA[send_name]]></send_name>
<re_openid><![CDATA[onqOjjmM1tad-3ROpncN-yUfa6uI]]></re_openid>
<total_amount><![CDATA[]]></total_amount>
<total_num><![CDATA[]]></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>
上面是接口及输入参数的说明,一般情况下,我们需要根据这些来决定如何实现C#代码的封装,首先我们来定义我们需要的接口和类,如下所示。
通过分析上面的接口说明,我们可以发现,其中接口有部分是固定的常规参数,也就是一般公众号或者企业号的身份信息,有部分是业务参数,因此我们把它们分别分离出来,这样有利于我们对接口的封装和使用,那些常规的参数我们通过公众号身份获取就可以了,业务信息,我们可以定义一个实体类来进行数据的存储交换即可。
对应上图的固定的常规参数,在接口说明中如下所示。
因此,这些信息我们从账号里面设置及获取即可,我们可以在管理后台对它们进行配置,然后在代码逻辑里面取出来使用即可。
根据上面的介绍,我们可以定义红包接口代码如下所示。
/// <summary>
/// 微信红包(摇一摇红包)操作API
/// </summary>
public interface ILotteryApi
{
/// <summary>
/// 用于企业向微信用户个人发现金红包。需要商户证书
/// 目前支持向指定微信用户的openid发放指定金额红包。
/// </summary>
/// <returns></returns>
SendRedPackResult SendRedPack(SendRedPackJson json);
其中的 SendRedPackJson 是我们变化的业务参数,我们定义了一个类来进行信息的承载,方便想接口传递信息。
/// <summary>
/// 现金红包和裂变红包的基础信息
/// </summary>
public class BaseRedPackJson
{
/// <summary>
/// 接受红包的用户
/// 用户openid
/// </summary>
public string re_openid { get; set; } /// <summary>
/// 付款金额,单位分
/// </summary>
public int total_amount { get; set; } /// <summary>
/// 红包发放总人数
/// </summary>
public int total_num { get; set; } /// <summary>
/// 红包祝福语
/// </summary>
public string wishing { get; set; } /// <summary>
/// 活动名称
/// </summary>
public string act_name { get; set; } /// <summary>
/// 备注信息
/// </summary>
public string remark { get; set; }
} /// <summary>
/// 发送红包的数据信息
/// </summary>
public class SendRedPackJson :BaseRedPackJson
{
/// <summary>
/// 调用接口的机器Ip地址
/// </summary>
public string client_ip { get; set; } public SendRedPackJson()
{
this.total_num = ;//红包发放总人数
}
}
根据上面参数的定义,我们在现金红包的接口实现里面,具体代码如下所示,里面的逻辑内容,主要就是传入常规参数和业务参数两部分,然后调用接口的地址进行数据的提交(POST),获取返回结果并进行解析即可。
/// <summary>
/// 用于企业向微信用户个人发现金红包。需要商户证书
/// 目前支持向指定微信用户的openid发放指定金额红包。
/// </summary>
/// <returns></returns>
public SendRedPackResult SendRedPack(SendRedPackJson json)
{
CheckAccount();//检查AccountInfo的对象属性值 //加入常规的参数
WxPayData data = new WxPayData();
data.SetValue("wxappid", AccountInfo.UniteAppId);//公众账号appid
data.SetValue("mch_id", AccountInfo.MchID);//商户号
data.SetValue("nonce_str", data.GenerateNonceStr());//随机字符串
data.SetValue("send_name", AccountInfo.Name);// 红包发送者名称 //商户订单号(每个订单号必须唯一) 组成:mch_id+yyyymmdd+10位一天内不能重复的数字。
//接口根据商户订单号支持重入,如出现超时可再调用。
data.SetValue("mch_billno", data.GenerateOutTradeNo(AccountInfo.MchID)); data.SetValue("re_openid", json.re_openid);
data.SetValue("total_amount", json.total_amount);
data.SetValue("total_num", json.total_num);
data.SetValue("wishing", json.wishing);
data.SetValue("client_ip", json.client_ip);
data.SetValue("act_name", json.act_name);
data.SetValue("remark", json.remark); data.SetValue("sign", data.MakeSign(AccountInfo.PayAPIKey));//最后生成签名 var url = "https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack";
return Helper.GetPayResultWithCert<SendRedPackResult>(data, url, AccountInfo.CertPath, AccountInfo.CertPassword);
}
其中发送红包操作是需要证书的,因此需要添加对应的证书,证书是从微信的商户平台上进行下载的。
在商户后台的【API安全】项目上下载证书供我们开发环境使用。
下载证书后,在Windows环境,我们一般需要双击安装,输入所需的商户号作为密码即可。
在代码里面,我们可以使用证书类进行添加
HttpHelper helper = new HttpHelper(); helper.ClientCertificates = new X509CertificateCollection();
certPath = Path.Combine(System.Environment.CurrentDirectory, certPath);
helper.ClientCertificates.Add(new X509Certificate2(certPath, certPassword));
string response = helper.GetHtml(url, xml, true);
3、微信红包的使用结果
例如,我们在测试例子里面调用代码如下所示。
//现金红包
SendRedPackJson packJson = new SendRedPackJson()
{
act_name = "恭喜发财",
client_ip = NetworkUtil.GetIPAddress(),
remark = "企业红包",
wishing = "企业红包",
total_amount = ,
total_num = ,
re_openid = tosendOpenId //发送给用户的OpenID
};
var result = hbApi.SendRedPack(packJson);
var message = string.Format("企业发送红包:{0} {1}", result.Success ? "成功" : "失败", result.Message);
Console.WriteLine(message);
Console.WriteLine(result.ToJson());
其中的hbApi是上面接口的构造,如下代码所示。
AccountInfo accountInfo = new AccountInfo()
{
Name = this.SendName,
AppID = this.AppId,
AppSecret = this.AppSecret,
MchID = this.MchID,
PayAPIKey = this.PayAPIKey,
CertPath = this.CertPath,
CertPassword = this.CertPassword,
PayNotifyUrl = this.PayNotifyUrl
};
ILotteryApi hbApi = new LotteryApi(accountInfo);
成功调用后,我们可以在公众号的对话里面看到红包的信息结果,如下是整个红包发送及拆开的过程。
如果对这个《C#开发微信门户及应用》系列感兴趣,可以关注我的其他文章,系列随笔如下所示:
C#开发微信门户及应用(35)--微信支付之企业付款封装操作
C#开发微信门户及应用(32)--微信支付接入和API封装使用
C#开发微信门户及应用(31)--微信语义理解接口的实现和处理
C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实现
C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
C#开发微信门户及应用(21)-微信企业号的消息和事件的接收处理及解密
C#开发微信门户及应用(19)-微信企业号的消息发送(文本、图片、文件、语音、视频、图文消息等)
C#开发微信门户及应用(18)-微信企业号的通讯录管理开发之成员管理
C#开发微信门户及应用(17)-微信企业号的通讯录管理开发之部门管理
C#开发微信门户及应用(15)-微信菜单增加扫一扫、发图片、发地理位置功能
C#开发微信门户及应用(14)-在微信菜单中采用重定向获取用户数据
C#开发微信门户及应用(11)--微信菜单的多种表现方式介绍
C#开发微信门户及应用(10)--在管理系统中同步微信用户分组信息
C#开发微信门户及应用(33)--微信现金红包的封装及使用的更多相关文章
- C#开发微信门户及应用(38)--微信摇一摇红包功能
摇一摇周边红包接口是为线下商户提供的发红包功能.用户可以在商家门店等线下场所通过摇一摇周边领取商家发放的红包.我曾经在<C#开发微信门户及应用(28)--微信“摇一摇·周边”功能的使用和接口的实 ...
- C#开发微信门户及应用(37)--微信公众号标签管理功能
微信公众号,仿照企业号的思路,增加了标签管理的功能,对关注的粉丝可以设置标签管理,实现更加方便的分组管理功能.开发者可以使用用户标签管理的相关接口,实现对公众号的标签进行创建.查询.修改.删除等操作, ...
- C#开发微信门户及应用(36)--微信卡劵管理的封装操作
前面几篇介绍了微信支付方面的内容,本篇继续微信接口的一些其他方面的内容:卡劵管理.卡劵管理是微信接口里面非常复杂的一个部分,里面的接口非常多,我花了不少时间对它进行了封装处理,重构优化等等工作,卡劵在 ...
- C#开发微信门户及应用(35)--微信支付之企业付款封装操作
在前面几篇随笔,都是介绍微信支付及红包相关的内容,其实支付部分的内容还有很多,例如企业付款.公众号支付或刷卡支付.摇一摇红包.代金券等方面的内容,这些都是微信接口支持的内容,本篇继续微信支付这一主题, ...
- C#开发微信门户及应用(34)--微信裂变红包
在上篇随笔<C#开发微信门户及应用(33)--微信现金红包的封装及使用>介绍了普通现金红包的封装和使用,这种红包只能单独一次发给一个人,用户获取了红包就完成了,如果我们让用户收到红包后,可 ...
- C#开发微信门户及应用(32)--微信支付接入和API封装使用
在微信的应用上,微信支付是一个比较有用的部分,但也是比较复杂的技术要点,在微商大行其道的年代,自己的商店没有增加微信支付好像也说不过去,微信支付旨在为广大微信用户及商户提供更优质的支付服务,微信的支付 ...
- C#开发微信门户及应用(25)-微信企业号的客户端管理功能
我们知道,微信公众号和企业号都提供了一个官方的Web后台,方便我们对微信账号的配置,以及相关数据的管理功能,对于微信企业号来说,有通讯录中的组织架构管理.标签管理.人员管理.以及消息的发送等功能,其中 ...
- C#开发微信门户及应用(24)-微信小店货架信息管理
在前面微信小店系列篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及<C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试& ...
- C#开发微信门户及应用(23)-微信小店商品管理接口的封装和测试
在上篇<C#开发微信门户及应用(22)-微信小店的开发和使用>里面介绍了一些微信小店的基础知识,以及对应的对象模型,本篇继续微信小店的主题,介绍其中API接口的封装和测试使用.微信小店的相 ...
随机推荐
- 使用 Android Studio 检测内存泄漏与解决内存泄漏问题
本文在腾讯技术推文上 修改 发布. http://wetest.qq.com/lab/view/63.html?from=ads_test2_qqtips&sessionUserType=BF ...
- ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件
作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...
- 说一说python的牛比与不爽
本人写了10年php了.今年开始改写python了.不是说php有什么不好,php在自己的势力范围内还是很牛比的.只是我已经不能满足于php那两亩地了. 习惯了脚本,所以很自然就过度到python了. ...
- Linux杀死进程,查看进程
http://blog.csdn.net/wojiaopanpan/article/details/7286430/
- Android Weekly Notes Issue #236
Android Weekly Issue #236 December 18th, 2016 Android Weekly Issue #236 本期内容包括: Google的物联网平台Android ...
- Android开发学习—— shape标签的使用
参考这片文章http://www.cnblogs.com/armyfai/p/5912414.html
- gulp 自动添加版本号
本文介绍利用 gulp-rev 和 gulp-rev-collector 进行版本管理 npm官网介绍使用后的效果如下: "/css/style.css" => " ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...
- 关于HTML语义化的一些理解
语义化这个词我想大家都看到了无数次,特别是在一些招聘广告上. 其实我自己也是,不过每次看到都觉得是那些招聘公司复制的,其实他们根本说不清语义化是什么,而且也根本不看重. 所以我一直也没把这东西当回事过 ...
- 实现了一个百度首页的彩蛋——CSS3 Animation简介
在百度搜索中有这样一个彩蛋:搜索“旋转”,“跳跃”,“反转”等词语,会出现相应的动画效果(搜索“反转”后的效果).查看源码可以发现,这些效果正是通过CSS3的animation属性实现的. 实现这个彩 ...