热度 11
2020-4-9 09:38
6356 次阅读|
2 个评论
首先,我们先来看一下 微信小程序的API调用文档 : https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/access-token/auth.getAccessToken.html 通过阅读可知,我们必须先要 获取小程序全局唯一后台接口调用凭据( access_token )。这是通过一个GET请求实现的。 然后,文档给出了 GET请求的地址 : https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET 我们首先要了解请求地址的主要参数,这个在文档中也已给出,本博文做简单介绍: grant_type:默认client_credential即可。 appid:小程序的AppId, 小程序唯一凭证,即 AppID ,可在「 微信公众平台 - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态) 。 secret:小程序的密钥,获取方法同AppId,需妥善保存。 然后,我们可以看到文档中指出GET请求的返回值是Json数据包,因此我们在写程序时要考虑解析Json数据包,以期获得我们需要的参数。 在这里,需要注意,返回值中除了有我们需要的access_token外,还有其他的参数: expires_in:凭证有效时间,一般为2小时。因此如果我们希望数据可以一直post到微信小程序云开发数据库上,就必须实现access_token的动态获取。这个可以通过程序实现,文档中也给出了其他的方法。 errcode、errmsg:错误码与错误信息,这个在我们编程后的调试过程中非常重要。我们在实际调试过程中会因为出现一些错误无法GET到我们需要的数据,这时候就要通过错误码与错误信息来检查我们的程序与硬件,这样做无疑会事半功倍。如果盲目地修改程序往往会事倍功半。 通过以上了解,实际上我们已经把程序实现的基本思路想清楚了:通过一个GET请求,获取返回的Json数据包,解析出我们想要的参数。 因为是通过NodeMcu这块开发板实现的,所以实现的方式多种多样。我选择通过ArduinoIDE编程实现。 /*引入各种库*/ #include #include #include #include #include #include ESP8266WiFiMulti WiFiMulti; /*设置各种参数*/ const char wifiSSID = "xxxxxx";//wifi密码 const char httpsUrl PROGMEM = "f9 aa 18 e0 bf 74 7d 52 f4 f6 a5 f4 9d 66 be af 72 54 13 8f"; //获取指纹,具体获取方法后期博文给出,也可自行百度 String accessToken;//储存access_token参数 int expiresIn;//储存凭证有效时间 void setup() { Serial.begin(115200); //Serial.setDebugOutput(true); Serial.println(); Serial.println(); Serial.println(); 0; t--) { Serial.printf(" WAIT %d...\n", t); Serial.flush(); delay(1000); } wifiSetup();//连接wifi } void loop() { GetReq();//实现我们的需求:GET、解析、返回所需参数 Serial.printf("%s",accessToken.c_str()); Serial.println("Wait 10s before next round..."); delay(10000); } void wifiSetup() { WiFi.mode(WIFI_STA); WiFiMulti.addAP(wifiSSID, wifiPassword); }//连接wifi bool GetReq() { Serial.printf(" Connect wifi(%s)...\n", wifiSSID); if ((WiFiMulti.run() != WL_CONNECTED)) { Serial.println(" WiFi connect failed"); return false; } Serial.printf(" Set fingerprint(%s)...\n", httpsFingerprint); BearSSL::WiFiClientSecure client; bool ret = client.setFingerprint(httpsFingerprint); if (!ret) { Serial.println(" Set fingerprint failed"); return false; } Serial.printf(" Connect remote(%s)...\n", httpsUrl); HTTPClient https; ret = https.begin(client, httpsUrl); if (!ret) { Serial.println(" Begin connect failed"); return false; } Serial.println(" Req data..."); int httpCode = https.GET(); Serial.printf(" Rsp code: %d %s\n", httpCode, https.errorToString(httpCode).c_str()); 0) { if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) { String payload = https.getString(); Serial.printf(" Rsp payload: %s\n", payload.c_str()); JSONVar jsonObject = JSON.parse(payload.c_str()); JSONVar keys = jsonObject.keys(); for (int i = 0; i < keys.length(); i++) { JSONVar value = jsonObject ]; Serial.printf(" Rsp data: %s %s\n", (const char*)keys , JSONVar::stringify(value).c_str()); } if (jsonObject.hasOwnProperty("access_token")) { accessToken = jsonObject ; } if (jsonObject.hasOwnProperty("expires_in")) { expiresIn = (int)jsonObject ; } Serial.printf(" Got data: access_token(%s) expires_in(%d)\n", accessToken.c_str(), expiresIn); } } https.end(); return true; }//向目标地址发出Get请求并解析返回json数据包 以上就是本篇博文的全部内容,总结: 要想连接微信小程序云开发数据库,需要access_token这一参数,我们获取的方式就是通过GET请求。返回的数据是Json数据包,我们需要解析后才可获取所需参数。 但已然获取access_token后我们如何向云开发数据库插入数据呢? 在下一篇博文中我会详细介绍,如何通过POST请求向我们的微信小程序云开发数据库插入数据。