需求:点击我们公司的微信公众号,从菜单栏中进入会员中心,如果是新会员则需绑定注册,注册完跳转到用户中心页面,然后给用户发会员卡,如果是老会员,如果以前没有的会员卡的,发一张会员卡给他,如果有,则不做任何处理。

实现:我的思路是这样的,进入会员中心,调用微信API接口,判断用户是否领过卡,若没有领取,则调用微信JS-JDK的addCard()接口。具体实现过程如下(用C#实现):

1创建会员卡

1) 先打开微信开发者文档,先调用创建会员卡接口,在文档的4.1 创建会员卡接口,直接用postman,详情见文档。

创建的时候要特别注意”use_custom_code”: false,”bind_openid“:false两个字段

第一个为是否自定义code,第二个是否绑定openid,这个很重要,很重要,很重要!!!因为后面调用JS-JDK的addCard接口所需要的签名会根据这两个的值决定是否加入openid和code进行签名的生成(被坑了很久)。后面会详细说明这个签名,先一步步来,记住这两个参数一定要注意。按照这个文档说明,创建会员卡应该没有什么问题,对了, “sku”: { “quantity”: 50000000 }这个是库存,要添加一点库存。

2调用微信JS-SDK

1)引入微信js

2)通过config接口注入权限验证配置

