生成中间带个人头像的微信小程序码,小程序码携带参数

简介: 经常看到微信别人分享邀请的各种海报,海报上有小程序码,特别是小程序码,中间是分享人的头像,并不是默认的平台logo。这样设计在UI视觉上更有特色,再则,用头像就能区分是来自不同人分享的,一目了然。

1、场景:

经常看到微信别人分享邀请的各种海报,海报上有小程序码,特别是小程序码,中间是分享人的头像,并不是默认的平台logo。这样设计在UI视觉上更有特色,再则,用头像就能区分是来自不同人分享的,一目了然。

2、微信接口文档:

HTTPS 调用

方式:POST

请求地址:

https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=ACCESS_TOKEN

请求参数

image.png

具体文档地址为:

https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/qr-code/wxacode.getUnlimited.html

3、实现代码:

参数实体

 * @description
 */
@Data
public class QrCodeVo {

    /**
     * 用户头像
     */
    private String avatarImage;
    /**
     * 域名
     */
    private String domainName;
    /**
     * 小程序appId
     */
    private String appId;
    /**
     * 小程序appSecrect
     */
    private String appSecrect;
    /**
     *
     */
    private String model;
    /**
     *
     */
    private String field;

    //前端传的参数
    /**
     * 用户id
     */
    private String mobileUserId;
    /**
     * 小程序模块id
     */
    private String objectId;
    /**
     *  其他参数
     */
    private String otherId;
    /**
     * 扫码进入的页面
     */
    private String page;
}

用户方形头像换成圆形头像

 * @description
 */
public class CustomQrCodeUtil {

    private static Logger LOGGER = LoggerFactory.getLogger(CustomQrCodeUtil.class);

    public static String UPLOAD_PATH = "/data/tomcat/webapps/img";
    /**
     * 用户方形头像换成圆形头像
     * @param headImage 用户方形头像
     * @param model
     * @param field
     * @return
     * @throws MalformedURLException
     */
    public static String circularHeadImage(String headImage,String model,String field,String domainName) throws MalformedURLException {
        BufferedImage avatarImage;
        try {
            avatarImage = ImageIO.read(new URL(headImage));
            int width = 400;
            BufferedImage formatAvatarImage = new BufferedImage(width, width, BufferedImage.TYPE_4BYTE_ABGR);
            Graphics2D graphics = formatAvatarImage.createGraphics();
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            int border = 1;
            Ellipse2D.Double shape = new Ellipse2D.Double(border, border, width - border * 2, width - border * 2);
            graphics.setClip(shape);
            graphics.drawImage(avatarImage, border, border, width - border * 2, width - border * 2, null);
            graphics.dispose();
            graphics = formatAvatarImage.createGraphics();
            graphics.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            int border1 = 3;
            Stroke s = new BasicStroke(4.5F, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND);
            graphics.setStroke(s);
            graphics.setColor(Color.WHITE);
            graphics.drawOval(border1, border1, width - border1 * 2, width - border1 * 2);
            graphics.dispose();
            String pathFileStr = File.separator + model + File.separator  + field + File.separator + DateUtils.getCurrentDate();
            IPUtils.createFile(new File(UPLOAD_PATH + pathFileStr));
            String imageId = UuidUtils.randomUUID();
            String fileName = imageId + ".png";
            String destPath = UPLOAD_PATH + pathFileStr + File.separator + fileName;
            ImageIO.write(formatAvatarImage, "png", new FileOutputStream(destPath));
            LOGGER.info("调用用户方形头像换成圆形头像接口==="+domainName + "/img"+pathFileStr + File.separator + fileName);
            return domainName + "/img"+pathFileStr + File.separator + fileName;
        } catch (Exception e) {
            LOGGER.error("调用用户方形头像换成圆形头像接口异常", e);
        }
        return null;
    }
}

生成小程序码

/**
 * @description
 */
public class WxQrcode {

