码迷,mamicode.com
首页 > 其他好文 > 详细

扫二维码关注服务号同时发现金红包

时间:2016-07-23 11:46:47      阅读:309      评论:0      收藏:0      [点我收藏+]

标签:

本文只是记录一下自己最近开发的一个小功能,方便以后查看。

一、需求原文如下:

1.vip微信参数配置

   1)是否启用

   2)设置每单最大红包金额    (例如5 )

   3)设置各类别 红包金额范围  

                     钻石    3-5

                     黄金    2-3  等等

2.质量保证单 

   打印二维码 参数传销售门店 以及销售单号

   客户扫码 

          1)自动关注服务号

          2)自动匹配客户档案

             openid 匹配到档案的增加积分以及总积分 ,

             未匹配到档案的  客户填写  姓名,手机号 如果手机号匹配到记录  自动将客户档案关联上

             手机号也未匹配到记录  自动建立档案(自动插入所属分销商id,微信openid,姓名,手机号,总积分,剩余积分  必填项添默认值)

                                             

             

          3)根据用户结果 自动关联客户消费记录

          4)根据积分规则判断消费完客户是否达成升级标准(客户等级只升不降)

          5)根据参数配置   自动发送一个红包给客户   同单多次扫描只发送一次红包.

                   红包规则  1.判断是否启用     没有启用不发送

                                   2.发送红包时 取明细条码里面 红包金额上限最大的 记录  随机生成一个金额的红包发送

                                   例如  客户购买2件货品   钻石   3-5   黄金2-3

                                         那么随机发送一个 3-5元的红包给客户

                                       (暂不考虑销退的情况)

 

 二、需求理解:简单来说就是门店下单时需要在质保单上面打印上我们的服务号二维码(二维码参数带上订单号),扫码时根据openid(客户微信号在我们的服务号唯一的标示)匹配客户表,如果之前已经存在,就根据单号和积分规则计算客户的积分,没发过红包的单就发送一个根据类别配置金额的红包给客户。如果openid没有匹配到就给个链接填写vip信息,之后发送红包和消费记录,同时计算积分。

 

三、实操

1.服务号申请 2.开通支付功能,下载证书。  3.调用带参数的二维码接口生成二维码。4.响应关注事件(判断用户身份,计算积分,发送红包等)

 

技术分享
using Common;
using CommonHelp;
using JDF.ERP.Common.Model;
using JDF.ERP.Common.WeiXin;
using JDF.ERP.CRM.BLL;
using JDF.ERP.Invoicing.BLL;
using JDF.ERP.PlatConfig.BLL;
using JDF.ERP.Style.BLL;
using LitJson;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web;
using System.Web.Http;
using System.Xml;
using JDF.ERP.Common.Tencent;
using JDF.ERP.SystemManage.BLL;
using System.IO;
using System.Security.Cryptography;
using Newtonsoft.Json;
using JDF.ERP.Sale.BLL;


namespace JDF.ERP.WebAPI.Control
{
    /// <summary>
    /// 金大福微信服务号交互响应类
    /// </summary>
    public class JDFWXServiceController : ApiController
    {
        WeiXinHelp objWeiXinHelp = new WeiXinHelp();
        WeiXinQiYeHelp objWeiXinQiYeHelp = new WeiXinQiYeHelp();

