生成小程序二维码,并上传oss

最近在做小程序,有个需求是生成小程序的二维码,扫二维码,进入到小程序指定页面。

1、获取token

获取小程序二维码之前,首先需要获取access_token。access_token是有时效性的2小时,每获取一次上次的的access_token就会失效。我们把请求到的access_token放到redis,失效时间设置为2小时,每次请求token,先从redis取,取不到则请求微信获取access_token。

 @Autowired
 private StringRedisTemplate stringRedisTemplate;


public String getToken(String appId,String secret) {
        Token instanceToken = getAccessToken(appId);
        return instanceToken == null ? "" : instanceToken.getAccess_token();
    }

    public Token getAccessToken(String appid) {
        Token instanceToken = null;
        try {

            String tokenJson = stringRedisTemplate.get(ConstantRedis.REDIS_KEY.WECHAT_ACCESS_TOKEN.generateFullKey(appid));
            if (!StringUtils.isEmpty(tokenJson)) {
                instanceToken = JSON.parseObject(tokenJson, Token.class);
            }
           
            if (instanceToken == null || StringUtils.isEmpty(instanceToken.getAccess_token()) || instanceToken.isExpire()) {
                instanceToken = WechatAPI.getToken(appid,secret);
                
                if (instanceToken == null || StringUtils.isEmpty(instanceToken.getAccess_token())) {
                    return null;
                }

                stringRedisTemplate.set(ConstantRedis.REDIS_KEY.WECHAT_ACCESS_TOKEN.generateFullKey(appid), instanceToken, 7200L);
            }
        } catch (IOException ex) {
            logger.error("getAccessToken exception...{}", ex);
        }
        return instanceToken;
    }
public class WechatAPI {

   privite static final String WECHAT_URI = "https://api.weixin.qq.com";

    /**
     * 调用微信SDK请求获取access_token
     * @param appid
     * @param secret
     * @return
     */
    public static Token getToken(String appid, String secret) {
        HttpUriRequest httpUriRequest = RequestBuilder.get()
                .setUri(WECHAT_URI + "/cgi-bin/token")
                .addParameter("grant_type", "client_credential")
                .addParameter("appid", appid)
                .addParameter("secret", secret)
                .build();
        Token token = MyHttpClient.executeJsonResult(httpUriRequest, Token.class);
        token.setCreate_time_millis(System.currentTimeMillis());
        return token;
    }
}
package com.wechat.client;

import org.apache.http.client.ResponseHandler;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpUriRequest;
import org.apache.http.client.protocol.HttpClientContext;
import org.apache.http.impl.client.CloseableHttpClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.IOException;

public class MyHttpClient {

    private static final int maxTotal = 100;
    private static final int maxPerRouter = 10;
    private static final int timeout = 6000;
    private static final int retryExecutionCount = 1;

    private static final Logger logger = LoggerFactory.getLogger(MyHttpClient.class);

    protected static CloseableHttpClient httpClient = HttpClientFactory.createHttpClient(maxTotal, maxPerRouter, timeout, retryExecutionCount);

    public static void init(int maxTotal, int maxPerRoute) {
        try {
            httpClient.close();
            httpClient = HttpClientFactory.createHttpClient(maxTotal, maxPerRoute, timeout, retryExecutionCount);
        } catch (IOException e) {
            logger.error("init exception...", e);
        }
    }

    public static CloseableHttpResponse execute(HttpUriRequest request) {
        try {
            return httpClient.execute(request, HttpClientContext.create());
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("CloseableHttpResponse exception...", e);
        }
        return null;
    }

    public static <T> T execute(HttpUriRequest request, ResponseHandler<T> responseHandler) {
        try {
            T t = httpClient.execute(request, responseHandler, HttpClientContext.create());
            return t;
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("execute exception...", e);
        }
        return null;
    }

    public static <T> T executeJsonResult(HttpUriRequest request, Class<T> clazz) {
        return execute(request, JsonResponseHandler.createResponseHandler(clazz));
    }
}

 

public class Token implements Serializable {

