亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

微信JS-SDK實現微信會員卡功能(給用戶微信卡包里發送會員卡)

2019-11-19 11:08:19
字體:
來源:轉載
供稿:網友

需求:點擊我們公司的微信公眾號,從菜單欄中進入會員中心,如果是新會員則需綁定注冊,注冊完跳轉到用戶中心頁面,然后給用戶發會員卡,如果是老會員,如果以前沒有的會員卡的,發一張會員卡給他,如果有,則不做任何處理。
實現:我的思路是這樣的,進入會員中心,調用微信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

<script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>

2)通過config接口注入權限驗證配置

<script>  $(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))            }          });        });    } </script>

我這里是進入頁面就調取接口看是否已經領卡,沒有領卡,則調用微信接口,用戶點擊領取,然后調取激活接口,將會員卡激活,下面講述簽名的生成。

3)簽名的配置

上一小節中的wx.config中appid為公眾號的唯一標識,自己填自身微信公眾號的,timestamp,nonceStr,signature三個簽名其實就是為了加密吧。(以下代碼都是用C#實現)
timestamp的生成:

/// <summary>    /// 創建時間戳       ///本代碼來自開源微信SDK項目:https://github.com/night-king/weixinSDK    /// </summary>    /// <returns></returns>    public long CreatenTimestamp()    {      return (DateTime.Now.ToUniversalTime().Ticks - 621355968000000000) / 10000000;    }

nonceStr的生成:

/// <summary>    /// 創建隨機字符串     ///本代碼來自開源微信SDK項目:https://github.com/night-king/weixinSDK    /// </summary>    /// <returns></returns>    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加密,代碼如下:

/// <summary>    /// 簽名算法    ///本代碼來自開源微信SDK項目:https://github.com/night-king/weixinSDK    /// </summary>    /// <param name="jsapi_ticket">jsapi_ticket</param>    /// <param name="noncestr">隨機字符串(必須與wx.config中的nonceStr相同)</param>    /// <param name="timestamp">時間戳(必須與wx.config中的timestamp相同)</param>    /// <param name="url">當前網頁的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)總結與心得

總體流程大概就是如上,我覺得已經夠詳細了,寫這篇博客的理由就是網上關于微信這一塊的知識有,但是沒有很詳細的,讓剛接觸的人不知道如何下手,雖說看文檔可以看懂,但是微信官方文檔有很多坑,往往在文檔中一個小小的細節就讓人搞個大半天,而且報的錯誤都比較籠統,所以就打算自己寫一份比較詳細的,一個呢自己總結一下經驗,有助于自身成長,另一個為后來人鋪路,讓他們少走點彎路,往后有機會接微信其他接口,會吧流程繼續貼出來,以供參考。

獲取api_ticket的微信接口:這里寫鏈接內容

也就是在下圖目錄下的13.1,當然也可以在第二張圖上找到,都是一樣的

 

獲取jsapi_ticket的微信接口在附錄一,也就是目錄下的16節

這里寫鏈接內容

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲剧情一区二区| 精品香蕉一区二区三区| 日韩精品视频在线观看网址| 亚洲男人天天操| 欧美资源在线观看| 中文字幕在线精品| 国产视频精品自拍| 97激碰免费视频| 在线视频欧美性高潮| 久久精品91久久久久久再现| 久久天天躁日日躁| 国产伦精品一区二区三区精品视频| 懂色aⅴ精品一区二区三区蜜月| 国产亚洲欧美另类中文| 狠狠久久亚洲欧美专区| 欧美丰满片xxx777| 亚洲国产欧美精品| 亚洲视频在线看| 91色琪琪电影亚洲精品久久| 亚洲jizzjizz日本少妇| 91精品国产综合久久久久久久久| 亚洲国产私拍精品国模在线观看| 久久99精品久久久久久青青91| 日韩经典第一页| 日韩中文字幕在线精品| 亚洲国产精品人人爽夜夜爽| 国产欧美一区二区| 久久久av电影| 亚洲综合av影视| 亚洲精品美女在线观看播放| 亚洲国产精品99久久| 2019日本中文字幕| 亚洲国产精品人久久电影| 成人av在线天堂| 欧美黑人性生活视频| 日韩免费高清在线观看| 久久久久亚洲精品| 欧美性高潮床叫视频| 国产成人精品免费视频| 久久久久久久久久久成人| 精品国内自产拍在线观看| 色诱女教师一区二区三区| 欧美网站在线观看| 国产亚洲精品美女| 日韩成人在线视频观看| 97超级碰碰碰久久久| 国产精品美女在线观看| 国产精品成久久久久三级| 国产va免费精品高清在线观看| 亚洲精品电影网| 国产精品入口夜色视频大尺度| 亚洲精品影视在线观看| 亚洲一区二区黄| 欧美裸体xxxx极品少妇软件| 亚洲第一av网| 欧美极品美女电影一区| 国产伦精品免费视频| 国产精品99久久久久久久久久久久| 欧美综合激情网| 国产精品jizz在线观看麻豆| 亚洲女同性videos| 欧美视频中文字幕在线| 亚洲国产精品成人精品| 久久99国产精品久久久久久久久| 国产欧美日韩精品丝袜高跟鞋| 日本久久久久亚洲中字幕| 久久天堂av综合合色| 欧美日韩在线观看视频小说| 亚洲欧美成人网| 国产成人精品一区二区三区| 91社区国产高清| 日韩精品久久久久久福利| 97精品国产97久久久久久| 中文字幕一区电影| 精品自拍视频在线观看| www.日韩视频| 国内精品久久久久久久| 欧美色道久久88综合亚洲精品| 欧美夫妻性生活视频| 亚洲国产精品福利| 欧美另类xxx| 国产成+人+综合+亚洲欧美丁香花| 久久精品影视伊人网| 91久久国产精品| 欧美裸身视频免费观看| 国内精品小视频在线观看| 亚洲免费av网址| 久久视频精品在线| 久久成人综合视频| 亚洲欧美第一页| 成人激情视频在线播放| 国产91ⅴ在线精品免费观看| 亚洲老板91色精品久久| 色www亚洲国产张柏芝| 国内精品久久久久久中文字幕| 精品毛片网大全| 亚洲欧美激情视频| 久久综合伊人77777蜜臀| 亚洲国产精品久久久久秋霞蜜臀| 中文字幕在线看视频国产欧美在线看完整| 91成人在线播放| 性色av香蕉一区二区| 91视频九色网站| 日韩欧中文字幕| 亚洲欧洲一区二区三区久久| 一本色道久久88综合日韩精品| 在线观看日韩视频| 日韩成人在线电影网| 亚洲三级黄色在线观看| 日韩成人性视频| 色综合视频一区中文字幕| 久久夜色精品国产亚洲aⅴ| 国产精品色悠悠| www.午夜精品| 色yeye香蕉凹凸一区二区av| 国产精品视频不卡| 亚洲欧美中文日韩在线| 欧美日韩在线视频一区二区| 久久精品美女视频网站| 永久555www成人免费| 国产美女精品视频免费观看| 国产精品www网站| 国产精品久久久久久久久久新婚| 中文字幕日韩在线视频| 51ⅴ精品国产91久久久久久| 国产精品海角社区在线观看| 久久久免费在线观看| 国产精品丝袜视频| 欧美肥臀大乳一区二区免费视频| 日韩一区二区精品视频| 亚洲第一免费播放区| 久久国产精品久久久| 日韩视频免费大全中文字幕| 国产一区二区三区网站| 疯狂欧美牲乱大交777| 日韩精品中文字幕视频在线| 欧美一级淫片videoshd| 日韩在线视频观看正片免费网站| 主播福利视频一区| 欧美性视频精品| 欧美日韩国产精品一区二区不卡中文| 91精品国产九九九久久久亚洲| 国产精品久久久久久久app| 在线色欧美三级视频| 久久精品久久久久久| 欧美另类69精品久久久久9999| 欧美激情国产精品| 国产精品一区二区久久精品| 国产欧美久久一区二区| 一本色道久久综合狠狠躁篇怎么玩| 亚洲成年人在线播放| 国产精品女主播| 亚洲人成伊人成综合网久久久| 亚洲精品日韩久久久| 国产精品福利在线| 中日韩午夜理伦电影免费| 在线看片第一页欧美| 26uuu另类亚洲欧美日本老年| 亚洲国产精品高清久久久| 精品久久久久久国产| 国产91精品网站| 久久激情五月丁香伊人| 中文日韩在线观看| 国产午夜精品免费一区二区三区|