一、先上官方文档地址

登录 | 微信开放文档微信开发者平台文档https://developers.weixin.qq.com/miniprogram/dev/api-backend/二、小程序码生成

2.1、获取小程序的APPID和secret

/**
     * wx:
     *   appid: xxxxxxx   APPID             
     *   secret: xxxxxx   secret
     *   wxUrl: https://api.weixin.qq.com 微信域名
     *   getAccessTokenUrl: /cgi-bin/token  登录接口
     */

        2.2、直接上代码

package com.maxrocky.service.activity.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.maxrocky.common.tools.exception.ExceptionManager;
import com.maxrocky.common.tools.exception.PhantomException;
import com.maxrocky.common.utils.httpclient.HttpClientUtils;
import com.maxrocky.common.utils.httpclient.HttpResult;
import com.maxrocky.common.utils.json.UrlParamsUtils;
import com.maxrocky.common.utils.sign.SignUtils;
import com.maxrocky.common.utils.uuid.UUIDUtils;
import com.maxrocky.service.activity.WechatAppletService;
import com.maxrocky.service.activity.publiccode.PublicCodeActionInfo;
import com.maxrocky.service.activity.publiccode.PublicCodeBase;
import com.maxrocky.service.activity.publiccode.PublicCodeParam;
import com.maxrocky.service.activity.publiccode.PublicCodeScene;
import lombok.extern.log4j.Log4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.*;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;

/**
 * @author xxxx
 * @date 2021/10/25 10:59
 * 微信小程序服务
 */
@Service
@Log4j
public class WechatAppletServiceImpl implements WechatAppletService {


    @Value("${wx.wxUrl}")
    private String url;
    @Value("${wx.appid}")
    private String appid;
    @Value("${wx.secret}")
    private String secret;
    //@Value("${wx.applet.grant_type}")
    private static final String  grant_type="client_credential";

    @Value("${wx.getAccessTokenUrl}")
    private String getAccessToken;

    private static final String getUnlimited="/wxa/getwxacodeunlimit?access_token=";

    @Value("${file.rootPath}")
    private String rootPath;


    @Resource
    ExceptionManager exceptionManager;
    /**
     * 获取小程序token
     * @return
     */
    @Override
    public String getAccessToken() {
        String requestUrl=url+getAccessToken+"?grant_type="+grant_type+"&appid="+appid+"&secret="+secret;
        HttpResult httpResult = HttpClientUtils.doGet(requestUrl);
        String content = httpResult.getContent();
        JSONObject jsonObject = JSON.parseObject(content);
        String token =(String) jsonObject.get("access_token");
        return token;
    }

    /**
     * 获取小程序码
     * @return
     */
    @Override
    public Map<String,String> getUnlimited(String pageUrl, String scene) {
        String accessToken = getAccessToken();
        Map<String,String> map=new HashMap<>();
        // 发送请求参数
        String fileName= UUIDUtils.getUUID()+".png";;
        String filePath=rootPath+"/" +fileName;
        map.put("filePath",filePath);
        generateQrCode(filePath,pageUrl,scene,accessToken);
        return map;
    }

    /**
     * 生成微信小程序二维码
     *
     * @param filePath
     *         本地生成二维码路径
     * @param page
     *         当前小程序相对页面 必须是已经发布的小程序存在的页面(否则报错),例如 pages/index/index, 根路径前不要填加 /,不能携带参数(参数请放在scene字段里),如果不填写这个字段,默认跳主页面
     * @param scene
     *         最大32个可见字符,只支持数字,大小写英文以及部分特殊字符:!#$&'()*+,/:;=?@-._~,其它字符请自行编码为合法字符(因不支持%,中文无法使用 urlencode 处理,请使用其他编码方式)
     * @param accessToken
     *         接口调用凭证
     */
    public void generateQrCode(String filePath, String page, String scene, String accessToken) {
        OutputStream os=null;
        try {
            //调用微信接口生成二维码
            URL url = new URL("https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" + accessToken);
            HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
            httpURLConnection.setRequestMethod("POST");// 提交模式
            // conn.setConnectTimeout(10000);//连接超时 单位毫秒
            // conn.setReadTimeout(2000);//读取超时 单位毫秒
            // 发送POST请求必须设置如下两行
            httpURLConnection.setDoOutput(true);
            httpURLConnection.setDoInput(true);
            // 获取URLConnection对象对应的输出流
            PrintWriter printWriter = new PrintWriter(httpURLConnection.getOutputStream());

            // 发送请求参数
            JSONObject paramJson = new JSONObject();
            //这就是你二维码里携带的参数 String型  名称不可变
            if (StringUtils.isEmpty(scene)){
                scene="123456789";
            }
            paramJson.put("scene", scene);
            //注意该接口传入的是page而不是path
            if (StringUtils.isNotEmpty(page)){
                paramJson.put("page", page);
            }
            //这是设置扫描二维码后跳转的页面
            paramJson.put("width", 1280);
            paramJson.put("is_hyaline", true);
            paramJson.put("auto_color", true);
            printWriter.write(paramJson.toString());
            // flush输出流的缓冲
            printWriter.flush();
            //开始获取数据
            BufferedInputStream bis = new BufferedInputStream(httpURLConnection.getInputStream());
            File fileDir = new File(filePath);
            if (!fileDir.getParentFile().exists()) {
                fileDir.getParentFile().mkdirs();
            }
            os = new FileOutputStream(new File(filePath));
            int len;
            byte[] arr = new byte[1024];
            while ((len = bis.read(arr)) != -1) {
                os.write(arr, 0, len);
                os.flush();
            }
            os.close();
            File file=new File(filePath);
            long length = file.length();
            if (length<1024){
                throw exceptionManager.createByCode("41030");
            }
        } catch (Exception e) {
            if ( e instanceof PhantomException){
                //抛出异常信息
                throw exceptionManager.createByCode("41030");
            }else {
                e.printStackTrace();
            }
        }finally {
            if (null!=os){
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }




}

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