$(function () {

//判断是否已经领取会员卡

$.ajax({

url: '/User/ExitCard',

type: 'GET',

success: function (data) {

if (data.Status == 1)

//1代表没有存在卡,0代表存在卡

wxAddCard();

}

});

}

//微信添加卡券

function wxAddCard() {

//微信sdk config

wx.config({

debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。

appId: '', // 必填,公众号的唯一标识

timestamp: '', // 必填,生成签名的时间戳

nonceStr: '', // 必填,生成签名的随机串

signature: '',// 必填,签名,见附录1

jsApiList: ['onMenuShareTimeline',

'onMenuShareAppMessage',

'onMenuShareQQ',

'onMenuShareWeibo',

'onMenuShareQZone',

'startRecord',

'stopRecord',

'onVoiceRecordEnd',

'playVoice',

'pauseVoice',

'stopVoice',

'onVoicePlayEnd',

'uploadVoice',

'downloadVoice',

'chooseImage',

'previewImage',

'uploadImage',

'downloadImage',

'translateVoice',

'getNetworkType',

'openLocation',

'getLocation',

'hideOptionMenu',

'showOptionMenu',

'hideMenuItems',

'showMenuItems',

'hideAllNonBaseMenuItem',

'showAllNonBaseMenuItem',

'closeWindow',

'scanQRCode',

'chooseWXPay',

'openProductSpecificView',

'addCard',

'chooseCard',

'openCard'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2

});

wx.ready(function () {

wx.addCard({

cardList: [{

cardId: '',

cardExt: '{"code":"","openid": "", "timestamp": "","nonce_str": "", "signature": ""}'

}],

success: function (res) {

$.ajax({

url: '/User/ActiveCard',

type: 'GET',

success: function (data) {

if (data.Status == 0)

alert("成功激活");

}

});

},

cancel: function (res) {

alert(JSON.stringify(res))

}

});

});

}

我这里是进入页面就调取接口看是否已经领卡,没有领卡,则调用微信接口,用户点击领取,然后调取激活接口,将会员卡激活,下面讲述签名的生成。

3)签名的配置

上一小节中的wx.config中appid为公众号的唯一标识,自己填自身微信公众号的,timestamp,nonceStr,signature三个签名其实就是为了加密吧。(以下代码都是用C#实现)

timestamp的生成:

///

/// 创建时间戳 ///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK

///

///

public long CreatenTimestamp()

{

return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;

}

nonceStr的生成:

///

/// 创建随机字符串 ///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK

///

///

public string CreatenNonce_str()

{

Random r = new Random();

var sb = new StringBuilder();

var length = strs.Length;

for (int i = 0; i < 15; i++)

{

sb.Append(strs[r.Next(length - 1)]);

}

return sb.ToString();

}

signature生成(这里是wx.config中的signature生成),signature签名的生成是由jsapi_ticket,noncestr,timestamp,url四个参数,先使用ASCII算法排序(其实就是看他们的字母顺序 j,n,t,u排序,如果首字母相等看第二位,以此类推),先等键进行排序,然后拼接例如jsapi_ticket=xxx&noncestr=&….我这里已经自己手动排序了,所以没实现ASCCII排序,排序完之后,使用sha1加密,代码如下:

///

/// 签名算法 ///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK

///

/// jsapi_ticket

/// 随机字符串(必须与wx.config中的nonceStr相同)

/// 时间戳(必须与wx.config中的timestamp相同)

/// 当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)

///

public string GetSignature(string jsapi_ticket, string noncestr, long timestamp, string url)

{

var string1Builder = new StringBuilder();

string1Builder.Append("jsapi_ticket=").Append(jsapi_ticket).Append("&")

.Append("noncestr=").Append(noncestr).Append("&")

.Append("timestamp=").Append(timestamp).Append("&")

.Append("url=").Append(url.IndexOf("#") >= 0 ? url.Substring(0, url.IndexOf("#")) : url);

return ShaEncrypt.SHA1Encrypt(string1Builder.ToString()).ToLower();

}

public static string SHA1Encrypt(string data)

{

//也给不了全部的代码,只需知道拼接后sha1加密 网上可以找到

var hash = SHA1.Create();

var encoder = new System.Text.ASCIIEncoding();

var combined = encoder.GetBytes(data);

var result = hash.ComputeHash(combined);

StringBuilder strbul = new StringBuilder(40);

for (int i = 0; i < result.Length; i++)

{

strbul.Append(result[i].ToString("x2"));//加密结果"x2"结果为32位,"x3"结果为48位,"x4"结果为64位

}

return strbul.ToString();

}

返回wx.config所需要的四个参数appId,timestamp,nonceStr,signature。

没有意外的话可以成功,成功自动进入 wx.ready(function () {}中。

wx.addCard({

cardList: [{

cardId: '',//吧你前面创建会员卡成功返回的参数中的cardId写进去

cardExt: '{"code":"","openid": "", "timestamp": "","nonce_str": "", "signature": ""}'

}],

success: function (res) {

$.ajax({

url: '/User/ActiveCard',

type: 'GET',

success: function (data) {

if (data.Status == 0)

alert("成功激活");

}

});

},

cancel: function (res) {

alert(JSON.stringify(res))

}

});

cardExt的signature签名生成由你创建会员卡的时候设置的”use_custom_code”: false,”bind_openid“:false决定,当两个为false时,则吧 paramList.Add(code);paramList.Add(openId);注释掉,哪个为fasle,哪个就不要。

下面代码的api_ticket与上面的jsapi_ticket完全不同,不是同一个东西,我会最最下面放出他们获取的方法

//意思就是这里有几个参数,那么对应的上面的 paramList.Add();就要添加几个

//而这里的code和openid的填写与否取决与创建会员卡是填写的两个字段,上面已经提及

cardExt: '{"code":"","openid": "", "timestamp": "","nonce_str": "", "signature": ""}'

意思就是这里有几个参数,那么对应的上面的 paramList.Add();就要添加几个,而这里的code和openid的填写与否取决与创建会员卡是填写的两个字段,上面已经提及

3.下面贴上面后台接口主要的代码

1)/User/ExitCard(post微信接口,然后根据返回消息判断是否已经领取卡,领取则为true,未领取则为false)

public bool ExitCard(string openId, string token,string code, string cardId)//token为access_token code为自定义code号

//code我这里是自定义的会员卡号

// cardId为创建会员卡时微信返回的cardId

{

var data = new Hashtable();

data.Add("openid", openId);

data.Add("card_id", cardId);

var res = HttpHelper.HttpComm(

string.Format("https://api.weixin.qq.com/card/user/getcardlist?access_token={0}", token),

"POST",

JSONHelper.ToJson(data));

var resObj = JSONHelper.FromJsonToAnonymousType(res,

new

{

error_code = 0,

errmsg = "ok",

has_share_card = false,

card_list = Enumerable.Repeat(new { card_id = string.Empty, code = string.Empty }, 1).ToList()

});

//var resObj = JSONHelper.FromJsonTo>(res);

//object info = new object();

//var str = resObj.TryGetValue("card_list", out info);

if (resObj.card_list.Count == 0 || resObj.card_list == null)

return false;

var temp = false;

for (var i = 0; i < resObj.card_list.Count; i++)

{

if (resObj.card_list[i].code == code)

{

temp = true;

break;

}

}

return temp;

}

2)/User/ActiveCard(激活会员卡)

//激活会员卡

public Boolean ActiveCard(string accessToken,string bonus,string cardNo,string cardId)

//bonus为用户积分 cardNo 卡号 cardId卡ID

{

var data = new Hashtable();

data.Add("init_bonus", bonus);

data.Add("membership_number", cardNo);

data.Add("code", cardNo);//上面跟这个设置相同,自定义code放在微信会员卡卡上面

data.Add("card_id", cardId);

var res = HttpHelper.HttpComm(

string.Format("https://api.weixin.qq.com/card/membercard/activate?access_token={0}", accessToken),

"POST",

JSONHelper.ToJson(data));

var resObj = JSONHelper.FromJsonToAnonymousType(res,new { errcode = "0", errmsg = "ok" });

if (resObj.errcode == "0")

return true;//激活成功

return false;

}

上面的HttpHelper.HttpComm只是一种自己封装定义的http请求的工具类,

自己去实现发送post请求即可,就不贴出来了。

4)总结与心得

