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

相关文章

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

2. c#从不同cs的文件调用函数

1.文件目录如下: 2. Program.cs文件的主函数如下 using System;using System.Collections.Generic;using System.Linq;using System.Threading.Tasks;using System.Windows.Forms;namespace datasAnalysis{internal static

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

业务中14个需要进行A/B测试的时刻[信息图]

在本指南中,我们将全面了解有关 A/B测试 的所有内容。 我们将介绍不同类型的A/B测试,如何有效地规划和启动测试,如何评估测试是否成功,您应该关注哪些指标,多年来我们发现的常见错误等等。 什么是A/B测试? A/B测试(有时称为“分割测试”)是一种实验类型,其中您创建两种或多种内容变体——如登录页面、电子邮件或广告——并将它们显示给不同的受众群体,以查看哪一种效果最好。 本质上,A/B测

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P