因为微信小程序通过接口返回出来的图片是二进制流,我们通过后端获取小程序二维码,之后返回给前端,稍微有点小麻烦。
网上搜到大多数的解决方案不管是返回给前端 base64
编码,还是返回 url
,都是通过接受微信返回的二进制流存储一张图片到服务器。笔者考虑存储服务器并不妥,本文的解决方案在不做服务器存储操作的前提下返回 base64
编码给前端。本文使用的PHP扩展包是 Guzzlehttp
, 使用该扩展包,我们不必去自行封装 CURL
请求。关于该扩展包具体介绍这里不做展开,可以自行探索。
完整代码如下:
1 | public function getwxacodeGetUnlimited($params) |
下面对上述代码进行解释
access_token
是要以query string
的形式附加在请求地址后面的,如果添加到POST
请求中,微信回报错的。- 代码中的
client
实际就是Guzzlehttp
的实例对象。需注意Guzzlehttp
实际的使用方式是实例对象之后以$client->post()
这种方式调用的,笔者公司的框架对Guzzlehttp
进行了二次封装。 - 我们使用了
Guzzlehttp
的post
方法getUrl()
是我们封装的获取微信请求地址的方法,请读者自行实现,看过微信文档的话,这里不难理解,也不难实现。 - 注意
Guzzlehttp
的post()
方法的第二个参数,由于微信接收的是json
数据,所以我们采用[ 'json' => $args ]
,Guzzlehttp
内部已经帮我们实现了请求头的添加和数据的json
编码。 注意微信返回的数据,官方文档写的是
Buffer
, 我们在接收的时候,判断只要不是json
格式,即获取到header
并且获取到数据流,将数据流做base64_encode
,然后拼接在data:image/jpeg;base64,
后面即构成了图片的完整base64
编码。 其中image/jpeg
是我们从header
中拿到的。通过该种方式,我们即不需要在服务器上存储任何图片信息,以造成负担。当然如果有特殊需求的另当别论。