0

0

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

php是最好的语言

php是最好的语言

发布时间:2018-08-01 11:19:08

|

6837人浏览过

|

来源于php中文网

原创

红包功能简单介绍:

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加密类:

/// /// MD5UtilHelper 的摘要说明。/// public class MD5UtilHelper
{    public MD5UtilHelper()
    {        //
        // TODO: 在此处添加构造函数逻辑
        //
    }    /// 
            /// 获取大写的MD5签名结果
    /// 
    /// 
    /// 
    /// 
    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;

        }        /// 
        /// 密钥
        /// 
        private string Key;        protected HttpContext HttpContext;        /// 
        /// 请求的参数
        /// 
        protected Hashtable Parameters;        /// 
        /// debug信息
        /// 
        private string DebugInfo;        /// 
        /// 初始化函数
        /// 
        public virtual void Init()
        {
        }        /// 
        /// 获取debug信息
        /// 
        /// 
        public String GetDebugInfo()
        {            return DebugInfo;
        }        /// 
        /// 获取密钥
        /// 
        /// 
        public string GetKey()
        {            return Key;
        }        /// 
        /// 设置密钥
        /// 
        /// 
        public void SetKey(string key)
        {            this.Key = key;
        }        /// 
        /// 设置参数值
        /// 
        /// 
        /// 
        public void SetParameter(string parameter, string parameterValue)
        {            if (parameter != null && parameter != "")
            {                if (Parameters.Contains(parameter))
                {
                    Parameters.Remove(parameter);
                }

                Parameters.Add(parameter, parameterValue);
            }
        }        /// 
        /// 创建md5摘要,规则是:按参数名称a-z排序,遇到空值的参数不参加签名
        /// 
        /// 参数名
        /// 参数值
        /// key和value通常用于填充最后一组参数
        /// 
        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;
        }        /// 
        /// 输出XML
        /// 
        /// 
        public string ParseXML()
        {
            StringBuilder sb = new StringBuilder();
            sb.Append("");            foreach (string k in Parameters.Keys)
            {                string v = (string)Parameters[k];                if (Regex.IsMatch(v, @"^[0-9.]$"))
                {

                    sb.Append("<" + k + ">" + v + "");
                }                else
                {
                    sb.Append("<" + k + ">");
                }

            }
            sb.Append("");            return sb.ToString();
        }        /// 
        /// 设置debug信息
        /// 
        /// 
        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、调用现金红包处理类:

思乐微信商城微分销系统
思乐微信商城微分销系统

思乐微信商城微分销系统是以.net+access/mssql进行开发的微信分销系统。基于微信朋友圈的传播,是打造以分销商为中心的全新微信分销体验。让粉丝实时有效的获取朋友圈流量并快速分享购买分佣。因为是基于微信,所以要在微信上体验才更好。关注我们的微信核心功能:1、自动提示用户关注微信,解决一般程序无关注微信公众号的过程2、只要通过链接进一次,不过好久注册,什么方面注册,只要是用微信注册的,都会算

下载
 /// 
 /// 企业号微信支付接口
 /// 
 public static class TenPay
 {     #region 企业向用户发红包
     /// 
     /// 用于企业向微信用户个人发红包
     /// 目前支持向指定微信用户的openid个人发红包
     /// 
     /// apiclient_cert.p12证书密码即商户号
     /// 微信支付需要post的xml数据
     /// apiclient_cert.p12的证书物理位置(例如:E:\projects\文档\微信商户平台证书\商户平台API证书
     /// 
     /// 
     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();//关闭文件访问
         }         #endregion

         HttpWebResponse 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下的openid
    packageReqHandler.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微信接口开发实战项目视频教程 聊天机器人

相关文章

微信app下载
微信app下载

微信是一款手机通信软件,支持通过手机网络发送语音短信、视频、图片和文字。微信可以单聊及群聊,还能根据地理位置找到附近的人,带给大家全新的移动沟通体验,有需要的小伙伴快来保存下载体验吧!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
php文件怎么打开
php文件怎么打开

打开php文件步骤:1、选择文本编辑器;2、在选择的文本编辑器中,创建一个新的文件,并将其保存为.php文件;3、在创建的PHP文件中,编写PHP代码;4、要在本地计算机上运行PHP文件,需要设置一个服务器环境;5、安装服务器环境后,需要将PHP文件放入服务器目录中;6、一旦将PHP文件放入服务器目录中,就可以通过浏览器来运行它。

2594

2023.09.01

php怎么取出数组的前几个元素
php怎么取出数组的前几个元素

取出php数组的前几个元素的方法有使用array_slice()函数、使用array_splice()函数、使用循环遍历、使用array_slice()函数和array_values()函数等。本专题为大家提供php数组相关的文章、下载、课程内容,供大家免费下载体验。

1622

2023.10.11

php反序列化失败怎么办
php反序列化失败怎么办

php反序列化失败的解决办法检查序列化数据。检查类定义、检查错误日志、更新PHP版本和应用安全措施等。本专题为大家提供php反序列化相关的文章、下载、课程内容,供大家免费下载体验。

1509

2023.10.11

php怎么连接mssql数据库
php怎么连接mssql数据库

连接方法:1、通过mssql_系列函数;2、通过sqlsrv_系列函数;3、通过odbc方式连接;4、通过PDO方式;5、通过COM方式连接。想了解php怎么连接mssql数据库的详细内容,可以访问下面的文章。

952

2023.10.23

php连接mssql数据库的方法
php连接mssql数据库的方法

php连接mssql数据库的方法有使用PHP的MSSQL扩展、使用PDO等。想了解更多php连接mssql数据库相关内容,可以阅读本专题下面的文章。

1417

2023.10.23

html怎么上传
html怎么上传

html通过使用HTML表单、JavaScript和PHP上传。更多关于html的问题详细请看本专题下面的文章。php中文网欢迎大家前来学习。

1234

2023.11.03

PHP出现乱码怎么解决
PHP出现乱码怎么解决

PHP出现乱码可以通过修改PHP文件头部的字符编码设置、检查PHP文件的编码格式、检查数据库连接设置和检查HTML页面的字符编码设置来解决。更多关于php乱码的问题详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1447

2023.11.09

php文件怎么在手机上打开
php文件怎么在手机上打开

php文件在手机上打开需要在手机上搭建一个能够运行php的服务器环境,并将php文件上传到服务器上。再在手机上的浏览器中输入服务器的IP地址或域名,加上php文件的路径,即可打开php文件并查看其内容。更多关于php相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

1306

2023.11.13

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

26

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP开发微信公众号平台从简到精
PHP开发微信公众号平台从简到精

共25课时 | 5.9万人学习

微信开发入门视频教程
微信开发入门视频教程

共31课时 | 7万人学习

0基础微信开发入门视频教程
0基础微信开发入门视频教程

共21课时 | 4.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号