    private String access_token;
    private long expires_in;
    private long create_time_millis;

    private static final long MILLIS = 1000L;

    public String getAccess_token() {
        return access_token;
    }

    public void setAccess_token(String access_token) {
        this.access_token = access_token;
    }

    public long getExpires_in() {
        return expires_in;
    }

    public void setExpires_in(long expires_in) {
        this.expires_in = expires_in;
    }

    public long getCreate_time_millis() {
        return create_time_millis;
    }

    public void setCreate_time_millis(long create_time_millis) {
        this.create_time_millis = create_time_millis;
    }
}

2、有了access_token我们就可以请求微信SDK获取二维码了。

 public String getQrcode(QrcodeReq qrcodeReq) {

        InputStream inputStream = null;
        String fileName = "";
        String key = "qrcode"+qrcodeReq.getVideoId();
        try {
            String token = getToken(qrcodeReq.getAppId());
            logger.info("getQrcode  token:{}", token);
            fileName= "qrcode/qrcode"+qrcodeReq.getVideoId()+".png";

            RestTemplate rest = new RestTemplate();
            String url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + token;
            Map<String, Object> param = new HashMap<>();
            param.put("scene", "xxxxxxxxx");
          
            param.put("page", "pages/play/play");
            param.put("width", qrcodeReq.getWidth());
            param.put("auto_color", false);
            Map<String, Object> line_color = new HashMap<>();
            line_color.put("r", 0);
            line_color.put("g", 0);
            line_color.put("b", 0);
            param.put("line_color", line_color);
            logger.info("调用生成微信URL接口传参:" + param);
            MultiValueMap<String, String> headers = new LinkedMultiValueMap<>();
            headers.add("Content-Type", "application/json");
            HttpEntity requestEntity = new HttpEntity(JSON.toJSON(param), headers);
            ResponseEntity<byte[]> entity = rest.exchange(url, HttpMethod.POST, requestEntity, byte[].class, new Object[0]);
            byte[] result = entity.getBody();
            String re = JsonUtil.decodeBase64(JSON.toJSONString(entity.getBody()));
            if (entity.getBody() !=null && !re.contains("errcode")){
                inputStream = new ByteArrayInputStream(result);
                String str = uploadService.putObject(fileName, inputStream);
            }else {
                logger.info("调用小程序生成微信永久小程序码URL接口返回结果:" + re);
            }
        }catch (Exception e){
            logger.error("getQrcode:{}",e);
        }finally {
            if (inputStream !=null){
                try {
                    inputStream.close();
                } catch (IOException e) {
                    logger.error("getQrcode:{}",e);
                }
            }
        }
        return fileName;
    }

3、上传oss

  public String putObject(String filename,InputStream inputStream) {

        // 上传Object.
        PutObjectResult result = null;
        try {
            result = client.putObject(defaultBucket, filename, inputStream);
        } catch (OSSException e) {
            logger.info("putObject putObject to oss error:{}",e);
        } catch (ClientException e) {
            logger.info("putObject putObject to oss error:{}",e);
        }
        String path = result.getETag();
        if (StringUtils.isEmpty(path)){
            return "";
        }else {
            return path;
        }
    }

4、有了二维码。总得测试一下,不然我好慌。

在微信开发这工具编译的左边的下拉框,是可以自定义编译的,启动页面和启动参数分别是请求生成二维码的page、scene。