    /**
     * 生成小程序码
     * @param vo
     * @return
     */
    public static String qrCode(QrCodeVo vo) {
        String qrCodeUrl = "";
        try{
            String circularHeadImage = CustomQrCodeUtil.circularHeadImage(vo.getAvatarImage(),vo.getModel(),vo.getField(),vo.getDomainName());
            String accessToken = vo.getToken();
            Map<String, Object> params = new HashMap<>();
            String scene = vo.getMobileUserId() + "&" + vo.getObjectId();
            if(vo.getOtherId() != null){
                scene = scene + "&" + vo.getOtherId();
            }
            System.out.println("scene : " + scene);
            params.put("scene", scene);
            params.put("page", vo.getPage() != null ? vo.getPage() :"pages/index/index");
            params.put("width", 430);
            CloseableHttpClient httpClient = HttpClientBuilder.create().build();
            HttpPost httpPost = new HttpPost(WeixinUrl.WXACODE_UNLIMIT + accessToken);
            httpPost.addHeader(HTTP.CONTENT_TYPE, "application/json");
            StringEntity entity = new StringEntity(JSON.toJSONString(params));
            entity.setContentType("image/png");
            httpPost.setEntity(entity);
            InputStream inputStream = httpClient.execute(httpPost).getEntity().getContent();
            String pathFileStr = File.separator + vo.getModel() + File.separator  + vo.getField() + File.separator + DateUtils.getCurrentDate();
            IPUtils.createFile(new File(CustomQrCodeUtil.UPLOAD_PATH + pathFileStr));
            String imageId = UuidUtils.randomUUID();
            String fileName = imageId + ".png";
            String destPath = CustomQrCodeUtil.UPLOAD_PATH + pathFileStr + File.separator + fileName;
            String imageUrl = pathFileStr + File.separator + fileName;
            FileOutputStream out = new FileOutputStream(destPath);
            byte[] buffer = new byte[8192];
            int bytesRead = 0;
            while ((bytesRead = inputStream.read(buffer, 0, 8192)) != -1) {
                out.write(buffer, 0, bytesRead);
            }
            out.flush();
            out.close();
            BufferedImage b1 = ImageIO.read(new URL(vo.getDomainName()+"/img"+imageUrl));
            //将用户头像覆盖小程序码中间的logo
            BufferedImage b2 = ImageIO.read(new URL(circularHeadImage));
            if (b1 != null) {
                //Graphics2D绘图
                Graphics2D g = b1.createGraphics();
                g.drawImage(b2, 115, 117, 200, 195, null);
                g.dispose();
                String pathFileStr2 = File.separator + vo.getModel() + File.separator  + vo.getField() + File.separator + DateUtils.getCurrentDate();
                IPUtils.createFile(new File(CustomQrCodeUtil.UPLOAD_PATH + pathFileStr2));
                String uuId = UuidUtils.randomUUID();
                String fileName2 = uuId + ".png";
                String destPath2 = CustomQrCodeUtil.UPLOAD_PATH + pathFileStr2 + File.separator + fileName2;
                ImageIO.write(b1, "png", new File(destPath2));
                qrCodeUrl = pathFileStr2 + File.separator + fileName2;
            }
        } catch (MalformedURLException e) {
            e.printStackTrace();
        } catch(Exception e) {
            e.printStackTrace();
        }
        return qrCodeUrl;
    }
}

4、注意:

POST 参数需要转成 JSON 字符串,不支持 form 表单提交。

接口只能生成已发布的小程序的二维码(不是已发布的小程序调用接口会生成损坏的图片,所以小程序要先审核通过一版才可以调试。传入的page必须是已经发布的小程序存在的页面,根路径前不要添加 /,否则也会生成损坏的图片)

调用分钟频率受限(5000次/分钟),如需大量小程序码,建议预生成。

山水有相逢,来日皆可期,谢谢阅读,我们再会

我手中的金箍棒,上能通天,下能探海

上一篇:使用token机制实现接口幂等性校验

