1. 程式人生 > >最近把beecloud,芝麻信用,智慧門鎖接入了系統。閒下來把遇到的一些坑排下,也能給後人一些指導

最近把beecloud,芝麻信用,智慧門鎖接入了系統。閒下來把遇到的一些坑排下,也能給後人一些指導

一些程式碼片段為.net
1.beecloud。
這個其實沒有什麼好說的,主要就是直接用sdk就好了。
但也是有一些注意的點,因為我主要做的是掃碼槍這塊的東西,所以下面對這部分有一個詳細的講解。
a:掃碼槍這個東西其實是自帶一個提交操作的,意思就是在我們進行掃碼槍掃碼後其實就已經是提交了,所以在佈局這塊應該是先輸入金額等等資訊,最後掃碼槍然後自動提交,這樣是可以免除一次人工的操作的。
b.判斷掃碼槍傳回的是支付寶碼還是微信的碼(目前主要使用場景是這兩塊)beecloud的sdk是需要我們來指定是支付寶還是微信的,現在支付寶的條形碼規則是28開頭的18位數字,微信條形碼規則:18位純數字,以10、11、12、13、14、15開頭

if (model.corder.Substring(0, 2) == "28")//支付寶

如果說我們的使用者只是針對支付寶和微信的話,其實下面直接else就好了,但是有比如百度錢包等,這時候就需要我們對這些進行詳細的判斷區分了。

  BCBill paybill = new BCBill(BCPay.OfflinePayChannel.BC_ALI_SCAN.ToString(), Convert.ToInt32(model.Money * 100), model.Number,"掃碼槍支付寶支付");
                            paybill.store_id = BaseService.GetBranchidByBeecloud
(model.BranchID) == null ? null : BaseService.GetBranchidByBeecloud(model.BranchID); paybill.authCode = model.corder; Dictionary<string, string> dic = new Dictionary<string, string>(); dic.Add("branchid",model.BranchID
.ToString()); dic.Add("billid",model.BillID.ToString()); dic.Add("number",model.Number); paybill.optional = dic; BCBill resultbill = BCPay.BCOfflinePayByChannel(paybill); isboll = resultbill.result;

在beecloud中,對於金錢是int型別,所以我們在進行傳值的時候需要進行*100保證資料正取。
在程式碼中我們有兩種方式來接收是否支付成功,一種便是程式碼上中 isbool = resultbill.result。這個返回的是一個Bool型別。當然beecloud也是支援回撥返回,具體採用那種可以根據自己的需求進行選擇。
對於beecloud就到這裡。
下面是芝麻信用
2.芝麻信用
a.這個的話私鑰,公鑰應該是一個比較坑的地方,.net的話必須進行去頭去尾的操作,根據官方api的是需要進行很多次的解密操作才能獲得這個祕鑰,其實我們可以直接下載一個安裝包就好了。不需要去c++的環境去搗鼓。

    DefaultZmopClient client = new DefaultZmopClient(gatewayUrl, appId, privateKey, zhimaPublicKey, charset);
            ZhimaAuthInfoAuthorizeRequest request = new ZhimaAuthInfoAuthorizeRequest();
            request.SetChannel("apppc");
            request.SetPlatform("zmop");
            request.IdentityType = "2";  //必要引數             
            request.IdentityParam = "{\"name\":\"" + Username + "\",\"certType\":\"IDENTITY_CARD\",\"certNo\":\"" + UserCard + "\"}";  //必要引數             
            request.BizParams = "{\"auth_code\":\"M_H5\",\"channelType\":\"app\",\"state\":\"" + Str + "\"}";//自定義引數
            string url = client.generatePageRedirectInvokeUrl(request);
            return url;

一般來講我們的自定義引數要將我們當前獲取芝麻信用的使用者的id,或者token等標識資訊作為引數傳遞過去,因為我們需要將使用者的資訊進行更新嘛。
在這步最後我們會得到一個url,這個url是支付寶提供的一個掛起頁面具體頁面會根據你應用的場景不同,呼叫的api也不同。
最後就是解析回撥

string Parmar = Request.QueryString["params"];
string SignStr = Request.QueryString["sign"];

這個是我們要拿到的引數。這兩個引數是加密過的,所以我們要對這兩個引數進行解籤

//判斷串中是否有%,有則需要decode
            if (Parmar.IndexOf("%") != -1)
            {
                Parmar = HttpUtility.UrlDecode(Parmar);
            }
            if (SignStr.IndexOf("%") != -1)
            {
                SignStr = HttpUtility.UrlDecode(SignStr);
            }

string decryptedParam = client.decryptAndVerifySign(Parmar, SignStr);

decryptedParam就是我們最後所需要的資訊,裡面包括tokenid,還有我們的一些自定義引數

            //獲取芝麻分
            string datetimestr = DateTime.Now.ToString("yyyyMMddhhmmssfff");
            string numberstr = "0000000000001";
            ZhimaCreditScoreGetRequest request = new ZhimaCreditScoreGetRequest();
            request.SetChannel("apppc");
            request.SetPlatform("zmop");
            request.TransactionId = datetimestr + numberstr;  //必要引數             
            request.ProductCode = "w1010100100000000001";  //必要引數             
            request.OpenId = tokenid;  //必要引數             
            ZhimaCreditScoreGetResponse response = client.Execute(request);
            ZhimaCreditScoreGetResponse resp = response;

最後resp會返回當前查詢使用者的芝麻分數和業務編號。然後進行我們的業務操作就好了。
3.智慧門鎖-雲盯
智慧門鎖的話其實就是新增密碼,刪除密碼,修改密碼,更主要的是我們自身的業務邏輯,本身的api使用還是比較簡單的
1.獲取token

 string getjsonstr =  GetDdingApi.CreateHttpPostResponse(url, canshu);
            JObject obj = (JObject)JsonConvert.DeserializeObject(getjsonstr);//將json字串轉換成一個json物件
            string tokenstr = obj["access_token"].ToString();

token是整個api的一個重要的引數,所有的操作都是通過整個token來進行的。
然後雲盯的api進行傳參是以dic字典進行傳引數。
主要的引數為home_id,room_id,這兩個引數也是雲盯提供給我們,為了方便我們還是存在我們的庫中比較好,room_id是唯一的。
如果是做密碼模組的話,password_id是一個重要的引數,在後期的密碼修改刪除時,password_id是重要的引數進行判斷的。

 Dictionary<string, object> canshu = new Dictionary<string, object>();
            string token = DEVService.GetToken();
            Random rad = new Random();//例項化隨機數產生器rad;
            int password = rad.Next(100000, 999999);//用rad生成大於等於100000,小於等於999999的隨機數;6位密碼
            DateTime DateStart = new DateTime(1970, 1, 1, 8, 0, 0);
            int totime = Convert.ToInt32((DateTime.Now - DateStart).TotalSeconds);//當前時間的時間戳
            int edtime = Convert.ToInt32((Enddate - DateStart).TotalSeconds);//結束時間的時間戳
            canshu.Add("access_token", token);
            canshu.Add("home_id", home_id);
            canshu.Add("room_id", room_id);
            canshu.Add("password_id", Password_id);
            canshu.Add("password", password);
            canshu.Add("is_send_location", true);
            canshu.Add("phonenumber", Newbill.UserMobile);
            canshu.Add("name", Newbill.UserName);
            canshu.Add("permission_begin", totime);
            canshu.Add("permission_end", edtime);

雲盯的api是可以我們將使用者的姓名手機號傳遞過去進行傳送簡訊的操作的。