小程序页面 js

 /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {

     // 扫二维码
    if (options.scene) {

      let scene = decodeURIComponent(options.scene);
    
    // 
    }else{

    
    }

 

好了,获取小程序二维码就简单介绍到这了,有问题请留言吧  (^v^)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 如果你想将图片转换成二维码上传OSS服务器,你可以使用以下步骤: 1. 安装必要的依赖库。你需要安装 `pyqrcode` 和 `boto3` 库来生成二维码和连接到OSS服务器。你可以使用以下命令安装这些库: ``` pip install pyqrcode boto3 ``` 2. 生成二维码。你可以使用 `pyqrcode` 库来生成二维码。例如,你可以使用以下代码生成一个包含文本 `hello world` 的二维码: ```python import pyqrcode qr = pyqrcode.create('hello world') ``` 3. 将二维码保存到文件中。你可以使用 `save` 方法将二维码保存到文件中。例如,你可以使用以下代码将二维码保存为 `qrcode.png` 文件: ```python qr.png('qrcode.png', scale=8) ``` 4. 连接到OSS服务器。你可以使用 `boto3` 库来连接到OSS服务器。首先,你需要在OSS控制台中获取你的访问密钥和密钥ID。然后,你可以使用以下代码连接到OSS服务器: ```python import boto3 # Replace with your access key and secret key ACCESS_KEY = 'your access key' SECRET_KEY = 'your secret key' # Connect to the OSS server oss = boto3.client( 's3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY, ) ``` 5. 上传文件。你可以使用 `upload_file` 方法将 ### 回答2: 要实现将图片转成二维码上传OSS服务器,可以通过以下步骤完成。 首先,我们需要选择一个合适的开发工具来实现图片转二维码功能。常用的工具有Python的qrcode库,Java的zxing(Zebra Crossing)库等。 接下来,我们需要下载并安装选定的开发工具,并在项目中导入相关的库和依赖项。 然后,我们需要编写代码来实现图片转二维码的功能。代码中需要将图片加载进内存,并使用二维码库将其转换成二维码。转换完成后,可以将二维码保存为图片文件,或者直接将其存储在内存中。 接下来,我们需要连接到OSS服务器,并在其中创建一个存储图片的目录。需要使用连接OSS服务器的相关信息,例如访问URL、Access Key等。 然后,我们需要将生成二维码上传OSS服务器。可以使用选定的开发工具提供的上传功能,将二维码文件上传至指定目录。 最后,我们可以在OSS服务器上验证上传是否成功,通过访问相应的URL来获取二维码图片。 综上所述,要实现图片转成二维码上传OSS服务器,需要选择合适的开发工具,编写代码来实现图片转二维码功能,连接OSS服务器并上传二维码文件。只要按照以上步骤进行操作,就可以将图片转成二维码并存储到OSS服务器上。 ### 回答3: 要将图片转成二维码上传OSS服务器,需要以下步骤: 首先,需要安装一个二维码生成库。可以选择使用Python的qrcode库来生成二维码。可以使用pip命令安装: ``` pip install qrcode ``` 然后,导入qrcode库,并使用库的make函数生成二维码。将要转换的图片作为输入参数传递给make函数,生成二维码对象。 ```python import qrcode image_path = 'image.jpg' qr = qrcode.make(image_path) ``` 接下来,需要将生成二维码保存为图片文件。可以使用二维码对象的save函数保存为图片。 ```python qr.save('qrcode.png') ``` 生成二维码图片可以进行进一步操作,如调整大小、添加logo等。然后,将生成二维码图片上传到阿里云OSS服务器,可以使用阿里云的Python SDK。 首先,需要安装阿里云的Python SDK。可以使用pip命令安装。 ``` pip install aliyun-python-sdk-core-v3 ``` 然后,导入阿里云的Python SDK,并进行相关的配置。 ```python from aliyunsdkcore import client access_key_id = 'your_access_key_id' access_secret = 'your_access_secret' endpoint = 'your_oss_endpoint' bucket = 'your_bucket_name' clt = client.AcsClient(access_key_id, access_secret, endpoint) ``` 接下来,使用OSS的BucketManager对象上传二维码图片。 ```python from aliyunsdkcore.request import CommonRequest request = CommonRequest() request.set_accept_format('json') request.set_domain(endpoint) request.set_method('PUT') request.set_protocol_type('https') request.set_bucket_name(bucket) request.set_key('qrcode.png') # 设置上传后的文件名 request.set_input_file('qrcode.png') # 设置要上传的文件路径 response = clt.do_action(request) ``` 以上就是将图片转成二维码上传OSS服务器的步骤。注意替换代码中的相应配置信息,确保代码正常运行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值