C#-实现微信激活会员卡后响应激活动作并获取会员信息

本文主要是介绍C#-实现微信激活会员卡后响应激活动作并获取会员信息,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

 

        公众号上运行商家投放会员卡给关注的用户,其中用户在激活会员卡之后其所填写的信息商家是要做保存的。

        如果是小程序实现的会员系统或是公众号网页上,那没什么好说的,在页面上随激活按钮的触发你的系统服务器就可以立即操作了。我这里说的是前端页面几乎完全依赖于微信公众平台,微信提供的会员卡功能包括页面实现的会员系统,越简单越好的那种,不然我同事也不会找我,外面弄一个系统或是买一个也要花不少钱,too bad。

        不过再怎么想省,服务器都是要有的,但是可以不用购买域名,也不需要备案。

        假设你在公众号平台已经编辑好了会员卡的内容,通过了审核获取到了会员卡卡号,虽然这个过程可以在代码里调微信的API实现,但是我接手的时候没有包含前面这些倒也省事。当然了,本质上没什么区别。

       因为要用到微信的API,开发者ID和APPSecret都是要的,另外还要在IP白名单加入服务器IP。

       微信开发文档会员卡激活

       文档里面有下面一段内容

步骤三:接收会员信息事件通知

用户填写、提交资料后,会有事件推送给商家,开发者可以在接收到事件通知后调用激活接口,传入会员卡号、初始积分等信息或者调用拉取会员信息接口获取会员信息,进行会员管理。

推送XML数据包示例

<xml><ToUserName> < ![CDATA[gh_3fcea188bf78] ]></ToUserName><FromUserName>< ![CDATA[obLatjlaNQKb8FqOvt1M1x1lIBFE] ]></FromUserName><CreateTime>1432668700</CreateTime><MsgType>< ![CDATA[event] ]></MsgType><Event>< ![CDATA[submit_membercard_user_info] ]></Event><CardId>< ![CDATA[pbLatjtZ7v1BG_ZnTjbW85GYc_E8] ]></CardId><UserCardCode>< ![CDATA[018255396048] ]></UserCardCode> 
</xml>

上面这个的处理可以看我前一篇《C#-微信公众号开发消息管理》

 

       上面的XML数据包中的信息有卡号CardId和UserCardCode这两个可以给我们用,微信的API中有一个可以获取会员信息的微信开发文档-拉取会员信息

接口调用请求说明

HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/membercard/userinfo/get?access_token=TOKEN

参数说明

参数是否必须说明
POST数据JSON数据
access_token调用接口凭证

POST数据

{"card_id": "pbLatjtZ7v1BG_ZnTjbW85GYc_E8","code": "916679873278" 
}

        需要注意的是,微信提供的API POST数据是几乎都是json格式的!请求得到的结果也是json格式!而access_token则是类似get拼接在后面。

        看上面就知道要用这个API我们还需要先获取到access_token并加以保存,这里就用到上面说的APPID和APPSecret了。我封装了一个方法专门用来调微信的接口。

/// <summary>/// 执行POST请求/// </summary>/// <param name="method">方法名</param>/// <param name="requestString">请求传参</param>/// <returns>json类型格式</returns>public string WXExcute(string method, string requestString){HttpWebRequest request = WebRequest.Create(method) as HttpWebRequest;if (method.StartsWith("https", StringComparison.OrdinalIgnoreCase)){ServicePointManager.ServerCertificateValidationCallback = new System.Net.Security.RemoteCertificateValidationCallback(CheckValidationResult);request.ProtocolVersion = HttpVersion.Version10;}request.ServicePoint.Expect100Continue = false;request.ServicePoint.UseNagleAlgorithm = false;request.Host = "api.weixin.qq.com";request.Method = "POST";request.ContentType = "application/x-www-form-urlencoded";request.Accept = "text/plain;charset=utf-8";request.Timeout = timeOut;byte[] data = Encoding.GetEncoding("UTF-8").GetBytes(requestString);using (Stream tempStream = request.GetRequestStream()){tempStream.Write(data, 0, data.Length);}//响应HttpWebResponse response;StreamReader reader;string jsonStr;//XmlDataDocument dataDoc = new XmlDataDocument();try{response = request.GetResponse() as HttpWebResponse;reader = new StreamReader(response.GetResponseStream());//dataDoc.Load(reader);jsonStr= reader.ReadToEnd();}catch (System.Exception ex){return "{\"data\":[],\"result\":{\"resultCode\":\"500005\",\"resultDesc\":\"" + ex.ToString() + "\"}}";}return jsonStr;}

        刷新access_token和检查access_token是否过期,微信开发文档里面建议保存access_token的值并且要检查是否失效,最好是在失效前就更新了,因为这样能保证系统正常运行,微信允许在一定时间内旧的access_token和新的可以同时有效。我这里就有点随意,只在需要access_token时才检查,而不是定时去检测。下面TokenTicketUtil是我自己封装的类,JsonParseBeanData()方法是把json字符串转成Model用的。

