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

相关文章

C++使用栈实现括号匹配的代码详解

《C++使用栈实现括号匹配的代码详解》在编程中,括号匹配是一个常见问题,尤其是在处理数学表达式、编译器解析等任务时,栈是一种非常适合处理此类问题的数据结构,能够精确地管理括号的匹配问题,本文将通过C+... 目录引言问题描述代码讲解代码解析栈的状态表示测试总结引言在编程中,括号匹配是一个常见问题,尤其是在

Java实现检查多个时间段是否有重合

《Java实现检查多个时间段是否有重合》这篇文章主要为大家详细介绍了如何使用Java实现检查多个时间段是否有重合,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录流程概述步骤详解China编程步骤1:定义时间段类步骤2:添加时间段步骤3:检查时间段是否有重合步骤4:输出结果示例代码结语作

使用C++实现链表元素的反转

《使用C++实现链表元素的反转》反转链表是链表操作中一个经典的问题,也是面试中常见的考题,本文将从思路到实现一步步地讲解如何实现链表的反转,帮助初学者理解这一操作,我们将使用C++代码演示具体实现,同... 目录问题定义思路分析代码实现带头节点的链表代码讲解其他实现方式时间和空间复杂度分析总结问题定义给定

Java覆盖第三方jar包中的某一个类的实现方法

《Java覆盖第三方jar包中的某一个类的实现方法》在我们日常的开发中,经常需要使用第三方的jar包,有时候我们会发现第三方的jar包中的某一个类有问题,或者我们需要定制化修改其中的逻辑,那么应该如何... 目录一、需求描述二、示例描述三、操作步骤四、验证结果五、实现原理一、需求描述需求描述如下:需要在

C#中读取XML文件的四种常用方法

《C#中读取XML文件的四种常用方法》Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具,下面我们就来看看C#中读取XML文件的方法都有哪些吧... 目录XML简介格式C#读取XML文件方法使用XmlDocument使用XmlTextReader/XmlTextWr

如何使用Java实现请求deepseek

《如何使用Java实现请求deepseek》这篇文章主要为大家详细介绍了如何使用Java实现请求deepseek功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1.deepseek的api创建2.Java实现请求deepseek2.1 pom文件2.2 json转化文件2.2

python使用fastapi实现多语言国际化的操作指南

《python使用fastapi实现多语言国际化的操作指南》本文介绍了使用Python和FastAPI实现多语言国际化的操作指南,包括多语言架构技术栈、翻译管理、前端本地化、语言切换机制以及常见陷阱和... 目录多语言国际化实现指南项目多语言架构技术栈目录结构翻译工作流1. 翻译数据存储2. 翻译生成脚本

如何通过Python实现一个消息队列

《如何通过Python实现一个消息队列》这篇文章主要为大家详细介绍了如何通过Python实现一个简单的消息队列,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录如何通过 python 实现消息队列如何把 http 请求放在队列中执行1. 使用 queue.Queue 和 reque

Python如何实现PDF隐私信息检测

《Python如何实现PDF隐私信息检测》随着越来越多的个人信息以电子形式存储和传输,确保这些信息的安全至关重要,本文将介绍如何使用Python检测PDF文件中的隐私信息,需要的可以参考下... 目录项目背景技术栈代码解析功能说明运行结php果在当今,数据隐私保护变得尤为重要。随着越来越多的个人信息以电子形

使用 sql-research-assistant进行 SQL 数据库研究的实战指南(代码实现演示)

《使用sql-research-assistant进行SQL数据库研究的实战指南(代码实现演示)》本文介绍了sql-research-assistant工具,该工具基于LangChain框架,集... 目录技术背景介绍核心原理解析代码实现演示安装和配置项目集成LangSmith 配置(可选)启动服务应用场景