/// <summary> /// 签名算法 ///本代码来自开源微信SDK项目:https://github.com/night-king/weixinSDK /// </summary> /// <param>jsapi_ticket</param> /// <param>随机字符串(必须与wx.config中的nonceStr相同)</param> /// <param>时间戳(必须与wx.config中的timestamp相同)</param> /// <param>当前网页的URL,不包含#及其后面部分(必须是调用JS接口页面的完整URL)</param> /// <returns></returns> 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<Dictionary<string, object>>(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)总结与心得