/// <summary>/// 刷新access_token/// </summary>/// <returns></returns>private bool refreshAccessToken(){string json= new MyHttpRequest().WXExcute(string.Format("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, secret));AccessToken access = TokenTicketUtil.JsonParseBeanData<AccessToken>(json);if (access != null && !string.IsNullOrEmpty(access.access_token)){firstGetTokenTime = DateTime.Now;accessData = access;return true;  //刷新token成功}else if(access != null){string error = access.errcode + "," + access.errmsg;ViewData["ERROR"] = xml;}return false;}/// <summary>/// 检查access_token是否到了可刷新的时候了/// </summary>/// <returns></returns>private bool isTimeToRefreshToken(){if (firstGetTokenTime != null){DateTime now = DateTime.Now;TimeSpan ts = now - firstGetTokenTime;if (accessData != null && !string.IsNullOrEmpty(accessData.access_token)){if (ts.Seconds - accessData.expires_in < 300)  //小于5分钟刷新{return true;}}else {return true;}}return false;}

       好了,通过上面的方法我们取到了有效的access_token,然后如法炮制,使用WXExcute()方法,把获取会员信息的API链接和必要的参数写进去就可以获取到用户在激活会员卡时填写的信息了。

/// <summary>/// 获取会员信息。需要会员卡号/// </summary>/// <returns></returns>public JsonResult GetMemberInfo(){string memCode = Request["code"];string memCardId = Request["cardId"];JsonResult jsonResult = new JsonResult();jsonResult.JsonRequestBehavior = JsonRequestBehavior.AllowGet;if (isTimeToRefreshToken()){if(!refreshAccessToken()){jsonResult.Data = OutPutErrorJson(500);return jsonResult;}}if (accessData != null){//JavaScriptSerializer serializer = new JavaScriptSerializer();JObject memCard = new JObject();memCard["card_id"] = memCardId;memCard["code"] = memCode ;string POSTstr = memCard.ToString(); ;//StringBuilder builder = new StringBuilder();//builder.AppendFormat("{0}={1}", "POST", POSTstr);string chgMC = new MyHttpRequest().WXExcute("https://api.weixin.qq.com/card/membercard/userinfo/get?access_token=" + accessData.access_token, POSTstr);jsonResult.Data = chgMC;}else {jsonResult.Data = OutPutErrorJson(400);}return jsonResult;}

        要POST json格式的数据用JObject实现就可以了,简单易读。返回回来的json数据如下:

返回数据

{"errcode": 0,"errmsg": "ok","openid": "obLatjjwDolFjRRd3doGIdwNqRXw","nickname": "Fourier","membership_number": "316510891298","bonus": 460,"sex": "MALE","user_info": {"common_field_list": [{"name": "USER_FORM_INFO_FLAG_MOBILE","value": "15521328888"},{"name": "USER_FORM_INFO_FLAG_NAME","value": "微信"}],"custom_field_list": []},"user_card_status": "NORMAL"
}

        构建相应的Model,然后将上面的数据内容转换为Model方便操作,将需要的信息保存到你的数据库即可。

        这一整个过程不需要自己设计前端页面,前端的东西都在微信公众平台上设置就好了。不过有影响的是要启动服务器配置势必会导致自定义菜单和消息自动回复不能使用,也要调接口实现才行,二者不可兼得。

 

 

这篇关于C#-实现微信激活会员卡后响应激活动作并获取会员信息的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/514646

相关文章

Flutter实现文字镂空效果的详细步骤

《Flutter实现文字镂空效果的详细步骤》:本文主要介绍如何使用Flutter实现文字镂空效果,包括创建基础应用结构、实现自定义绘制器、构建UI界面以及实现颜色选择按钮等步骤,并详细解析了混合模... 目录引言实现原理开始实现步骤1:创建基础应用结构步骤2:创建主屏幕步骤3:实现自定义绘制器步骤4:构建U

SpringBoot中四种AOP实战应用场景及代码实现

《SpringBoot中四种AOP实战应用场景及代码实现》面向切面编程(AOP)是Spring框架的核心功能之一,它通过预编译和运行期动态代理实现程序功能的统一维护,在SpringBoot应用中,AO... 目录引言场景一:日志记录与性能监控业务需求实现方案使用示例扩展:MDC实现请求跟踪场景二:权限控制与

Android实现定时任务的几种方式汇总(附源码)

《Android实现定时任务的几种方式汇总(附源码)》在Android应用中,定时任务(ScheduledTask)的需求几乎无处不在:从定时刷新数据、定时备份、定时推送通知,到夜间静默下载、循环执行... 目录一、项目介绍1. 背景与意义二、相关基础知识与系统约束三、方案一:Handler.postDel

在.NET平台使用C#为PDF添加各种类型的表单域的方法

《在.NET平台使用C#为PDF添加各种类型的表单域的方法》在日常办公系统开发中,涉及PDF处理相关的开发时,生成可填写的PDF表单是一种常见需求,与静态PDF不同,带有**表单域的文档支持用户直接在... 目录引言使用 PdfTextBoxField 添加文本输入域使用 PdfComboBoxField

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1