原创 NodeMcu接入微信小程序云开发数据库的实现方法

2020-4-9 09:38 6356 62 11 分类: 物联网 文集: NodeMcu

首先,我们先来看一下微信小程序的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编程实现。

  1. /*引入各种库*/
  2. #include <Arduino.h>
  3. #include <Arduino_JSON.h>
  4. #include <ESP8266WiFi.h>
  5. #include <ESP8266WiFiMulti.h>
  6. #include <ESP8266HTTPClient.h>
  7. #include <WiFiClientSecureBearSSL.h>
  8. ESP8266WiFiMulti WiFiMulti;
  9. /*设置各种参数*/
  10. const char wifiSSID[] = "xxxxxx";//wifi名称
  11. const char wifiPassword[] = "xxxxxx";//wifi密码
  12. const char httpsUrl[] PROGMEM = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxxxxx&secret=xxxxxx";
  13. //根据要求填写自己的GET请求地址
  14. const char httpsFingerprint[] PROGMEM = "f9 aa 18 e0 bf 74 7d 52 f4 f6 a5 f4 9d 66 be af 72 54 13 8f";
  15. //获取指纹,具体获取方法后期博文给出,也可自行百度
  16. String accessToken;//储存access_token参数
  17. int expiresIn;//储存凭证有效时间
  18. void setup() {
  19. Serial.begin(115200);
  20. //Serial.setDebugOutput(true);
  21. Serial.println();
  22. Serial.println();
  23. Serial.println();
  24. for (uint8_t t = 4; t > 0; t--) {
  25. Serial.printf("[SETUP] WAIT %d...\n", t);
  26. Serial.flush();
  27. delay(1000);
  28. }
  29. wifiSetup();//连接wifi
  30. }
  31. void loop() {
  32. GetReq();//实现我们的需求:GET、解析、返回所需参数
  33. Serial.printf("%s",accessToken.c_str());
  34. Serial.println("Wait 10s before next round...");
  35. delay(10000);
  36. }
  37. void wifiSetup() {
  38. WiFi.mode(WIFI_STA);
  39. WiFiMulti.addAP(wifiSSID, wifiPassword);
  40. }//连接wifi
  41. bool GetReq() {
  42. Serial.printf("[HTTPS] Connect wifi(%s)...\n", wifiSSID);
  43. if ((WiFiMulti.run() != WL_CONNECTED)) {
  44. Serial.println("[HTTPS] WiFi connect failed");
  45. return false;
  46. }
  47. Serial.printf("[HTTPS] Set fingerprint(%s)...\n", httpsFingerprint);
  48. BearSSL::WiFiClientSecure client;
  49. bool ret = client.setFingerprint(httpsFingerprint);
  50. if (!ret) {
  51. Serial.println("[HTTPS] Set fingerprint failed");
  52. return false;
  53. }
  54. Serial.printf("[HTTPS] Connect remote(%s)...\n", httpsUrl);
  55. HTTPClient https;
  56. ret = https.begin(client, httpsUrl);
  57. if (!ret) {
  58. Serial.println("[HTTPS] Begin connect failed");
  59. return false;
  60. }
  61. Serial.println("[HTTPS] Req data...");
  62. int httpCode = https.GET();
  63. Serial.printf("[HTTPS] Rsp code: %d %s\n", httpCode, https.errorToString(httpCode).c_str());
  64. if (httpCode > 0) {
  65. if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
  66. String payload = https.getString();
  67. Serial.printf("[HTTPS] Rsp payload: %s\n", payload.c_str());
  68. JSONVar jsonObject = JSON.parse(payload.c_str());
  69. JSONVar keys = jsonObject.keys();
  70. for (int i = 0; i < keys.length(); i++) {
  71. JSONVar value = jsonObject[keys[i]];
  72. Serial.printf("[HTTPS] Rsp data: %s %s\n", (const char*)keys[i], JSONVar::stringify(value).c_str());
  73. }
  74. if (jsonObject.hasOwnProperty("access_token")) {
  75. accessToken = jsonObject["access_token"];
  76. }
  77. if (jsonObject.hasOwnProperty("expires_in")) {
  78. expiresIn = (int)jsonObject["expires_in"];
  79. }
  80. Serial.printf("[HTTPS] Got data: access_token(%s) expires_in(%d)\n", accessToken.c_str(), expiresIn);
  81. }
  82. }
  83. https.end();
  84. return true;
  85. }//向目标地址发出Get请求并解析返回json数据包

以上就是本篇博文的全部内容,总结:

要想连接微信小程序云开发数据库,需要access_token这一参数,我们获取的方式就是通过GET请求。返回的数据是Json数据包,我们需要解析后才可获取所需参数。

但已然获取access_token后我们如何向云开发数据库插入数据呢?

在下一篇博文中我会详细介绍,如何通过POST请求向我们的微信小程序云开发数据库插入数据。




    

作者: 王土豆, 来源:面包板社区

链接: https://mbb.eet-china.com/blog/uid-me-3897735.html

版权声明:本文为博主原创,未经本人允许,禁止转载!

PARTNER CONTENT

文章评论2条评论)

登录后参与讨论

王土豆 2020-4-11 09:36

eeNick: 王土豆同学不错
谢谢老师

eeNick 2020-4-10 14:51

王土豆同学不错
相关推荐阅读
王土豆 2020-04-11 09:27
POST数据到微信小程序云开发数据库
上一篇博文中,我介绍了我在实现NodeMcu向云开发数据库发送数据时的思路以及程序代码。我们已经知道要想发送数据,首先我们要GET到access_token。那么好,如今我们已经GET到access_...
王土豆 2020-03-28 21:43
1602LCD简介与基于Arduino的使用
一、1602LCD简介液晶显示器简称LCD。1602液晶也叫1602字符型液晶,是指显示的内容为16X2(即可显示两行,每行16个字符)的液晶模块。使用1602液晶制作的显示器也就叫做1602LCD。...
EE直播间
更多
我要评论
2
62
关闭 站长推荐上一条 /3 下一条