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

相关文章

mybatis执行insert返回id实现详解

《mybatis执行insert返回id实现详解》MyBatis插入操作默认返回受影响行数,需通过useGeneratedKeys+keyProperty或selectKey获取主键ID,确保主键为自... 目录 两种方式获取自增 ID:1. ​​useGeneratedKeys+keyProperty(推

Spring Boot集成Druid实现数据源管理与监控的详细步骤

《SpringBoot集成Druid实现数据源管理与监控的详细步骤》本文介绍如何在SpringBoot项目中集成Druid数据库连接池,包括环境搭建、Maven依赖配置、SpringBoot配置文件... 目录1. 引言1.1 环境准备1.2 Druid介绍2. 配置Druid连接池3. 查看Druid监控

Linux在线解压jar包的实现方式

《Linux在线解压jar包的实现方式》:本文主要介绍Linux在线解压jar包的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux在线解压jar包解压 jar包的步骤总结Linux在线解压jar包在 Centos 中解压 jar 包可以使用 u

Java中读取YAML文件配置信息常见问题及解决方法

《Java中读取YAML文件配置信息常见问题及解决方法》:本文主要介绍Java中读取YAML文件配置信息常见问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 目录1 使用Spring Boot的@ConfigurationProperties2. 使用@Valu

c++ 类成员变量默认初始值的实现

《c++类成员变量默认初始值的实现》本文主要介绍了c++类成员变量默认初始值,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录C++类成员变量初始化c++类的变量的初始化在C++中,如果使用类成员变量时未给定其初始值,那么它将被

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

基于Python实现一个图片拆分工具

《基于Python实现一个图片拆分工具》这篇文章主要为大家详细介绍了如何基于Python实现一个图片拆分工具,可以根据需要的行数和列数进行拆分,感兴趣的小伙伴可以跟随小编一起学习一下... 简单介绍先自己选择输入的图片,默认是输出到项目文件夹中,可以自己选择其他的文件夹,选择需要拆分的行数和列数,可以通过

Python中将嵌套列表扁平化的多种实现方法

《Python中将嵌套列表扁平化的多种实现方法》在Python编程中,我们常常会遇到需要将嵌套列表(即列表中包含列表)转换为一个一维的扁平列表的需求,本文将给大家介绍了多种实现这一目标的方法,需要的朋... 目录python中将嵌套列表扁平化的方法技术背景实现步骤1. 使用嵌套列表推导式2. 使用itert

C#读写文本文件的多种方式详解

《C#读写文本文件的多种方式详解》这篇文章主要为大家详细介绍了C#中各种常用的文件读写方式,包括文本文件,二进制文件、CSV文件、JSON文件等,有需要的小伙伴可以参考一下... 目录一、文本文件读写1. 使用 File 类的静态方法2. 使用 StreamReader 和 StreamWriter二、二进

Python使用pip工具实现包自动更新的多种方法

《Python使用pip工具实现包自动更新的多种方法》本文深入探讨了使用Python的pip工具实现包自动更新的各种方法和技术,我们将从基础概念开始,逐步介绍手动更新方法、自动化脚本编写、结合CI/C... 目录1. 背景介绍1.1 目的和范围1.2 预期读者1.3 文档结构概述1.4 术语表1.4.1 核