总体流程大概就是如上,我觉得已经够详细了,写这篇博客的理由就是网上关于微信这一块的知识有,但是没有很详细的,让刚接触的人不知道如何下手,虽说看文档可以看懂,但是微信官方文档有很多坑,往往在文档中一个小小的细节就让人搞个大半天,而且报的错误都比较笼统,所以就打算自己写一份比较详细的,一个呢自己总结一下经验,有助于自身成长,另一个为后来人铺路,让他们少走点弯路,往后有机会接微信其他接口,会吧流程继续贴出来,以供参考。

获取api_ticket的微信接口:这里写链接内容

也就是在下图目录下的13.1,当然也可以在第二张图上找到,都是一样的

获取jsapi_ticket的微信接口在附录一,也就是目录下的16节

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

开发对接微信卡包会员卡_微信JS-SDK实现微信会员卡功能(给用户微信卡包里发送会员卡)...相关推荐

  1. 【Golang】-微信二次分享及Js Sdk签名工具

    微信二次分享及Js Sdk签名工具 概述 功能 安装 使用 概述 在进行微信Js Sdk调用时,需要首先获取到签名,通过签名进行授权以及接口调用,wxsign使用Golang编写,完成签名授权验证. ...

  2. 前端做微信好友分享_基于js实现微信发送好友如何分享到朋友圈、微博

    微信浏览器内置了javascript私有对象WeixinJSBridge,可以实现发送给朋友.分享到朋友圈.分享到微博等功能. var imgUrl = "图片地址"; var l ...

  3. 如何自建微信外卖平台_本地外面平台怎么起步,如何自建微信外卖平台

    原标题:本地外面平台怎么起步,如何自建微信外卖平台 外卖平台很多,本地外卖平台是如何留住用户的 换句话说,这个问题是:用户为什么使用你的平台?为什么要保留你的应用程序?其实,归根到底还是要把握用户的需 ...

  4. python利用微信的方法_作为程序员,如何利用Python玩转微信,让你的微信与众不同...

    我们每天都在用微信,有没有想过用Python来控制我们的微信,不多说,直接上干货! 安装模块 1.生成微信对象 bot = Bot() #初始化一个对象,就相当于拿到了这个人的微信,后续的一些操作都要 ...

  5. eleme,Table 表格,微信计次卡消费小程序,次卡功能,美容院微信会员卡系统

    <template><el-table:data="tableData"style="width: 100%"><el-table ...

  6. 【微信分享】 微信分享集成 使用weixin js sdk 兼容 旧版本 2

    之前有写过一份 微信分享集成 的文章, 这次进行了重新的整理, 具体的功能有: 1.分享到朋友圈(图+一句话) 2.分享到朋友(图+标题+一句话) 3.强制显示or隐藏 右上角更多按钮 4.强制关闭当 ...

  7. 使用代理爬去微信公众号_手游推广,手游折扣代理,微信视频号这个引流方式的使用...

    微信的视频号,现在对于普通的用户都是开放状态的了,谁都可以发. 看到很多代理都已经在使用了. 点击微信的设置, 在点击发现页管理. 开启你的视频号功能. 开启后,你在你的朋友圈那一栏的界面就可以发现你 ...

  8. 游戏开发需要具备哪些技术_生鲜小程序需要具备哪些功能板块?生鲜小程序开发...

    线上生鲜小程序开发让用户购买蔬菜水果更加便捷,不仅可以有利于发展生鲜行业之后的规模,而且也能够吸引更多的用户,低成本获客.那么,这样一款生鲜小程序需要具备哪些功能板块呢? 线上生鲜小程序需要具备什么? ...

  9. 游戏开发需要具备哪些技术_短视频 SDK 开发 (一) 开发一款短视频 SDK 需要具备哪些知识?...

    前言 2020 年要属什么最火,肯定是短视频和直播带货了.我自己基本上每天晚上睡觉之前都会刷一会儿 douyin 短视频,不得不承认 douyin 的推荐算法是真 nb ,推荐的都是我的最爱 ? .那 ...

  10. 微信小游戏_China_Fighting——game.js、game.json、project.config.json

    目录 微信小游戏_China_Fighting--前言 微信小游戏_China_Fighting--基础支撑类(sprite.animation.pool) 微信小游戏_China_Fighting- ...