        Log objLog = new Log();
        /// <summary>
        /// 用于处理金大福服务号的交互
        /// </summary>
        /// <returns></returns>
        [HttpGet]
        [HttpPost]
        public HttpResponseMessage Service()
        {

            var response = Request.CreateResponse(HttpStatusCode.OK);

            var act = Misc.GetRequstValue("act");
            var ordersNo = Misc.GetRequstValue("no");
            //微信加密签名,signature结合了开发者填写的token参数和请求timestamp参数、nonce参数
            var signature = Misc.GetRequstValue("signature");
            var timestamp = Misc.GetRequstValue("timestamp");//时间戳
            var nonce = Misc.GetRequstValue("nonce");//随机数
            var echostr = Misc.GetRequstValue("echostr");  //随机字符串

           

            objLog.Action("微信接入验证:" + signature + "|" + timestamp + "|" + echostr);

            #region 是否是验证操作(这个只会在申请成为开发者时验证一次)
            if (!string.IsNullOrWhiteSpace(echostr))
            {

                response.Content = new StringContent(ValidateWX(signature, timestamp, nonce, echostr), Encoding.UTF8);
                return response;

            }
            #endregion

            #region 创建菜单
            if (act != null)
            {
                if (act == "create")
                {
                    //CreateMenu1("wx30c0a5c885bba30d", "dd3f65ae813d4b14c647859b91e0e776");
                    //生成带参数的二维码
                    string responseJson = objWeiXinHelp.GetQrcodeYJ("wx30c0a5c885bba30d", "dd3f65ae813d4b14c647859b91e0e776", ordersNo); //S0064216072100364 S0065916072100349  S0065516072200148 S0064216072100364  S0106216072200151
                    var DynamicObject = JsonConvert.DeserializeObject<dynamic>(responseJson);
                    string ticket = DynamicObject.ticket;
                    string path = Misc.GetPath("/images");
                    objWeiXinHelp.GetCodePic(ticket, path);

                    //发送模板消息
                    //string url = ConfigHelper.GetConfigString("OutERPURL");
                    //objWeiXinHelp.SendUserInfoAdd("okehNt44afCOnburT5b7dXHivlSc", url + "WeiXinCoustomerAdd/Index?OrderNo=" + "S12022813235758" + "&OpenID=okehNt44afCOnburT5b7dXHivlSc", "请您完善您的金大福VIP信息", "完善资料有红包哟", DateTime.Now.ToShortDateString(), "感谢您对金大福的关注!");

                    //objWeiXinHelp.FocusLike();
                    


                }
            }
            #endregion

            string postData = objWeiXinHelp.getPostInput(); //微信传过来的数据 xml格式的
            XmlDocument xmlDoc = new XmlDocument();
            if (postData != "")
            {

              
               var bOrder_S =  BOrder_S.GetInstance();//销售表
               BCusAccount bCusAccount = BCusAccount.GetInstance();//账户表
                xmlDoc.LoadXml(postData);
                XmlNode msgTypeNode = xmlDoc.ChildNodes[0].SelectSingleNode("MsgType");
                string msgType = (msgTypeNode == null ? "" : msgTypeNode.InnerText);

                XmlNode eventKeyNode = xmlDoc.ChildNodes[0].SelectSingleNode("Event");
                string eventKey = (eventKeyNode == null ? "" : eventKeyNode.InnerText);

                XmlNode orderNode = xmlDoc.ChildNodes[0].SelectSingleNode("EventKey");
                string orderNO = (orderNode == null ? "" : orderNode.InnerText);

                 
                if (msgType == "text")
                {
                    //获取用户消息
                    objLog.Action("微信接受类型是文本:" + postData);

                    //GetUserSendMsg(postData);
                }
                
                //客户扫码事件
                else if (eventKey.ToLower() == "scan" || eventKey.ToLower() == "subscribe")
                {
                     
                    //发送方帐号的openid
                    XmlNode fromUserName = xmlDoc.ChildNodes[0].SelectSingleNode("FromUserName");
                    string openId = (fromUserName == null ? "" : fromUserName.InnerText);

                    if (String.IsNullOrEmpty(orderNO))
                    {
                        return response;
                    }
                    //获取销售订单
                    var order_s = bOrder_S.GetAllByCondition(new SEOrder_S()
                    {
                        OrderNo = orderNO
                    }).FirstOrDefault();

                    if (order_s == null)
                    {
                        return response;
                    }

                    #region 验证条码是否已经被其他人扫过
                    if (order_s != null && !string.IsNullOrEmpty(order_s.SVIPNo))
                    {
                        var cust = BCustomer.GetInstance().GetAllByCondition(new SECustomer()
                        {
                            VIPNo = order_s.SVIPNo
                        }).FirstOrDefault();

                        if (cust != null)
                        {
                            if (!string.IsNullOrEmpty(cust.Cus_OpenID) && cust.Cus_OpenID != openId) //证明这个二维码已经被扫描过了,不能再次扫描
                            {
                                objWeiXinHelp.SendTextMess(openId, "本条码已扫描过了,感谢您的关注");
                                return response;
                            }
                        }


                    }
                    #endregion
 
                    
                    var coutoms = BCustomer.GetInstance().GetAllByCondition(new SECustomer()
                    {
                        Cus_OpenID = openId
                    }).FirstOrDefault();
                   
                    //本单还没有计算过积分
                    if (string.IsNullOrEmpty(order_s.SVIPNo))
                    {
                        
                        if (coutoms != null) //消费用户已经存在
                        {
                            bOrder_S.ProcessVip(orderNO, coutoms, order_s);

                            //发送消费记录
                            var agentName = BAgent.GetInstance().GetOneByKeyID(order_s.SAgentID.Value).AgentName;
                            var levelName = BCusLevel.GetInstance().GetOneByKeyID(coutoms.CusALevel.Value).CusLevelName;
                            objWeiXinHelp.SendShoppingList(openId, "", "尊敬的" + coutoms.CusName + ",您的消费信息如下:", coutoms.VIPNo, agentName, order_s.TotalRealSalePrice + "", "总积" + coutoms.CusATotalPoint + "分,会员等级为" + levelName);

                            // 发红包
                            bOrder_S.SendRedPack(orderNO, coutoms.CustomerID, openId);


                        }
                        else //根据openid不存在
                        {
                            string url = ConfigHelper.GetConfigString("OutERPURL");
                             
                            //发送一个注册身份的连接
                            objWeiXinHelp.SendUserInfoAdd(openId, url + "WeiXinCoustomerAdd/Index?OrderNo=" + orderNO + "&OpenID="+openId, "请您完善您的金大福VIP信息", "完善资料有红包哟", DateTime.Now.ToShortDateString(), "感谢您对金大福的关注!");

                        }

                    }
                    else {

                        if (coutoms==null)
                        {
                            coutoms = BCustomer.GetInstance().GetAllByCondition(new SECustomer()
                            {
                                VIPNo = order_s.SVIPNo
                            }).FirstOrDefault();

                            coutoms.Cus_OpenID = openId;
                            BCustomer.GetInstance().UpdateOne(coutoms);   //更新openid
                        }
                        //发送消费记录
                        var agentName = BAgent.GetInstance().GetOneByKeyID(order_s.SAgentID.Value).AgentName;
                        var levelName = BCusLevel.GetInstance().GetOneByKeyID(coutoms.CusALevel.Value).CusLevelName;
                        objWeiXinHelp.SendShoppingList(openId, "", "尊敬的" + coutoms.CusName + ",您的消费信息如下:", coutoms.VIPNo, agentName, order_s.TotalRealSalePrice + "", "总积" + coutoms.CusATotalPoint + "分,会员等级为" + levelName);

                        // 发红包
                        bOrder_S.SendRedPack(orderNO, coutoms.CustomerID, openId);
                       
                    }
                     
                }
                else
                {
                    objLog.Action("微信接受类型开始,指令:" + postData);
                    //获取指令
                    GetMenuClickType(postData);

                }

            }
            return response;
        }




        /// <summary>
        /// 获取用户关注事件
        /// </summary>
        public void GetSubscribe(string postData)
        {
            StringBuilder log = new StringBuilder();
            StringBuilder str = new StringBuilder();
            log.Append("====start=====");
            try
            {
                //string postData = getPostInput();
                XmlDocument xmlDoc = new XmlDocument();
                log.Append("postData:" + postData);
                //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志3 有人关注了", postData.ToString());
                if (postData != "")
                {
                    log.Append(postData);
                    xmlDoc.LoadXml(postData);
                    XmlNode toUserNameNode = xmlDoc.ChildNodes[0].SelectSingleNode("ToUserName");
                    XmlNode fromUserNameNode = xmlDoc.ChildNodes[0].SelectSingleNode("FromUserName");
                    XmlNode eventKeyNode = xmlDoc.ChildNodes[0].SelectSingleNode("Event");
                    string toUserName = toUserNameNode.InnerText;
                    string fromUserName = fromUserNameNode.InnerText;
                    string eventKey = eventKeyNode.InnerText;
                    string url = "";
                    string fromWxID = fromUserName;

                    //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志4", eventKey);


                    if (eventKey == "subscribe")
                    {
                        string responseJson = objWeiXinHelp.GetQrcodeYJ("wx30c0a5c885bba30d", "dd3f65ae813d4b14c647859b91e0e776", "S12022813235758");
                        xmlDoc.LoadXml(postData);

                        var DynamicObject = JsonConvert.DeserializeObject<dynamic>(responseJson);
                        string ticket = DynamicObject.ticket;

                        str.Append("<xml>");
                        str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                        str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                        str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                        str.Append("<MsgType><![CDATA[text]]></MsgType>");
                        str.Append("<Content><![CDATA[感谢关注金大福官方公众号。\r\n 1、点击屏幕右上角菜单→查看历史消息,查看金大福最近资讯 \r\n 2、屏幕下方菜单体验客户关怀 \r\n 更多金大福最新资讯,请随时订阅查看]]></Content>");
                        str.Append("</xml>");
                    }
                }
            }
            catch (Exception ex)
            {
                log.Append(ex.ToString());
            }
            finally
            {
                //Common.PageValidate.WriteFile(log.ToString());
                //response.Write(str.ToString());
            }
        }