相关文章
|
1月前
|
存储 JSON 小程序
微信小程序入门之新建并认识小程序结构
微信小程序入门之新建并认识小程序结构
50 1
ly~
|
2月前
|
存储 供应链 小程序
除了微信小程序,PHP 还可以用于开发哪些类型的小程序?
除了微信小程序,PHP 还可用于开发多种类型的小程序,包括支付宝小程序、百度智能小程序、抖音小程序、企业内部小程序及行业特定小程序。在电商、生活服务、资讯、工具、娱乐、营销等领域,PHP 能有效管理商品信息、订单处理、支付接口、内容抓取、复杂计算、游戏数据、活动规则等多种业务。同时,在企业内部,PHP 可提升工作效率,实现审批流程、文件共享、生产计划等功能;在医疗和教育等行业,PHP 能管理患者信息、在线问诊、课程资源、成绩查询等重要数据。
ly~
79 6
|
1月前
|
小程序 JavaScript API
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
这篇文章介绍了如何在uni-app和微信小程序中实现将图片保存到用户手机相册的功能。
591 0
微信小程序开发之:保存图片到手机,使用uni-app 开发小程序;还有微信原生保存图片到手机
|
3月前
|
JSON 小程序 JavaScript
超详细微信小程序开发学习笔记,看完你也可以动手做微信小程序项目
这篇文章是一份全面的微信小程序开发学习笔记,涵盖了从小程序介绍、环境搭建、项目创建、开发者工具使用、文件结构、配置文件、模板语法、事件绑定、样式规范、组件使用、自定义组件开发到小程序生命周期管理等多个方面的详细教程和指南。
|
3月前
|
小程序 前端开发
微信小程序商城,微信小程序微店 【毕业设计参考项目】
文章推荐了一个微信小程序商城项目作为毕业设计参考,该项目在Github上获得18.2k星,提供了详细的使用教程和前端页面实现,适合学习微信小程序开发和作为毕业设计项目。
微信小程序商城,微信小程序微店 【毕业设计参考项目】
|
3月前
|
小程序 开发者
第一个微信小程序的初始化过程、小程序微信开发平台的下载、如何注册一个微信小程序的账号
这篇文章介绍了微信小程序的初始化过程,包括如何注册微信小程序账号、下载微信小程序开发者平台,并指导了新建小程序的详细步骤。
第一个微信小程序的初始化过程、小程序微信开发平台的下载、如何注册一个微信小程序的账号
|
3月前
|
前端开发 JavaScript API
微信公众号项目,实现微信支付(具体流程和参数)
微信公众号项目,实现微信支付(具体流程和参数)
|
4月前
|
小程序 安全 搜索推荐
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(3)
这是一篇关于微信小程序开发的文章摘要,作者介绍了如何创建一个网上花店小程序,旨在提供便捷的购花体验。小程序包含鲜花分类功能,允许用户按品种、颜色和用途筛选,确保快速找到合适的鲜花。它还提供了配送服务,保证鲜花的新鲜度。文章展示了`cash.wxml`、`cash.wxss`和`cash.js`的部分代码,用于实现分类和商品展示,以及`qin.wxml`、`qin.wxss`和`qin.js`,涉及商品详情和购买付款流程。代码示例展示了商品列表渲染和交互逻辑,包括页面跳转、数据传递和点击事件处理。文章最后提到了购买付款界面,强调了安全和便捷的支付体验。
119 0
【微信小程序开发实战项目】——如何制作一个属于自己的花店微信小程序(3)
|
4月前
|
前端开发 小程序
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
【微信小程序-原生开发】实用教程20 - 生成海报(实战范例为生成活动海报,内含生成指定页面的小程序二维码,保存图片到手机,canvas 系列教程)
409 0
|
4月前
|
小程序 开发者
【微信小程序】 微信小程序报错不在以下request合法域名列表中
【微信小程序】 微信小程序报错不在以下request合法域名列表中
950 0

热门文章

最新文章

下一篇
无影云桌面