最新文章

  1. 百个JavaScript函数以及基础写法汇总
  2. python怎么输入文件数据库_python学习日记——文件及数据库
  3. Redis和Memcached:数据类型 过期策略 持久策略 虚拟内存 Value大小
  4. 创建自己的Vagrant box
  5. Linux中的组合键
  6. 用html5做一条线,使用HTML5 canvas绘制线条的方法
  7. (一)elasticsearch6.1.1安装详细过程
  8. 【HDU - 5744 】Keep On Movin (回文串性质,贪心思维,不是水题)
  9. 别以为JDK8有了红黑树,HashMap就不会有死循环问题!
  10. SharePoint咨询师之路:设计之前的那些事四:负载均衡 - web服务器
  11. cuda支持 java_cuda运行时错误(48):没有内核映像可用于在设备上执行
  12. pycharm appiunm 公众号测试_知道答案公众号_知到APP笔尖上的艺术——书法基础与赏析单元测试答案_知道答...
  13. 雷林鹏分享:Ruby 发送邮件 - SMATP
  14. Web(4)servlet
  15. 3-矢量数据的构建和获取坐标集
  16. 开发与研发:区别很大(上)
  17. 如何用mysql创建orders表_MySQL学习十四创建和操纵表
  18. Redis篇 <一>Docker安装redis 及基础
  19. Linux 文档编辑 : let 命令详解
  20. String如何截取字符串长度

热门文章

  1. 镇江市第一届软件设计大赛参赛作品简单记录
  2. android9 coloros6版本,OPPO A9系统升级更新ColorOS 6 正式版-A.19固件完整包
  3. 提高多表关联数据查询效率
  4. 阿里面试经历与感受谈
  5. java中long类型数据的运算_在Java中,byte类型数据占【】个字节,short类型数据占【】个字节,int类型数据占【】个字节,long类型数据占【】个字节。...
  6. element-plus 中loading 自定义图片
  7. 软件测试周刊(第37期):不能随便生气
  8. python虚拟宠物猫
  9. HTML+CSS仿小米官网首页 项目总结
  10. 深度学习第二次培训(BP神经网络)