        /// <summary>
        /// 创建单个菜单
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <returns></returns>
        public bool CreateMenu1(string appId, string appSecret)
        {
            var result = false;
            try
            {
                string access_token = objWeiXinHelp.GetAccess_token(appId, appSecret);
                string url = "https://api.weixin.qq.com/cgi-bin/menu/create?access_token=" + access_token + "";
                StringBuilder menuData = new StringBuilder();
                menuData.Append("{");
                menuData.Append("     \"button\":[");
                menuData.Append("     {    ");
                menuData.Append("          \"type\":\"view\",");
                menuData.Append("          \"name\":\"珠宝商城\",");
                menuData.Append("          \"url\":\"http://m.weigouyi.com/160322095509642770.html?fxshopid=160419233546048481\"");
                menuData.Append("      },");
                menuData.Append("      {");
                menuData.Append("           \"name\":\"个人中心\",");
                menuData.Append("                        \"sub_button\":[");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"view\",");
                menuData.Append("                           \"name\":\"会员注册\",");
                menuData.Append("                           \"url\":\"http://p.weigouyi.com/m/Login.shtml?comid=160322095509642770&lu=http%3a%2f%2fi.weigouyi.com%2fdefault.aspx%3fcomid%3d160322095509642770\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"店铺绑定\",");
                menuData.Append("                           \"key\":\"dpbd\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"金大福18周年庆\",");
                menuData.Append("                           \"key\":\"ktf\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"售后服务\",");
                menuData.Append("                           \"key\":\"tswq\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"投诉维权\",");
                menuData.Append("                           \"key\":\"tswq2\"");
                menuData.Append("                        }]");
                menuData.Append("      },");
                menuData.Append("      {");
                menuData.Append("           \"name\":\"品牌速递\",");
                menuData.Append("                        \"sub_button\":[");
                menuData.Append("                       {    ");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"品牌介绍\",");
                menuData.Append("                           \"key\":\"ppjs\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"联系我们\",");
                menuData.Append("                           \"key\":\"lxwm\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"新品抢鲜\",");
                menuData.Append("                            \"key\":\"xpqx\"");
                menuData.Append("                        },");
                menuData.Append("                        {");
                menuData.Append("                           \"type\":\"click\",");
                menuData.Append("                           \"name\":\"火热活动\",");
                menuData.Append("                           \"key\":\"hrhd\"");
                menuData.Append("                        },");
                //menuData.Append("                        {");
                //menuData.Append("                           \"type\":\"click\",");
                //menuData.Append("                           \"name\":\"现场摇一摇\",");
                //menuData.Append("                           \"key\":\"xcyj\"");
                //menuData.Append("                        }]");
                menuData.Append("      }]");
                menuData.Append(" }");
                string res = objWeiXinHelp.postResponse(url, menuData.ToString());
                JsonData jd = JsonMapper.ToObject(res);
                if (jd["errcode"] != null)
                {
                    if (jd["errcode"].ToString() == "0")
                    {
                        result = true;

                    }
                    else
                    {
                        objLog.Action(jd["errcode"].ToString());
                    }
                }
            }
            catch
            { }
            return result;
            //response.Write(access_token);
        }



        /// <summary>
        /// 获取菜单点击事件
        /// </summary>
        /// <param name="appId"></param>
        /// <param name="appSecret"></param>
        /// <returns></returns>
        public void GetMenuClickType(string postData)
        {
            StringBuilder log = new StringBuilder();
            StringBuilder str = new StringBuilder();
            log.Append("====start=====");
            try
            {

                XmlDocument xmlDoc = new XmlDocument();
                //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志5", postData);

                if (postData != "")
                {
                    log.Append(postData);
                    xmlDoc.LoadXml(postData);
                    XmlNode toUserNameNode = xmlDoc.ChildNodes[0].SelectSingleNode("ToUserName");
                    XmlNode fromUserNameNode = xmlDoc.ChildNodes[0].SelectSingleNode("FromUserName");
                    XmlNode eventKeyNode = xmlDoc.ChildNodes[0].SelectSingleNode("EventKey");
                    string toUserName = toUserNameNode.InnerText;
                    string fromUserName = fromUserNameNode.InnerText;
                    string eventKey = eventKeyNode.InnerText;
                    log.Append(eventKey);
                    string url = "";
                    string fromWxID = fromUserName;

                    //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志6", eventKey);

                    switch (eventKey.Trim())
                    {
                        case "zbsc"://珠宝商城
                            string indexUrl = url;
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【珠宝商城】珠宝雕刻时光 微店拉近你我]]></Title>");
                            str.Append("<Description><![CDATA[功能开发中,敬请期待...]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://wxs.zhubaoq.com/jdf/zbsc.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");
                            break;
                        case "tswq"://售后服务
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[text]]></MsgType>");
                            str.Append("<Content><![CDATA[尊敬的用户:如果您对我们网站的商品及服务有任何的投诉与建议,请您联系我们的客服人员,我们将竭诚为您服务,为此给您带来的不便请您原谅。客服热线:4008-826-068 ;客服邮箱:planning@mailking.com.cn]]></Content>");
                            str.Append("</xml>");
                            break;
                        case "wddd"://我的订单
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【我的订单】敬备香茗 恭候亲临]]></Title>");
                            str.Append("<Description><![CDATA[功能开发中,敬请期待...]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://wxs.zhubaoq.com/jdf/wddd.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");
                            break;
                        case "fjmd"://附近门店
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【附近门店】传承发展 人文为本]]></Title>");
                            str.Append("<Description><![CDATA[功能开发中,敬请期待...]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://wxs.zhubaoq.com/jdf/fjmd.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");
                            break;
                        case "tswq2"://投诉维权
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【投诉维权】传承发展 人文为本]]></Title>");
                            str.Append("<Description><![CDATA[功能开发中,敬请期待...]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://wxs.zhubaoq.com/jdf/tswq.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");
                            break;
                        case "ppjs"://品牌介绍
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【品牌介绍】卓金品质 福享天成]]></Title>");
                            str.Append("<Description><![CDATA[金大福珠宝有限公司成立于1997年6月10日,是专业从事黄金、K金、铂金、钻石、翡翠及其它珠宝饰品的生产、加工、批发、零售及进出口业务的大型珠宝专业公司。...]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://120.24.182.226:81/images/ppjs.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[http://120.24.182.226:81/brand_introduce.html]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");
                            break;
                        case "lxwm"://联系我们
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[text]]></MsgType>");
                            str.Append("<Content><![CDATA[电话/TEL:0755-25195222  传真/FAX:0755-25195386 电邮/E-MAIL:KingTaiFook@mailking.com.cn 邮编/P.C:518001 售后服务电话:400-882-6068 联系地址:深圳市罗湖区国贸商业大厦28-30楼]]></Content>");
                            str.Append("</xml>");
                            break;
                        case "xpqx"://新品抢鲜
                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【新品抢鲜】璀璨星空 闪耀梦想]]></Title>");
                            str.Append("<Description><![CDATA[金大福珠宝有限公司成立于1997年6月10日,是专业从事黄金、K金、铂金、钻石、翡翠及其它珠宝饰品的生产、加工、批发、零售及进出口业务的大型珠宝专业公司。...]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://120.24.182.226:81/images/xpqx.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[http://120.24.182.226:81/brand_new.html]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");

                            break;
                        case "hrhd"://火热活动

                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[news]]></MsgType>");
                            str.Append("<ArticleCount>1</ArticleCount>");
                            str.Append("<Articles>");
                            str.Append("<item>");
                            str.Append("<Title><![CDATA[【火热活动】寻找星空使者]]></Title>");
                            str.Append("<Description><![CDATA[一个来自“星空”的呼唤!圣诞夜,让我们相约金大福!]]></Description>");
                            str.Append("<PicUrl><![CDATA[http://120.24.182.226:81/images/hotActive1.jpg]]></PicUrl>");
                            str.Append("<Url><![CDATA[http://120.24.182.226:81/hotActicve.html]]></Url>");
                            str.Append("</item>");
                            str.Append("</Articles>");
                            str.Append("</xml>");


                            break;
                        case "dpbd"://店铺绑定

                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[text]]></MsgType>");
                            str.Append("<Content><![CDATA[请输入您要绑定的微信号:格式为:【dpbd微信号】;此功能目前提供给门店管理员使用!]]></Content>");
                            str.Append("</xml>");
                            break;
                        case "ktf"://16周庆典

                            str.Append("<xml>");
                            str.Append("<ToUserName><![CDATA[" + fromUserName + "]]></ToUserName>");
                            str.Append("<FromUserName><![CDATA[" + toUserName + "]]></FromUserName>");
                            str.Append("<CreateTime>" + CDtoInt(DateTime.Now) + "</CreateTime>");
                            str.Append("<MsgType><![CDATA[text]]></MsgType>");
                            str.Append("<Content><![CDATA[请输入您要绑定的微信号或者手机号:格式为:【ktf微信号或者ktf手机号】;此功能目前提供给特约嘉宾使用!]]></Content>");
                            str.Append("</xml>");
                            break;
                    }
                    log.Append(str);

                }
            }
            catch (Exception ex)
            {
                log.Append(ex.ToString());
                objLog.Action(log.ToString());
            }
            finally
            {

                //response.Write(str.ToString());
            }

        }

        /// <summary>
        /// DateTime时间格式转换为Unix时间戳格式
        /// </summary>
        /// <param name="time"></param>
        /// <returns></returns>
        public int CDtoInt(System.DateTime time)
        {
            System.DateTime startTime = TimeZone.CurrentTimeZone.ToLocalTime(new System.DateTime(1970, 1, 1));
            return (int)(time - startTime).TotalSeconds;
        }

        /// <summary>
        /// 微信接入验证
        /// </summary>
        public string ValidateWX(string signature, string timestamp, string nonce, string echostr)
        {
            string token = "tokentest";
            if (!String.IsNullOrWhiteSpace(signature) && !String.IsNullOrWhiteSpace(timestamp) && !String.IsNullOrWhiteSpace(nonce) && !String.IsNullOrWhiteSpace(echostr))
            {
                objLog.Action(signature + "|" + timestamp + "|" + nonce + "|" + echostr);

                string[] ArrTmp = { token, timestamp, nonce };
                Array.Sort(ArrTmp);   //字典排序
                string tmpStr = string.Join("", ArrTmp);
                tmpStr = SHA1_Encrypt(tmpStr); //
                tmpStr = tmpStr.ToLower();
                objLog.Action(tmpStr + "|" + signature);
                if (tmpStr == signature)
                {
                    return echostr;
                }
                else
                {
                    return echostr;
                }
            }
            return echostr;
        }

        /// <summary>
        /// 对字符串进行SHA1加密
        /// </summary>
        /// <param name="strIN">需要加密的字符串</param>
        /// <returns>密文</returns>
        public string SHA1_Encrypt(string Source_String)
        {
            byte[] StrRes = Encoding.Default.GetBytes(Source_String);
            HashAlgorithm iSHA = new SHA1CryptoServiceProvider();
            StrRes = iSHA.ComputeHash(StrRes);
            StringBuilder EnText = new StringBuilder();
            foreach (byte iByte in StrRes)
            {
                EnText.AppendFormat("{0:x2}", iByte);
            }
            return EnText.ToString();
        }
 
    }
}
服务号响应
技术分享
  1 using Common;
  2 using LitJson;
  3 using System;
  4 using System.Collections.Generic;
  5 using System.Configuration;
  6 using System.IO;
  7 using System.Linq;
  8 using System.Net;
  9 using System.Security.Cryptography;
 10 using System.Security.Cryptography.X509Certificates;
 11 using System.Text;
 12 using System.Threading.Tasks;
 13 using System.Web;
 14 
 15 namespace JDF.ERP.Common.WeiXin
 16 {
 17     public class WeiXinHelp
 18     {
 19 
 20 
 21         /// <summary>
 22         /// 获取Access_token
 23         /// </summary>
 24         /// <param name="appId"></param>
 25         /// <param name="appSecret"></param>
 26         /// <returns></returns>
 27         public string GetAccess_token(string appId, string appSecret)
 28         {
 29             string str = "";
 30             string url = string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", HttpContext.Current.Server.UrlPathEncode(appId.Trim()).Replace("%e2%80%8b", ""), HttpContext.Current.Server.UrlPathEncode(appSecret.Trim()).Replace("%e2%80%8b", ""));
 31             string res = getResponse(url);
 32             JsonData jd = JsonMapper.ToObject(res);
 33             if (jd["access_token"] != null)
 34             {
 35                 str = jd["access_token"].ToString();
 36             }
 37             return str;
 38         }
 39 
 40          /// <summary>
 41         /// 微信发送补全用户资料提醒
 42          /// </summary>
 43          /// <param name="ToOpenID">openid</param>
 44          /// <param name="LinkURL">连接</param>
 45          /// <param name="TopMess">标题</param>
 46          /// <param name="Code">补充内容</param>
 47          /// <param name="SendTime">时间</param>
 48          /// <param name="Memark">备注</param>
 49          /// <returns></returns>
 50         public string SendUserInfoAdd(string ToOpenID, string LinkURL, string TopMess, string Code, string SendTime, string Memark)
 51         {
 52             WeiXinQiYeHelp objWeiXinQiYeHelp = new WeiXinQiYeHelp();
 53             //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志17", "openId:" + LinkURL + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
 54 
 55             string TemplateID = "tPzeIFp_tv7SD936k39s66-5iGeLbZ1084faTDk6gW4";
 56             string[] appID_appsecret = ConfigHelper.GetConfigString("appID_appsecret").Split(ζ);
 57             string Token = GetAccess_token(appID_appsecret[0], appID_appsecret[1]);
 58 
 59             //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志18", "openId:" + Token + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
 60             string postData = "{ \"touser\":\"" + ToOpenID + "\","
 61                                + "\"template_id\":\"" + TemplateID + "\",";
 62             if (!string.IsNullOrEmpty(LinkURL))
 63             {
 64                 postData += "\"url\":\"" + LinkURL + "\",";
 65             }
 66             postData += "\"topcolor\":\"#FF0000\","
 67             + "\"data\":{" +
 68             "\"first\":{\"value\":\"" + TopMess + "\"}," +
 69             "\"keyword1\":{\"value\":\"" + Code + "\"}," +
 70             "\"keyword2\":{\"value\":\"" + SendTime + "\"}," +
 71             "\"remark\":{\"value\":\"" + Memark + "\"}"
 72             + "}"
 73             + "}";
 74 
 75             //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志19", "openId:" + postData + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
 76             string ReturnMess = postResponse("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + Token, postData);
 77             //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志20", "openId:" + ReturnMess + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
 78             return ReturnMess;
 79         }
 80 
 81 
 82          /// <summary>
 83          /// 发送vip消费信息
 84          /// </summary>
 85          /// <param name="ToOpenID"></param>
 86          /// <param name="LinkURL"></param>
 87          /// <param name="first"></param>
 88          /// <param name="keyword1"></param>
 89          /// <param name="keyword2"></param>
 90          /// <param name="keyword3"></param>
 91          /// <param name="Memark"></param>
 92          /// <returns></returns>
 93         public string SendShoppingList(string ToOpenID, string LinkURL, string first, string keyword1, string keyword2, string keyword3, string Memark)
 94         {
 95             
 96             WeiXinQiYeHelp objWeiXinQiYeHelp = new WeiXinQiYeHelp(); 
 97             string TemplateID = "b3tZ5g5QWOVIapv8qa7sdm4QQSDh1h3_NOi6LDgUGkU";
 98             string[] appID_appsecret = ConfigHelper.GetConfigString("appID_appsecret").Split(ζ);
 99             string Token = GetAccess_token(appID_appsecret[0], appID_appsecret[1]);
100 
101             
102             string postData = "{ \"touser\":\"" + ToOpenID + "\","
103                                + "\"template_id\":\"" + TemplateID + "\",";
104             if (!string.IsNullOrEmpty(LinkURL))
105             {
106                 postData += "\"url\":\"" + LinkURL + "\",";
107             }
108             postData += "\"topcolor\":\"#FF0000\","
109             + "\"data\":{" +
110             "\"first\":{\"value\":\"" + first + "\"}," +
111             "\"keyword1\":{\"value\":\"" + keyword1 + "\"}," +
112             "\"keyword2\":{\"value\":\"" + keyword2 + "\"}," +
113              "\"keyword3\":{\"value\":\"" + keyword3 + "\"}," +
114             "\"remark\":{\"value\":\"" + Memark + "\"}"
115             + "}"
116             + "}";
117 
118             //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志19", "openId:" + postData + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
119             string ReturnMess = postResponse("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + Token, postData);
120             //objWeiXinQiYeHelp.SendNewMess("4289", "", "错误日志20", "openId:" + ReturnMess + "|" + DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss"));
121             return ReturnMess;
122 
123 
124         }
125         /// <summary>
126         /// 发送微信文本消息
127         /// </summary>
128         /// <param name="ToOpenID">接收用户ID</param>
129         /// <param name="Mess">发送内容</param>
130         /// <returns></returns>
131         public string SendTextMess(string ToOpenID, string Mess)
132         {
133             //appIDζappsecret
134             string[] appID_appsecret = ConfigHelper.GetConfigString("appID_appsecret").Split(ζ);
135             string Token = GetAccess_token(appID_appsecret[0], appID_appsecret[1]);
136             string postData = "{\"touser\":\"" + ToOpenID + "\",\"msgtype\":\"text\",\"text\":{\"content\":\"" + Mess + "\"}}";
137             string ReturnMess = postResponse("https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token=" + Token, postData);
138             return ReturnMess;
139         }
140 
141         /// <summary>
142         /// 发送验证码消息
143         /// </summary>
144         /// <param name="ToOpenID"></param>
145         /// <param name="LinkURL"></param>
146         /// <param name="TopMess"></param>
147         /// <param name="Code"></param>
148         /// <param name="SendTime"></param>
149         /// <param name="Memark"></param>
150         /// <returns></returns>
151         public string SendTemplateMess1(string ToOpenID, string LinkURL, string TopMess, string Code, string SendTime, string Memark)
152         {
153             string TemplateID = "hDEyGOgszHwAKnVAjS_O9Kndv3YBsOaTINM3Y-kmJVM";
154             string[] appID_appsecret = ConfigHelper.GetConfigString("appID_appsecret").Split(ζ);
155             string Token = GetAccess_token(appID_appsecret[0], appID_appsecret[1]);
156             string postData = "{ \"touser\":\"" + ToOpenID + "\","
157                                + "\"template_id\":\"" + TemplateID + "\",";
158             if (!string.IsNullOrEmpty(LinkURL))
159             {
160                 postData += "\"url\":\"" + LinkURL + "\",";
161             }
162             postData += "\"topcolor\":\"#FF0000\","
163             + "\"data\":{" +
164             "\"first\":{\"value\":\"" + TopMess + "\"}," +
165             "\"keyword1\":{\"value\":\"" + Code + "\"}," +
166             "\"keyword2\":{\"value\":\"" + SendTime + "\"}," +
167             "\"remark\":{\"value\":\"" + Memark + "\"}"
168             + "}"
169             + "}";
170             string ReturnMess = postResponse("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + Token, postData);
171             return ReturnMess;
172         }
173         /// <summary>
174         /// 接收post数据
175         /// </summary>
176         /// <returns></returns>
177         public T getPostInput<T>(T obj)
178         {
179             StringBuilder log = new StringBuilder();
180             string res = "";
181             try
182             {
183                 System.IO.Stream s = HttpContext.Current.Request.InputStream;
184                 int count = 0;
185                 byte[] buffer = new byte[10240];
186                 StringBuilder builder = new StringBuilder();
187                 while ((count = s.Read(buffer, 0, 10240)) > 0)
188                 {
189                     builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
190                 }
191                 s.Flush();
192                 s.Close();
193                 s.Dispose();
194                 log.Append("微信返回的消息:" + builder);
195                 res = builder.ToString();
196                 obj = JSONHelper.JsonStrToT<T>(res);
197                 return obj;
198             }
199             catch (Exception ex)
200             {
201                 log.Append("ex:" + ex.ToString());
202 
203                 return obj;
204             }
205             finally
206             {
207                 //Common.PageValidate.WriteFile(log.ToString());
208             }
209         }
210         /// <summary>
211         /// 发送日结消息
212         /// </summary>
213         /// <param name="ToOpenID"></param>
214         /// <param name="LinkURL"></param>
215         /// <param name="TopMess"></param>
216         /// <param name="Code"></param>
217         /// <param name="SendTime"></param>
218         /// <param name="Memark"></param>
219         /// <returns></returns>
220         public string SendTemplateMess2(string ToOpenID, string LinkURL, string first, string keyword1, string keyword2, string remark)
221         {
222             string TemplateID = "XPV1mNWCN9Jx-wHWDf8Vjw9gbxZ0wcpMRl25TlSAD8U";
223             string[] appID_appsecret = ConfigHelper.GetConfigString("appID_appsecret").Split(ζ);
224             string Token = GetAccess_token(appID_appsecret[0], appID_appsecret[1]);
225             string postData = "{ \"touser\":\"" + ToOpenID + "\","
226                                + "\"template_id\":\"" + TemplateID + "\",";
227             if (!string.IsNullOrEmpty(LinkURL))
228             {
229                 postData += "\"url\":\"" + LinkURL + "\",";
230             }
231             postData += "\"topcolor\":\"#FF0000\","
232             + "\"data\":{" +
233             "\"first\":{\"value\":\"" + first + "\"}," +
234             "\"keyword1\":{\"value\":\"" + keyword1 + "\"}," +
235             "\"keyword2\":{\"value\":\"" + keyword2 + "\"}," +
236             "\"remark\":{\"value\":\"" + remark + "\"}"
237             + "}"
238             + "}";
239             string ReturnMess = postResponse("https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" + Token, postData);
240             return ReturnMess;
241         }
242 
243 
244 
245         /// <summary>
246         /// 接收post数据
247         /// </summary>
248         /// <returns></returns>
249         public string getPostInput()
250         {
251             StringBuilder log = new StringBuilder();
252             string res = "";
253             try
254             {
255                 System.IO.Stream s = HttpContext.Current.Request.InputStream;
256                 int count = 0;
257                 byte[] buffer = new byte[10240];
258                 StringBuilder builder = new StringBuilder();
259                 while ((count = s.Read(buffer, 0, 10240)) > 0)
260                 {
261                     builder.Append(Encoding.UTF8.GetString(buffer, 0, count));
262                 }
263                 s.Flush();
264                 s.Close();
265                 s.Dispose();
266                 log.Append("微信返回的消息:" + builder);
267                 res = builder.ToString();
268                 return res;
269             }
270             catch (Exception ex)
271             {
272                 log.Append("ex:" + ex.ToString());
273                 return "";
274             }
275             finally
276             {
277                 //Common.PageValidate.WriteFile(log.ToString());
278             }
279         }
280 
281         /// <summary>
282         /// post请求
283         /// </summary>
284         /// <param name="url"></param>
285         /// <returns></returns>
286         public string postResponse(string url, string postData)
287         {
288             try
289             {
290                 byte[] b = System.Text.Encoding.UTF8.GetBytes(postData);
291                 StringBuilder content = new StringBuilder();
292                 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
293                 request.Method = "Post";
294                 request.ContentLength = b.Length;
295                 using (Stream stream = request.GetRequestStream())
296                 {
297                     stream.Write(b, 0, b.Length);
298                 }
299                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
300                 Stream responseStream = response.GetResponseStream();
301                 StreamReader sReader = new StreamReader(responseStream);
302                 Char[] sReaderBuffer = new Char[2560];
303                 int count = sReader.Read(sReaderBuffer, 0, 2560);
304                 while (count > 0)
305                 {
306                     String tempStr = new String(sReaderBuffer, 0, count);
307                     content.Append(tempStr);
308                     count = sReader.Read(sReaderBuffer, 0, 2560);
309                 }
310                 sReader.Close();
311                 return content.ToString();
312             }
313             catch
314             {
315                 return "";
316             }
317         }
318 
319         /// <summary>
320         /// get请求
321         /// </summary>
322         /// <param name="url"></param>
323         /// <returns></returns>
324         public string getResponse(string url)
325         {
326             try
327             {
328                 StringBuilder content = new StringBuilder();
329                 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
330                 request.Method = "GET";
331                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
332                 Stream responseStream = response.GetResponseStream();
333                 StreamReader sReader = new StreamReader(responseStream, Encoding.GetEncoding("utf-8"));
334                 Char[] sReaderBuffer = new Char[2560];
335                 int count = sReader.Read(sReaderBuffer, 0, 2560);
336                 while (count > 0)
337                 {
338                     String tempStr = new String(sReaderBuffer, 0, count);
339                     content.Append(tempStr);
340                     count = sReader.Read(sReaderBuffer, 0, 2560);
341                 }
342                 sReader.Close();
343                 return content.ToString();
344             }
345             catch
346             {
347                 return "";
348             }
349         }
350 
351 
352         /// <summary>
353         /// post请求
354         /// </summary>
355         /// <param name="url"></param>
356         /// <returns></returns>
357         public string postResponse<T>(string url, T obj)
358         {
359             try
360             {
361                 string postData = JSONHelper.ToJSON(obj);
362                 byte[] b = System.Text.Encoding.UTF8.GetBytes(postData);
363                 StringBuilder content = new StringBuilder();
364                 HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
365                 request.Method = "Post";
366                 request.ContentLength = b.Length;
367                 using (Stream stream = request.GetRequestStream())
368                 {
369                     stream.Write(b, 0, b.Length);
370                 }
371                 HttpWebResponse response = (HttpWebResponse)request.GetResponse();
372                 Stream responseStream = response.GetResponseStream();
373                 StreamReader sReader = new StreamReader(responseStream);
374                 Char[] sReaderBuffer = new Char[2560];
375                 int count = sReader.Read(sReaderBuffer, 0, 2560);
376                 while (count > 0)
377                 {
378                     String tempStr = new String(sReaderBuffer, 0, count);
379                     content.Append(tempStr);
380                     count = sReader.Read(sReaderBuffer, 0, 2560);
381                 }
382                 sReader.Close();
383                 return content.ToString();
384             }
385             catch
386             {
387                 return "";
388             }
389         }
390 
391 
392         /// <summary>
393         /// 调用微信接口获取带参数永久二维码的ticket
394         /// </summary>
395         /// <param name="appid"></param>
396         /// <param name="appsecret"></param>
397         /// <param name="orderNo"></param>
398         /// <returns></returns>
399         public string GetQrcodeYJ(string appid, string appsecret, string orderNo)
400         {
401             string QrcodeUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}";//WxQrcodeAPI接口
402             string AccessToken = GetAccess_token(appid, appsecret);//拉取AccessToken
403             QrcodeUrl = string.Format(QrcodeUrl, AccessToken);
404             string PostJson ="{\"action_name\": \"QR_LIMIT_STR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": \""+orderNo+"\"}}}";  
405             string ReText = postResponse(QrcodeUrl, PostJson);//post提交
406             return ReText;
407         }
408 
409         /// 
410 
411         /// 调用微信接口获取带参数临时二维码的ticket
412         /// 使用方法:https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=TICKET 
413         ///二维码带的参数
414         /// json:ticket:换取二维码的凭证,expire_seconds:凭证有效时间,url:二维码解析后的地址。此处返回ticket 否则返回错误码
415         public string GetQrcode(string appid, string appsecret, string scene_str)
416         {
417             string QrcodeUrl = "https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token={0}";//WxQrcodeAPI接口
418             string AccessToken = GetAccess_token(appid, appsecret);//拉取AccessToken
419             QrcodeUrl = string.Format(QrcodeUrl, AccessToken);
420             string PostJson = "{\"expire_seconds\": 1800, \"action_name\": \"QR_SCENE\", \"action_info\": {\"scene\": {\"scene_str\": " + scene_str + "}}}";
421             string ReText = postResponse(QrcodeUrl, PostJson);//此处省略了 WebRequestPostOrGet即为WebHttpRequest发送Post请求
422             return ReText;
423         }
424 
425 
426         /// <summary>
427         /// 获取微信带参数的二维码图片
428         /// </summary>
429         /// <param name="ticket"></param>
430         /// <param name="saveSrc">要保存的地址</param>
431         /// <returns></returns>
432         public bool GetCodePic(string ticket,string saveSrc)
433         {
434             string QrcodeUrl = "https://mp.weixin.qq.com/cgi-bin/showqrcode?ticket=" + ticket;//WxQrcodeAPI接口
435             return ImageAction.DownloadPicture(QrcodeUrl, saveSrc);
436             
437         }
438 
439         /// <summary>
440         /// 获取随机数
441         /// </summary>
442         /// <param name="min"></param>
443         /// <param name="max"></param>
444         /// <returns></returns>
445         public static int GetRandNum(int min, int max)
446         {
447             Random r = new Random(Guid.NewGuid().GetHashCode());
448             return r.Next(min, max);
449         }
450 
451         #region 微信红包相关
452 
453         /// <summary>
454         /// 调用微信支付接口前处理数据,包括sign验证等
455         /// </summary>
456         /// <param name="payForWeiXin"></param>
457         /// <returns></returns>
458         public string DoDataForPayWeiXin(PayWeiXin payForWeiXin)
459         {
460             #region 处理nonce_str随机字符串,不长于 32 位(本程序生成长度为16位的)
461             string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
462             payForWeiXin.nonce_str = RandomStr(str, 16);
463             #endregion
464 
465             #region 商户信息从config文件中读取
466             //商户支付密钥key
467             string key = ConfigurationManager.AppSettings["OwnerKey"].ToString();
468             //商户号
469             payForWeiXin.mch_id = ConfigurationManager.AppSettings["mch_id"].ToString();
470             //商户 appid 
471             payForWeiXin.wxappid = ConfigurationManager.AppSettings["wxappid"].ToString();  
472             //红包収送者名称 
473             payForWeiXin.send_name = ConfigurationManager.AppSettings["send_name"].ToString();
474             //红包収放总人数
475             payForWeiXin.total_num = int.Parse(ConfigurationManager.AppSettings["total_num"].ToString());
476             //红包祝福诧
477             payForWeiXin.wishing = ConfigurationManager.AppSettings["wishing"].ToString();
478             //活劢名称 
479             payForWeiXin.act_name = ConfigurationManager.AppSettings["act_name"].ToString();
480             //备注信息 
481             payForWeiXin.remark = ConfigurationManager.AppSettings["remark"].ToString();
482             
483             //调用接口的机器 Ip 地址
484             payForWeiXin.client_ip = ConfigurationManager.AppSettings["client_ip"].ToString();
485             #endregion
486 
487             #region 订单信息
488             //生成订单号组成: mch_id+yyyymmdd+10 位一天内不能重复的数字
489             //生成10位不重复的数字
490             string num = "0123456789";
491             string randomNum = RandomStr(num, 10);
492             payForWeiXin.mch_billno = payForWeiXin.mch_billno + System.DateTime.Now.ToString("yyyyMMdd") + randomNum;
493             #endregion
494 
495             string postData = @"<xml> 
496                                  <mch_billno>{0}</mch_billno> 
497                                  <mch_id>{1}</mch_id> 
498                                  <wxappid>{2}</wxappid> 
499                                  <send_name>{3}</send_name> 
500                                  <re_openid>{4}</re_openid> 
501                                  <total_amount>{5}</total_amount> 
502                                  <total_num>{6}</total_num> 
503                                  <wishing>{7}</wishing> 
504                                  <client_ip>{8}</client_ip> 
505                                  <act_name>{9}</act_name> 
506                                  <remark>{10}</remark>
507                                  <nonce_str>{11}</nonce_str>";
508             postData = string.Format(postData,
509                                             payForWeiXin.mch_billno,
510                                             payForWeiXin.mch_id,
511                                             payForWeiXin.wxappid, 
512                                             payForWeiXin.send_name,
513                                             payForWeiXin.re_openid,
514                                             payForWeiXin.total_amount, 
515                                             payForWeiXin.total_num,
516                                             payForWeiXin.wishing,
517                                             payForWeiXin.client_ip,
518                                             payForWeiXin.act_name, 
519                                             payForWeiXin.remark,
520                                             payForWeiXin.nonce_str
521                                 );
522 
523 
524             //原始传入参数
525             string[] signTemp = { "mch_billno=" + payForWeiXin.mch_billno, "mch_id=" + payForWeiXin.mch_id, "wxappid=" + payForWeiXin.wxappid,  "send_name=" + payForWeiXin.send_name, "re_openid=" + payForWeiXin.re_openid, "total_amount=" + payForWeiXin.total_amount,   "total_num=" + payForWeiXin.total_num, "wishing=" + payForWeiXin.wishing, "client_ip=" + payForWeiXin.client_ip, "act_name=" + payForWeiXin.act_name,"remark=" + payForWeiXin.remark, "nonce_str=" + payForWeiXin.nonce_str };
526 
527             List<string> signList = signTemp.ToList();
528              
529             #region 处理支付签名
530             //对signList按照ASCII码从小到大的顺序排序
531             signList.Sort();
532 
533             string signOld = string.Empty;
534             string payForWeiXinOld = string.Empty;
535             int i = 0;
536             foreach (string temp in signList)
537             {
538                 signOld += temp + "&";
539                 i++;
540             }
541             signOld = signOld.Substring(0, signOld.Length - 1);
542             //拼接Key
543             signOld += "&key=" + key;
544             //处理支付签名
545             payForWeiXin.sign = Encrypt(signOld).ToUpper();
546             #endregion
547             postData += "<sign>{0}</sign></xml>";
548             postData = string.Format(postData, payForWeiXin.sign);
549             return postData;
550         }
551 
552 
553 
554         public string RandomStr(string str, int Length)
555         {
556             string result = string.Empty;
557             Random rd = new Random();
558             for (int i = 0; i < Length; i++)
559             {
560                 result += str[rd.Next(str.Length)];
561             }
562             return result;
563         }
564 
565         /// <summary>
566         /// Md5加密
567         /// </summary>
568         /// <param name="s"></param>
569         /// <returns></returns>
570         public static String Encrypt(String s)
571         {
572             MD5 md5 = new MD5CryptoServiceProvider();
573             byte[] bytes = System.Text.Encoding.UTF8.GetBytes(s);
574             bytes = md5.ComputeHash(bytes);
575             md5.Clear();
576             string ret = "";
577             for (int i = 0; i < bytes.Length; i++)
578             {
579                 ret += Convert.ToString(bytes[i], 16).PadLeft(2, 0);
580             }
581             return ret.PadLeft(32, 0);
582         }
583 
584 
585         /// <summary>
586         /// 调用微信支付接口
587         /// </summary>
588         /// <param name="payForWeiXin"></param>
589         /// <returns></returns>
590         public string PayForWeiXin(string postData)
591         {
592             string result = string.Empty;
593             try
594             {
595                 result = PostPage("https://api.mch.weixin.qq.com/mmpaymkttransfers/sendredpack", postData);
596             }
597             catch (Exception ex)
598             {
599 
600             }
601             return result;
602         }
603 
604 
605         /// <summary>
606         /// post微信请求
607         /// </summary>
608         /// <param name="posturl"></param>
609         /// <param name="postData"></param>
610         /// <returns></returns>
611         public string PostPage(string posturl, string postData)
612         {
613             Stream outstream = null;
614             Stream instream = null;
615             StreamReader sr = null;
616             HttpWebResponse response = null;
617             HttpWebRequest request = null;
618             Encoding encoding = Encoding.UTF8;
619             byte[] data = encoding.GetBytes(postData);
620             // 准备请求...  
621             try
622             {
623                 //CerPath证书路径
624                 string certPath = ConfigurationManager.AppSettings["certPath"].ToString();
625                 certPath = System.Web.HttpContext.Current.Server.MapPath(certPath);
626                 //证书密码
627                 string password = ConfigurationManager.AppSettings["password"].ToString();
628                 X509Certificate2 cert = new System.Security.Cryptography.X509Certificates.X509Certificate2(certPath, password, X509KeyStorageFlags.MachineKeySet);
629 
630                 // 设置参数  
631                 request = WebRequest.Create(posturl) as HttpWebRequest;
632                 CookieContainer cookieContainer = new CookieContainer();
633                 request.CookieContainer = cookieContainer;
634                 request.AllowAutoRedirect = true;
635                 request.Method = "POST";
636                 request.ContentType = "text/xml";
637                 request.ContentLength = data.Length;
638                 request.ClientCertificates.Add(cert);
639                 outstream = request.GetRequestStream();
640                 outstream.Write(data, 0, data.Length);
641                 outstream.Close();
642                 //发送请求并获取相应回应数据  
643                 response = request.GetResponse() as HttpWebResponse;
644                 //直到request.GetResponse()程序才开始向目标网页发送Post请求  
645                 instream = response.GetResponseStream();
646                 sr = new StreamReader(instream, encoding);
647                 //返回结果网页(html)代码  
648                 string content = sr.ReadToEnd();
649                 string err = string.Empty;
650                 return content;
651 
652             }
653             catch (Exception ex)
654             {
655                 string err = ex.Message;
656                 return string.Empty;
657             }
658         } 
659         #endregion
660 
661         /// <summary>
662         /// 模拟微信关注
663         /// </summary>
664         public string FocusLike()
665         { 
666             string postData = @"<xml><ToUserName>{0}</ToUserName>
667                                         <FromUserName>{1}</FromUserName>
668                                         <CreateTime>{2}</CreateTime>
669                                         <MsgType>{3}</MsgType>
670                                         <Event>{4}</Event>
671                                         <EventKey>{5}</EventKey>
672                                         <Ticket>{6}</Ticket>
673                                         </xml>";
674             postData = string.Format(postData,
675                                            "gh_0c33237af015",
676                                            "okehNt44afCOnburT5b7dXHivlSc",
677                                            "1469152031",
678                                            "event",
679                                            "SCAN",
680                                            "S0064216072100364",
681                                            "1234"
682                                 );
683 
684           return  PostPage1("http://localhost:33700/api/JDFWXService/Service",postData);
685 
686         }
687 
688         /// <summary>
689         /// post微信请求
690         /// </summary>
691         /// <param name="posturl"></param>
692         /// <param name="postData"></param>
693         /// <returns></returns>
694         public string PostPage1(string posturl, string postData)
695         {
696             Stream outstream = null;
697             Stream instream = null;
698             StreamReader sr = null;
699             HttpWebResponse response = null;
700             HttpWebRequest request = null;
701             Encoding encoding = Encoding.UTF8;
702             byte[] data = encoding.GetBytes(postData);
703             // 准备请求...  
704             try
705             { 
706                 // 设置参数  
707                 request = WebRequest.Create(posturl) as HttpWebRequest;
708                 CookieContainer cookieContainer = new CookieContainer();
709                 request.CookieContainer = cookieContainer;
710                 request.AllowAutoRedirect = true;
711                 request.Method = "POST";
712                 request.ContentType = "text/xml";
713                 request.ContentLength = data.Length; 
714                 outstream = request.GetRequestStream();
715                 outstream.Write(data, 0, data.Length);
716                 outstream.Close();
717                 //发送请求并获取相应回应数据  
718                 response = request.GetResponse() as HttpWebResponse;
719                 //直到request.GetResponse()程序才开始向目标网页发送Post请求  
720                 instream = response.GetResponseStream();
721                 sr = new StreamReader(instream, encoding);
722                 //返回结果网页(html)代码  
723                 string content = sr.ReadToEnd();
724                 string err = string.Empty;
725                 return content;
726 
727             }
728             catch (Exception ex)
729             {
730                 string err = ex.Message;
731                 return string.Empty;
732             }
733         } 
734 
735 
736     }
737 }
微信服务号帮助类

 

微信红包功能可以参考:csdn的实例下载。

 

四、效果

技术分享

 

四、开发总结

1.这个功能应该是连接客户比较实用的功能,提高客户的依赖度。

2.开发时调试比较麻烦,我的方法是使用微信服务号的api发送错误日志到我的微信上,另一个方法是自己模拟微信的回调事件(这个方法很好,可以直接在vs中调试)。

 

扫二维码关注服务号同时发现金红包

标签:

原文地址:http://www.cnblogs.com/tiuyi/p/5698119.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!