红包功能简单介绍:

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

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

现金红包官网文档地址:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=13_1

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

官网有关详细证书的介绍:https://pay.weixin.qq.com/wiki/doc/api/tools/cash_coupon.php?chapter=4_3

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

下面是调用红包接口详细代码:1、签名的MD5加密类:

/// <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、处理参数的类:

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、调用现金红包处理类:

 /// <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();//关闭文件访问}#endregionHttpWebResponse 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、调用现金红包接口

#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下的openidpackageReqHandler.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必须有权限对该文件夹操作的权限。

公众号开发: 给用户发红包相关推荐

  1. 微信公众号开发系列之发送红包-java版本

    tips:代码我已经上传到github上了:https://github.com/sangbobo/WeChatSendRedPack 在文章的最后也推荐了一个微信java开发工具包WxJava,如果 ...

  2. 微信公众号开发 - 引导用户关注、一键关注

    1. 打开公众号,点击右上角人像图标 2. 点击查看"全部消息" 3. 点击右上角三个点的图标,然后"复制链接" 4. 获得以下链接(其中红色字体是该公众号的唯 ...

  3. 微信公众号开发--获取用户信息中文乱码的解决方案

    在微信开发中我们会经常需要获取用户的信息. 微信给我们提供了获取用户信息的api, 地址为 https://api.weixin.qq.com/cgi-bin/user/info?access_tok ...

  4. 微信公众号开发之用户分组

    具体参照微信官方文档. 创建用户分组 /*** 创建分组* @param groupName 分组名* @return Integer 分组ID*/ public static Integer cre ...

  5. java 保存微信表情_Java微信公众号开发之用户表情存储解决方案

    1.问题产生情况 我遇到这个问题是做微信开发的时候有些有用的头像用了微信的emoji表情,然而我的mysql数据库用的编码是utf8_general_ci,就是utf-8编码,结果也就报错误了. 2. ...

  6. 微信公众号开发——实现用户微信网页授权流程

  7. 微信公众号开发--自定义菜单跳转页面并获取用户信息(续)

    之前写过一篇微信公众号开发–自定义菜单跳转页面并获取用户信息 由于当时是刚学习微信公众号开发当时的思路虽然可行,不过不是最好的,最近也用到了需要获取用户信息的地方,再次整理一下. 流程 注意点 ### ...

  8. 急急急求微信公众号开发接口-php如何实现获取用户发送的微信表情,并返回一个链接,用户点击进去链接就是刚才发的表情,用户可以保存表情?

    求微信公众号开发接口-php如何实现获取用户发送的微信表情,并返回一个链接,用户点击进去链接就是刚才发的表情,用户就可以保存表情到手机? 需求描述 1.用户在公众号对话框发送微信表情(GIF) 2.公 ...

  9. 微信公众号开发获取openID以及用户详细信息,超详细步骤,亲测开发

    好久没有发过博文了,恰好这两天做了一个关于微信公众号开发的东东,拿出来和大家分享一下. 需要做一套微信签到.抽奖系统,我要在后台存储微信用户的相关信息,openIDNickname之类的信息.在开发前 ...

最新文章

  1. oracle官网能用的账号,oracle 官方登录账号Oracle的在windows下的安装及使用
  2. 我是如何阅读编程书的
  3. EOS入门指南PART6——别忙着开发,先来看看智能合约数据是怎么存的
  4. Git学习资源收集汇总
  5. 芝麻HTTP:redis-py的安装
  6. 前端学习(1736):前端系列javascript之创建webpack与loader使用
  7. mysql未指定错误_使用mysql的系统中常见sql错误
  8. 蓝桥杯 ALGO-160 算法训练 P0104
  9. Android 通过触摸动态地在屏幕上画矩形
  10. python 拼音相似度_用Python进行简单的文本相似度分析
  11. 通信基站能耗综合管理系统
  12. 马云在大学学计算机,IT大佬高考成绩单:李彦宏是状元 马云数学仅1分
  13. c语言之良好的编程习惯(四)
  14. 基于rhcs套件实现的高可用集群
  15. 如何去除 aspose.cells 水印
  16. 网络项目实施方案介绍
  17. 2023最新SSM计算机毕业设计选题大全(附源码+LW)之java庆阳红色旅游网站建设s237y
  18. Java23种设计模式之-----访问者模式
  19. matlab 机械臂动力学
  20. 试题 算法训练 礼物

热门文章

  1. 论文翻译:2000_wideband extension of telephone speech using a hidden Markov model
  2. Elasticsearch(ES)简介及基本使用
  3. matlab水印嵌入算法,一个基于dwt和hvs的数字水印算法嵌入源代码 水印嵌入不了!!!...
  4. 蝶阀技术-蝶阀试验和安装及故障排除方法
  5. 【LSTM预测】基于matlab鲸鱼算法优化双向长短时记忆BiLSTM航空发动机寿命预测 (多输入单输出)【含Matlab源码 2288期】
  6. android studo 3.0 搜狗输入法问题 终结者
  7. 你需要启用steam社区界面功能以进行购买_Steam新版游戏库界面上线,筛选游戏功能更强大...
  8. Swagger框架学习分享
  9. 【2022阿里灵犀互娱】游戏测开笔试AC_Code
  10. 三一重机遇到百度智能云,工程机械维保有了新方案