真实需求
除了转发到群里,让群里用户点击小程序进行报名。有时,还需要能将指定活动的小程序二维码打印出来,放在线下方便参与者用手机扫码打开小程序进行报名。
本地开发测试
由于每次生成 token,都会导致之前的 token 失效,所以需要能在本地开发环境获取到线上的 token。
最简单的做法,在每次线上启动阶段获取的 token 打印到日志里,或者写入一个指定文件。然后在测试环境使用写死的 token。
下载小程码
为了导出太阳码,而引入一个 canvas 库,增加小程序安装包体积,并不值得。因为会导致启动加载变慢。其实最简单的做法是,直接后台生成图片,前端加载图片即可。
参考代码:
http://code.lncios.cn/order_system/order_service/src/23e6300550ef270998496a638fb839284359152f/service/qrcode.go
// 获取小程序码
func (q qrcode) getQrMCode(shopId string, accessToken, page string) []byte {
path := "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken
client := &http.Client{}
params := `{"scene":"shopId=` + shopId + `", "page": "` + page + `"}`
reqBody := bytes.NewBuffer([]byte(params))
request, _ := http.NewRequest("POST", path, reqBody)
request.Header.Set("Content-type", "application/json")
response, _ := client.Do(request)
if response.StatusCode == 200 {
body, err := ioutil.ReadAll(response.Body)
if err != nil {
}
return body
}
return nil
}
保存到文件的方法:
https://stackoverflow.com/questions/22417283/save-an-image-from-url-to-file
import (
"fmt"
"io"
"log"
"net/http"
"os"
)
func main() {
url := "http://i.imgur.com/m1UIjW1.jpg"
// don't worry about errors
response, e := http.Get(url)
if e != nil {
log.Fatal(e)
}
defer response.Body.Close()
//open a file for writing
file, err := os.Create("/tmp/asdf.jpg")
if err != nil {
log.Fatal(err)
}
defer file.Close()
// Use io.Copy to just dump the response body to the file. This supports huge files
_, err = io.Copy(file, response.Body)
if err != nil {
log.Fatal(err)
}
fmt.Println("Success!")
}
可选太阳码还是二维码
需要确认二维码是否有生成次数的限制
功能入口放哪里
在活动详情入口处。不更改报名清单页了,因为每次都要广告审核,很容易失败。
定期清理
历史图片。
利用 golang cron,凌晨清理掉图片目录。
参考文档
- https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式