目录
写在前言中
最近在学习微信小程序邀请新用户的功能,所以需要在后端生成一个二维码并携带用户的用户ID或者其他信息传给前端。用户使用这个二维码进行登录或者其他操作。此时前端工作人员会记录下邀请人的用户ID和被邀请人的用户ID并传给后端。这个功能首先需要生成微信二维码,所以下面就是我的学习过程。
1.微信官方文档
首先需要查看微信的官方文档,确定这个微信二维码需要什么接口。
你必须知道,生成这个二维码的条件是
①小程序已成功发布
②通过后端程序提供给微信服务器,微信服务器确认身份后,会返回一个字节,这个字节就是我们需要的二维码。
因此,微信小程序向开发者提供相关信息十分必要。
一般如果你是在前人的基础上增加新的功能的话,是不需要考虑这些前提条件的,我就是属于这一类的,首先这些东西在yam的配置文件里,你可以看前人写的,对应的都有,这些在应用启动的时候就会注入,所以只要有这些,问题就解决了。
我们来看看微信的官方文档: 这是官方文档。
进去之后我们看到了他的介绍
接口A:适用于需要少量代码的业务场景
接口B:适用于需要大量代码的业务场景
接口C:适用于代码量较少的业务场景
接口D:适用于“一品一码”业务场景
接口A和接口C生成小程序代码,可接受较长的路径参数,且生成代码数量有限,请谨慎使用。
所以我这里学习的是用于邀请新人的接口B(需要大量代码)。
这是界面B的源代码,有非常清晰的中文文字。

/** * 接口B: 获取小程序码(永久有效、数量暂无限制). *
* 通过该接口生成的小程序码,永久有效,数量暂无限制。 * 用户扫描该码进入小程序后,将统一打开首页,开发者需在对应页面根据获取的码中 scene 字段的值,再做处理逻辑。 * 使用如下代码可以获取到二维码中的 scene 字段的值。 * 调试阶段可以使用开发工具的条件编译自定义参数 scene=xxxx 进行模拟,开发工具模拟时的 scene 的参数值需要进行 urlencode *
* * @ 最大32个可见字符,仅支持数字、大小写英文和部分特殊字符:!#$&'()*+,/:;=?@-._~, * 其他字符请自行编码为合法字符(因为不支持%,无法处理中文,请使用其他编码方式) * @ page必须是发布的小程序页面,例如“//”,若此字段不填,默认跳转主页面 * @ 默认自动配置线条颜色,如果颜色还是黑色,代表不建议配置主色 * @ 默认true 自动配置线条颜色,如果颜色还是黑色,代表不建议配置主色 * @ 生效时,使用rgb设置颜色,例如{"r":"xxx","g":"xxx","b":"xxx"} * @ 是否需要透明背景。 为true时,生成背景透明的小程序代码 * @File内容字节数组 * @ */ byte[] ( , page, int , , , ) ;
其实微信的B接口官方文档上也是写得很清楚的。
现在我们已经搞清楚了需要什么接口来连接微信,下面就开始写吧。
2.具体分析
得益于工具的开发和官方微信的撰写,这种方法现在变得非常简单。
只需解决底层问题
@PostMapping(value="inviteCode",produces = MediaType.IMAGE_JPEG_VALUE) public byte[] inviteCode(@RequestParam ("inviteUserId")Long inviteUserId) throws WxErrorException { File file=wxMaService.getQrcodeService().createWxaCodeUnlimit(String.valueOf(inviteUserId),"pages/login/login",300,true,null,true); return FileUtil.readBytes(file); }
请注意,该接口返回一个char数组,因此需要接受它。
这就是我之前定义的。
private final WxMaService wxMaService;
是我们调用微信接口的前提。
getQrcodeService()
该方法返回的是调用接口对应的实体类
/** * 返回二维码相关接口方法的实现类对象,以方便调用其各个接口. * * @return WxMaQrcodeService */ WxMaQrcodeService getQrcodeService();
createWxaCodeUnlimit() 就是我们的接口B了,但是我们接口B有许多的重载方法要选择最合适的一个。我们这里选的是返回字节数组的。
注意:@(="", = .)一定要写,否则会返回乱码(字节)。其作用是判断返回的类型,我们的二维码必须是图片。
检测结果: