C#实现微信公众号会员卡管理的示例代码
为了更好地理解微信公众号--会员卡管理,作者特意花了不少的时间对其研究,并用c#开发出会员卡demo,主要包含会员卡创建、设置开卡字段、通过创建二维码来投放会员卡、同步会员卡数据/激活会员卡、拉取会员信息、更新会员信息、设置会员卡失效、删除会员卡,从这些可以清晰地看出是围绕会员卡的生命周期来研究的。结合文章中DEMO有助于大家快速理解会员卡接口。
1、会员卡创建
1)、会员卡创建接口文档
支持开发者调用该接口创建会员卡,并获取card_id,用于投放。调用该接口前,请开发者详读创建卡券接口部分上传图片接口、首页 部分,快速录入会员卡卡面必要信息。
接口调用请求说明
HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/create?access_token=ACCESS_TOKEN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
POST数据 | 是 | JSON结构 |
POST数据示例:
{ "card": { "card_type": "MEMBER_CARD", "member_card": { "background_pic_url": "https://mmbiz.qlogo.cn/mmbiz/", "base_info": { "logo_url": "http://mmbiz.qpic.cn/mmbiz/iaL1LJM1mF9aRKPZ/0", "brand_name": "海底捞", "code_type": "CODE_TYPE_TEXT", "title": "海底捞会员卡", "color": "Color010", "notice": "使用时向服务员出示此券", "service_phone": "020-88888888", "description": "不可与其他优惠同享", "date_info": { "type": "DATE_TYPE_PERMANENT" }, "sku": { "quantity": 50000000 }, "get_limit": 3, "use_custom_code": false, "can_give_friend": true, "location_id_list": [ 123, 12321 ], "custom_url_name": "立即使用", "custom_url": "http://weixin.qq.com", "custom_url_sub_title": "6个汉字tips", "promotion_url_name": "营销入口1", "promotion_url": "http://www.qq.com", "need_push_on_view": true }, "advanced_info": { "use_condition": { "accept_category": "鞋类", "reject_category": "阿迪达斯", "can_use_with_other_discount": true }, "abstract": { "abstract": "微信餐厅推出多种新季菜品,期待您的光临", "icon_url_list": [ "http://mmbiz.qpic.cn/mmbiz/p98FjXy8LacgHxp3sJ3vn97bGLz0ib0Sfz1bjiaoOYA027iasqSG0sj piby4vce3AtaPu6cIhBHkt6IjlkY9YnDsfw/0" ] }, "text_image_list": [ { "image_url": "http://mmbiz.qpic.cn/mmbiz/p98FjXy8LacgHxp3sJ3vn97bGLz0ib0Sfz1bjiaoOYA027iasqSG0sjpiby4vce3AtaPu6cIhBHkt6IjlkY9YnDsfw/0", "text": "此菜品精选食材,以独特的烹饪方法,最大程度地刺激食 客的味蕾" }, { "image_url": "http://mmbiz.qpic.cn/mmbiz/p98FjXy8LacgHxp3sJ3vn97bGLz0ib0Sfz1bjiaoOYA027iasqSG0sj piby4vce3AtaPu6cIhBHkt6IjlkY9YnDsfw/0", "text": "此菜品迎合大众口味,老少皆宜,营养均衡" } ], "time_limit": [ { "type": "MONDAY", "begin_hour":0, "end_hour":10, "begin_minute":10, "end_minute":59 }, { "type": "HOLIDAY" } ], "business_service": [ "BIZ_SERVICE_FREE_WIFI", "BIZ_SERVICE_WITH_PET", "BIZ_SERVICE_FREE_PARK", "BIZ_SERVICE_DELIVER" ] }, "supply_bonus": true, "supply_balance": false, "prerogative": "test_prerogative", "auto_activate": true, "custom_field1": { "name_type": "FIELD_NAME_TYPE_LEVEL", "url": "http://www.qq.com" }, "activate_url": "http://www.qq.com", "custom_cell1": { "name": "使用入口2", "tips": "激活后显示", "url": "http://www.qq.com" }, "bonus_rule": { "cost_money_unit": 100, "increase_bonus": 1, "max_increase_bonus": 200, "init_increase_bonus": 10, "cost_bonus_unit": 5, "reduce_money": 100, "least_money_to_use_bonus": 1000, "max_reduce_bonus": 50 }, "discount": 10 } } }
2)、创建会员卡DEMO
A、在创建会员卡之前,我们可以调用素材管理,上传logo,backgroup图片
如下为调用接口的DEMO
DEMO中关键代码:
if (string.IsNullOrEmpty(textBoxTmpMedia.Text)) { MessageUtil.ShowTips("请选择上传的素材!"); return; } ImageReJson imageReJson = AddMaterialInterface.Image(richTextBox1.Text, "image", textBoxTmpMedia.Text, "image/jpeg"); if (string.IsNullOrEmpty(imageReJson.errmsg)) { textBox7.Text = imageReJson.url; textBox26.Text = imageReJson.url; } richTextBox6.Text = "执行结果:" + JsonConvert.SerializeObject(imageReJson);
B、在logo与 backgroup图片上传后,我们调用创建会员卡接口来创建会员卡,如下为DEMO
在创建成功后,在微信公众平台中有刚创建的会员卡套
具体会员卡信息如下:
其中关键代码:
Base_Info base_info = new Base_Info(); base_info.logo_url = textBox26.Text; base_info.code_type = "CODE_TYPE_BARCODE"; base_info.brand_name = textBox27.Text; base_info.title = textBox28.Text; Date_Info date_info = new Date_Info(); date_info.type = "DATE_TYPE_PERMANENT"; base_info.date_info = date_info; base_info.color = "Color100"; base_info.notice = "到店出示会员卡,由店员完成核销"; base_info.description = "每人限领取1张\r\n会员权益不可与其它优惠同享\r\n仅限中国(本会员卡不包括港澳台地区)指定的爱玛蒂专卖店使用\r\n当年消费获取的积分仅可当年年底(既12月31日24点)前使用,如未全部使用,则当年的积分会于当年年底清零,不累计到次年\r\n具体使用方式请咨询专卖店工作人员。"; base_info.get_limit = 1; base_info.can_share = false; base_info.can_give_friend = false; Sku sku = new Sku(); sku.quantity = 1000000000; sku.total_quantity = 1000000000; base_info.sku = sku; base_info.use_all_locations = true; member_Card.base_info = base_info; member_Card.supply_bonus = true; member_Card.supply_balance = false; member_Card.prerogative = "所有专卖店消费1元即可获得1积分\r\n可参与丰富的会员专享活动,详情参看相关门店活动页面"; member_Card.auto_activate = false; member_Card.wx_activate = true; //积分规则 Bonus_Rule bonus_rule = new Bonus_Rule(); bonus_rule.cost_money_unit = 100; bonus_rule.increase_bonus = 1; bonus_rule.cost_bonus_unit = 2000; bonus_rule.reduce_money = 100; member_Card.bonus_rule = bonus_rule; member_Card.background_pic_url = ""; card.member_card = member_Card; memberCardJson.card = card; //创建会员卡json显示在界面上 richTextBox2.Text = JsonConvert.SerializeObject(memberCardJson); //通过接口写入 CardReJson createrejson = MemberCardInterface.Create(richTextBox1.Text, memberCardJson); richTextBox3.Text = JsonConvert.SerializeObject(createrejson);
C、设置测试白名单接口
若会员卡暂时未审核通,开发者可以将测试人员的微信号设置成白名单,领取未审核通过的卡券。白名单状态领取的卡信息不随卡券实时更新,请开发者注意。
2、设置开卡字段
1)、设置开卡字段接口文档
开发者在创建时填入"wx_activate": true字段后,需要调用该接口设置用户激活时需要填写的选项,否则一键开卡设置不生效。
接口调用请求说明
HTTP请求方式: POST URL:https://api.weixin.qq.com/card/membercard/activateuserform/set?access_token=TOKEN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
POST数据 | 是 | JSON结构 |
2)、设置开卡字段DEMO
在设置开卡字段之前,我们查看了微信公众平台中会员卡的激活信息,只有必填信息,手机号
如下为调用接口程序,设置开卡字段接口 设置姓名,手机号是必填,性别、生日、兴趣选填
在调用 接口成功后,必填信息与激活信息调整见下
3、投放会员卡--创建二维码
1)、接口文档
创建会员卡二维码,打印后置于店内,顾客扫码领取会员卡,扫描下方二维码体验领取,若已领取可扫码快速打开会员卡。
开发者可调用该接口生成一张卡券二维码供用户扫码后添加卡券到卡包。
自定义Code码的卡券调用接口时,POST数据中需指定code,非自定义code不需指定,指定openid同理。指定后的二维码只能被用户扫描领取一次。
获取二维码ticket后,开发者可用换取二维码图片详情。
接口调用请求说明
HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/qrcode/create?access_token=TOKEN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
POST数据 | 是 | JSON数据 |
access_token | 是 | 调用接口凭证 |
POST数据
开发者可以设置扫描二维码领取单张卡券,此时POST数据为:
{ "action_name": "QR_CARD", "expire_seconds": 1800, "action_info": { "card": { "card_id": "pFS7Fjg8kV1IdDz01r4SQwMkuCKc", "code": "198374613512", "openid": "oFS7Fjl0WsZ9AMZqrI80nbIq8xrA", "is_unique_code": false , "outer_str":"12b" } } }
当开发者设置扫描二维码领取多张卡券,此时POST数据为:
{ "action_name": "QR_MULTIPLE_CARD", "action_info": { "multiple_card": { "card_list": [ { "card_id": "p1Pj9jgj3BcomSgtuW8B1wl-wo88", "code":"2392583481", "outer_str":"12b" }, { "card_id": "p1Pj9jgj3BcomSgtuW8B1wl-wo98", "code":"2392583482", "outer_str":"12b" } ] } } }
2)、创建二维码DEMO
用户可以扫描这个二维码,扫码后,先领取会员卡,然后激活会员卡
在领取与激活会员卡时,会向开发者接入推送事件,
<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>
开发者在收到这些xml后,可以解析处理,比如可以同步会员的初始积分,读取会员的基础信息同步到自己的业务系统,包括CRM或ERP等。
如下是我们接收后,做的系统日志:
4、同步会员卡数据/激活会员卡
1)、开发文档介绍
开发者可以在接收到事件通知后调用激活接口,传入会员卡号、初始积分等信息或者调用拉取会员信息接口获取会员信息,详情请见:激活会员卡接口
激活方式说明
接口激活通常需要开发者开发用户填写资料的网页。通常有两种激活流程:
用户必须在填写资料后才能领卡,领卡后开发者调用激活接口为用户激活会员卡;
是用户可以先领取会员卡,点击激活会员卡跳转至开发者设置的资料填写页面,填写完成后开发者调用激活接口为用户激活会员卡。
接口详情
接口调用请求说明
HTTP请求方式: POSTURL:https://api.weixin.qq.com/card/membercard/activate?access_token=TOKEN
参数说明
参数 | 是否必须 | 说明 |
---|---|---|
access_token | 是 | 调用接口凭证 |
POST数据 | 是 | JSON结构 |
{ "init_bonus": 100, "init_bonus_record":"旧积分同步", "init_balance": 200, "membership_number": "AAA00000001", "code": "12312313", "card_id": "xxxx_card_id", "background_pic_url": "https://mmbiz.qlogo.cn/mmbiz/0?wx_fmt=jpeg", "init_custom_field_value1": "xxxxx" }
2)、同步/激活会员卡DEMO
本DEMO中演示了修改membership_number及 初始积分,第一张图片为原图,第二张为同步后的图
5、拉取会员信息
1)、开发文档介绍
接口说明
支持开发者根据CardID和Code查询会员信息。
接口调用请求说明
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" }
返回数据
{ "errcode": 0, "errmsg": "ok", "openid": "obLatjjwDolFj******wNqRXw", "nickname": "*******", "membership_number": "658*****445", "bonus": 995, "sex": "MALE", "user_info": { "common_field_list": [ { "name": "USER_FORM_INFO_FLAG_MOBILE", "value": "15*****518" }, { "name": "USER_FORM_INFO_FLAG_NAME", "value": "HK" }, { "name": "USER_FORM_INFO_FLAG_EDUCATION_BACKGROUND", "value": "研究生" } ], "custom_field_list": [ { "name": "兴趣", "value": "钢琴", "value_list": [] }, { "name": "喜好", "value": "郭敬明", "value_list": [] }, { "name": "职业", "value": "", "value_list": [ "赛车手", "旅行家" ] } ] }, "user_card_status": "NORMAL", "has_active": false }
2)、拉取会员信息DEMO
可以读取到会员的姓名与手机号等信息,其中可以用手机号作为关键值与公司的CRM、ERP等对接。
6、更新会员信息
当前会员的积分或储值在公司的CRM、ERP等系统中变化,这时可以通过这个接口来实现同步。
如下DEMO为同步会员积分:
7、设置会员失效
如下为开发文档中的注意事项:
1.设置卡券失效的操作不可逆,即无法将设置为失效的卡券调回有效状态,商家须慎重调用该接口。
*2.商户调用失效接口前须与顾客事先告知并取得同意,否则因此带来的顾客投诉,微信将会按照《微信运营处罚规则》
如下是通过接口实现将会员失效的DEMO
8、删除会员卡
开发文档中说明是同删除卡券接口,删除卡券接口允许商户删除任意一类卡券。删除卡券后,该卡券对应已生成的领取用二维码、添加到卡包JS API均会失效。 注意:如用户在商家删除卡券前已领取一张或多张该卡券依旧有效。即删除卡券不能删除已被用户领取,保存在微信客户端中的卡券。
如下是通过接口实现删除会员卡功能的DEMO
到此这篇关于C#实现微信公众号会员卡管理的示例代码的文章就介绍到这了,更多相关C# 公众号会员卡管理内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!