重庆小潘seo博客

当前位置:首页 > 重庆网络营销 > 小潘杂谈 >

小潘杂谈

微信公众号开发:商户如何给用户发红包实例讲解

时间:2020-09-04 21:00:09 作者:重庆seo小潘 来源:
红包功能简单介绍: 1、商户调用接口时,通过指定发送对象以及发送金额的方式发放红包,这样的方式,允许商户灵活的应用于各种各样丰富的活动场景 2、领取到红包后,用户的资金直接进入微信零钱,避免繁复的领奖流程,带给用户微信支付原生的流畅体验 现金红

红包功能简单介绍:

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;//现金红包接口返回的xmlstring 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必须有权限对该文件夹操作的权限。

相关文章:

PHP微信公众号自动发送红包API,php公众红包api

微信公众号红包接口开发PHP开发 CA证书出错,请登陆微信支付商户平台下载证书

相关视频:

微信公众号前段-php微信接口开发实战项目视频教程 聊天机器人以上就是微信公众号开发:商户如何给用户发红包实例讲解的详细内容,更多请关注小潘博客其它相关文章!