本文只是記錄一下本身最近開發的一個小功能,方便之後查看。html
1、需求原文以下:json
1.vip微信參數配置api
1)是否啓用微信
2)設置每單最大紅包金額 (例如5 )cookie
3)設置各種別 紅包金額範圍 app
鑽石 3-5dom
黃金 2-3 等等ide
2.質量保證單 post
打印二維碼 參數傳銷售門店 以及銷售單號微信支付
客戶掃碼
1)自動關注服務號
2)自動匹配客戶檔案
openid 匹配到檔案的增長積分以及總積分 ,
未匹配到檔案的 客戶填寫 姓名,手機號 若是手機號匹配到記錄 自動將客戶檔案關聯上
手機號也未匹配到記錄 自動創建檔案(自動插入所屬分銷商id,微信openid,姓名,手機號,總積分,剩餘積分 必填項添默認值)
3)根據用戶結果 自動關聯客戶消費記錄
4)根據積分規則判斷消費完客戶是否達成升級標準(客戶等級只升不降)
5)根據參數配置 自動發送一個紅包給客戶 同單屢次掃描只發送一次紅包.
紅包規則 1.判斷是否啓用 沒有啓用不發送
2.發送紅包時 取明細條碼裏面 紅包金額上限最大的 記錄 隨機生成一個金額的紅包發送
例如 客戶購買2件貨品 鑽石 3-5 黃金2-3
那麼隨機發送一個 3-5元的紅包給客戶
(暫不考慮銷退的狀況)
2、需求理解:簡單來講就是門店下單時須要在質保單上面打印上咱們的服務號二維碼(二維碼參數帶上訂單號),掃碼時根據openid(客戶微信號在咱們的服務號惟一的標示)匹配客戶表,若是以前已經存在,就根據單號和積分規則計算客戶的積分,沒發過紅包的單就發送一個根據類別配置金額的紅包給客戶。若是openid沒有匹配到就給個連接填寫vip信息,以後發送紅包和消費記錄,同時計算積分。
3、實操
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 一、點擊屏幕右上角菜單→查看歷史消息,查看金大福最近資訊 \r\n 二、屏幕下方菜單體驗客戶關懷 \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的實例下載。
4、效果
4、開發總結
1.這個功能應該是鏈接客戶比較實用的功能,提升客戶的依賴度。
2.開發時調試比較麻煩,個人方法是使用微信服務號的api發送錯誤日誌到個人微信上,另外一個方法是本身模擬微信的回調事件(這個方法很好,能夠直接在vs中調試)。