NodeMcu通过GET请求获取微信小程序access_token-Arduino中文社区 - Powered by Discuz!

Arduino中文社区

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 2877|回复: 0

NodeMcu通过GET请求获取微信小程序access_token

[复制链接]
发表于 2020-4-9 12:18 | 显示全部楼层 |阅读模式
本帖最后由 Hacker_Wang 于 2020-4-9 12:24 编辑
首先,我们先来看一下微信小程序的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,可在「[url=]微信公众平台[/url] - 设置 - 开发设置」页中获得。(需要已经成为开发者,且帐号没有异常状态)。
secret:小程序的密钥,获取方法同AppID,需妥善保存。
然后,我们可以看到文档中指出GET请求的返回值是Json数据包,因此我们在写程序时要考虑解析Json数据包,以期获得我们需要的参数。
在这里,需要注意,返回值中除了有我们需要的access_token外,还有其他的参数:
expires_in:凭证有效时间,一般为2小时。因此如果我们希望数据可以一直post到微信小程序云开发数据库上,就必须实现access_token的动态获取。这个可以通过程序实现,文档中也给出了其他的方法。
errcode、errmsg:错误码与错误信息,这个在我们编程后的调试过程中非常重要。我们在实际调试过程中会因为出现一些错误无法GET到我们需要的数据,这时候就要通过错误码与错误信息来检查我们的程序与硬件,这样做无疑会事半功倍。如果盲目地修改程序往往会事倍功半。
通过以上了解,实际上我们已经把程序实现的基本思路想清楚了:通过一个GET请求,获取返回的Json数据包,解析出我们想要的参数。
接下来,我给出程序来实现上述功能。注意:本程序并未实现动态获取access_token的功能,若需要请自行编程实现
[mw_shl_code=arduino,true]/*引入各种库*/
#include <Arduino.h>
#include <Arduino_JSON.h>
#include <ESP8266WiFi.h>
#include <ESP8266WiFiMulti.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClientSecureBearSSL.h>
ESP8266WiFiMulti WiFiMulti;
/*设置各种参数*/
const char wifiSSID[] = "xxxxxx";//wifi名称
const char wifiPassword[] = "xxxxxx";//wifi密码
const char httpsUrl[] PROGMEM = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=xxxxxx&secret=xxxxxx";
//根据要求填写自己的GET请求地址
const char httpsFingerprint[] 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();
for (uint8_t t = 4; t > 0; t--) {
Serial.printf("[SETUP] 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("[HTTPS] Connect wifi(%s)...\n", wifiSSID);
if ((WiFiMulti.run() != WL_CONNECTED)) {
Serial.println("[HTTPS] WiFi connect failed");
return false;
}
Serial.printf("[HTTPS] Set fingerprint(%s)...\n", httpsFingerprint);
BearSSL::WiFiClientSecure client;
bool ret = client.setFingerprint(httpsFingerprint);
if (!ret) {
Serial.println("[HTTPS] Set fingerprint failed");
return false;
}
Serial.printf("[HTTPS] Connect remote(%s)...\n", httpsUrl);
HTTPClient https;
ret = https.begin(client, httpsUrl);
if (!ret) {
Serial.println("[HTTPS] Begin connect failed");
return false;
}
Serial.println("[HTTPS] Req data...");
int httpCode = https.GET();
Serial.printf("[HTTPS] Rsp code: %d %s\n", httpCode, https.errorToString(httpCode).c_str());
if (httpCode > 0) {
if (httpCode == HTTP_CODE_OK || httpCode == HTTP_CODE_MOVED_PERMANENTLY) {
String payload = https.getString();
Serial.printf("[HTTPS] 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[keys];
Serial.printf("[HTTPS] Rsp data: %s %s\n", (const char*)keys, JSONVar::stringify(value).c_str());
}
if (jsonObject.hasOwnProperty("access_token")) {
accessToken = jsonObject["access_token"];
}
if (jsonObject.hasOwnProperty("expires_in")) {
expiresIn = (int)jsonObject["expires_in"];
}
Serial.printf("[HTTPS] Got data: access_token(%s) expires_in(%d)\n", accessToken.c_str(), expiresIn);
}
}
https.end();
return true;
}//向目标地址发出Get请求并解析返回json数据包[/mw_shl_code]
以上就是本篇帖子的全部内容,总结:
要想连接微信小程序云开发数据库,需要access_token这一参数,我们获取的方式就是通过GET请求。返回的数据是Json数据包,我们需要解析后才可获取所需参数。
有了access_token,我们就可以做很多事了。之后的帖子我会讲述一下如何通过NodeMcu使用POST请求向微信小程序云开发数据库插入数据。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|Archiver|手机版|Arduino中文社区

GMT+8, 2024-11-28 10:46 , Processed in 0.072819 second(s), 16 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表