微信官方对于小程序码的获取可以查看连接https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/qr-code.html
接口B,可以生成不受数量限制的小程序码,并且支持不太长的path和不超过32字符的参数。这样的话,就可以使用path和对应的参数来做一些事情。
简单来说,生成小程序码,是访问网址https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN
,并发起 post 请求,请求参数是一个 json 字符串,json 字符串的具体说明可以查看接口B的说明
我从官网摘下来了
属性 | 类型 | 默认值 | 必填 | 说明 |
---|---|---|---|---|
access_token | string | 是 | 接口调用凭证 | |
scene | string | 是 | 最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&’()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式) | |
page | string | 主页 | 否 | 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面 |
width | number | 430 | 否 | 小程序码宽度,单位是px,最小280px,最大 1280px |
auto_color | boolean | false | 否 | 自动配置线条颜色,如果颜色依然是黑色,则说明不建议配置主色调,默认 false |
line_color | Object | {“r”:0,”g”:0,”b”:0} | 否 | auto_color 为 false 时生效,使用 rgb 设置颜色 例如 {“r”:”xxx”,”g”:”xxx”,”b”:”xxx”} 十进制表示 |
is_hyaline | boolean | false | 否 | 是否需要透明底色,为 true 时,生成透明底色的小程序 |
access_token 是使用小程序的 appid 和 appsecret 生成的,可以查看接口调用凭证
简单来说,就是访问使用 appid 和 appsecret 拼接而成的 https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
,发起 Get 请求,appid和appsecret 正确的情况下,会返回一个 json 字符串。
本文使用 libcurl 来实现访问微信服务器并最后获得小程序码的步骤。
libcurl 发起 post 请求和 get 请求
为了方便操作,建议使用linux操作系统,Windows可能会面临一系列的 libcurl 及其库的编译,不熟悉的情况下,操作是十分繁琐的。
下面的实现是参考了 libcurl 的sample来实现的
1 |
|
函数
1 | int handle_https_callback(const char* url, const char* parameter, size_t size_send, void** responsedata, size_t* size_receive, char** content_type, bool post, bool verbose) |
属性 | 参数 | 说明 |
---|---|---|
传入参数 | url | 想要访问的url |
传入参数 | post | 是否发起 post |
传入参数 | parameter | 如果以 post 方式发起请求,parameter 是想要发送的数据, 如果不是以 post 方式发起,此参数为 NULL |
传入参数 | size_send | 要发送的数据长度,实际上发送的数据长度以 parameter 的 长度和 size_send 中去较小值 |
传出参数 | responsedata | 服务器发送回来的数据 |
传出参数 | size_receive | 服务器发送回来的数据的长度 |
传出参数 | content_type | 如果是获取 access_token ,那么这里的 content_type 应该 是 “application/json; encoding=utf-8”,如果是小程序码,那么这里 应该是”Image/jpeg”或者别的类型的content type |
传入参数 | verbose | 设置是否打印 curl 调用过程中的信息 |
常见的 Content-Type 可能有以下这些(摘自 cpp-httplib 的 README)
Extension | MIME Type | Extension | MIME Type |
---|---|---|---|
css | text/css | mpga | audio/mpeg |
csv | text/csv | weba | audio/webm |
txt | text/plain | wav | audio/wave |
vtt | text/vtt | otf | font/otf |
html, htm | text/html | ttf | font/ttf |
apng | image/apng | woff | font/woff |
avif | image/avif | woff2 | font/woff2 |
bmp | image/bmp | 7z | application/x-7z-compressed |
gif | image/gif | atom | application/atom+xml |
png | image/png | application/pdf | |
svg | image/svg+xml | mjs, js | application/javascript |
webp | image/webp | json | application/json |
ico | image/x-icon | rss | application/rss+xml |
tif | image/tiff | tar | application/x-tar |
tiff | image/tiff | xhtml, xht | application/xhtml+xml |
jpeg, jpg | image/jpeg | xslt | application/xslt+xml |
mp4 | video/mp4 | xml | application/xml |
mpeg | video/mpeg | gz | application/gzip |
webm | video/webm | zip | application/zip |
mp3 | audio/mp3 | wasm | application/wasm |
获取 access_token
基于上面的使用 libcurl 发起 post 和 get 请求,可以很容以的再封装一下,成为根据 appid 和 appsecret 来获取小程序的 access_token 的实现。
1 |
|
获取小程序二维码
和获取 access_token 类似,稍微封装一下就可以改写成为根据 access_token 获取小程序码的接口了
1 |
|
使用示范
1 | //main.cc |
依赖
在 ubuntu 上,由于使用了 libcurl 访问https的链接,可以尝试安装这个包 libcurl4-openssl-dev
在对返回值的处理中,使用了 rapidjson 作为处理json的库,可以尝试安装这个包rapidjson-dev
编译时需要使用 -lssl -lcurl
作为链接库
Windows 上,尝试使用 vcpkg 来安装 libcurl