微信扫码二维码如何申请 微信公众号扫码登录(一)—— 获取微信公众号二维码
引言
这几天在研究微信登录,今天解决了获取微信二维码问题;在这里总结一下
关于微信登录想说的话
第一次接触微信登录,开始就弄混了登录方式;简单来说,微信扫码登录分为两种,一种是微信公众平台,一种是微信开放平台,两者的开发文档也不一样,开始就是一直用的微信公众号的参数却使用的是微信开放平台提供的接口,找了半天问题;
总结一下:
微信公众号(公众平台) 和 微信开放平台 是两码事。
两者开发文档是不同的,所以看网上教程一定要看清楚是公众平台还是开放平台,不要跟错教程了;最好就是看官方文档,这样就能避免踩坑;(我开始就是看不下去文档,因为微信是php示例代码,所以一直看网上教程,就被各种各样的教程弄晕了;最后还是乖乖看文档去了)
下面就进入正题
准备环境
首先申请了一个公众号,然后从开发者工具中进入测试号:
然后就是这个界面:
appID和都是操作所需参数;
接口配置下面介绍;
接口配置
接口配置后面会用到,所以需要先配置一下,其实看官方文档就能看懂,但是示例代码是php,所以这里我来演示一下我的操作;
官方文档:传送门
官方文档意思就是你得有一个域名,代码还得跑在该域名下的服务器上,然后你自己需要再代码中实现一个接口获取微信发来的信息进行处理;
如果你和我一样是个学生,开发都在本地127.0.0.1,或者没有域名,那该怎么办?因为微信不能直接调用本地ip,这就需要用到内网穿透;
简单来说就是微信想要向你填入的url发送请求数据,但是它不能直接向本地127.0.0.1发送,我们可以通过内网穿透获取一个域名,让该域名映射到本地127.0.0.1,然后微信向该域名发送数据,这样就把数据发送到了本地;(个人理解)
内网穿透
我通过ngrok进行的内网穿透,就花2块钱实名了一下,然后有一个免费的隧道可以使用:
然后进行配置,它就会給你分一个域名:
接下来下载ngrok客户端,启动隧道:
点击.bat文件,按要求输入隧道id:
链接成功,这时时就意味着访问本地127.0.0.1和访问生成的域名的效果是一样的;
访问流程就是:
文档:
微信向自己填的url发送请求;
实现接入代码
然后就是代码配置,就是官网文档的第二步,官方检验是一个php代码,下面是java代码:
接口:
/**
* 接入微信接口
*/
@GetMapping("/callback")
@ResponseBody
public String checkSign (HttpServletRequest request) throws Exception {
log.info("===========>checkSign");
// 获取微信请求参数
String signature = request.getParameter ("signature");
String timestamp = request.getParameter ("timestamp");
String nonce = request.getParameter ("nonce");
String echostr = request.getParameter ("echostr");
log.info("开始校验此次消息是否来自微信服务器,param->signature:{},ntimestamp:{},nnonce:{},nechostr:{}",
signature, timestamp, nonce, echostr);
if (CheckWXTokenUtils.checkSignature(signature, timestamp, nonce)) {
return echostr;
}
return "";
}
校验工具类(直接cv)
import lombok.extern.log4j.Log4j2;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
/**
* 和微信建立链接参数校验
*/
@Log4j2
public class CheckWXTokenUtils {
private static final String TOKEN = "xxxxxx"; // 自定义的token
/**
* 校验微信服务器Token签名
*
* @param signature 微信加密签名
* @param timestamp 时间戳
* @param nonce 随机数
* @return boolean
*/
public static boolean checkSignature(String signature, String timestamp, String nonce) {
String[] arr = {TOKEN, timestamp, nonce};
Arrays.sort(arr);
StringBuilder stringBuilder = new StringBuilder();
for (String param : arr) {
stringBuilder.append(param);
}
String hexString = SHA1(stringBuilder.toString());
return signature.equals(hexString);
}
private static String SHA1(String str) {
MessageDigest md;
try {
md = MessageDigest.getInstance("SHA-1");
byte[] digest = md.digest(str.getBytes());
return toHexString(digest);
} catch (NoSuchAlgorithmException e) {
log.info("校验令牌Token出现错误:{}", e.getMessage());
}
return "";
}
/**
* 字节数组转化为十六进制
*
* @param digest 字节数组
* @return String
*/
private static String toHexString(byte[] digest) {
StringBuilder hexString = new StringBuilder();
for (byte b : digest) {
String shaHex = Integer.toHexString(b & 0xff);
if (shaHex.length() < 2) {
hexString.append(0);
}
hexString.append(shaHex);
}
return hexString.toString();
}
}
几个校验参数官方文档也说了,自己对比着看就行了;
再次放入官方文档地址:接入概述
配置就是:
url是内网穿透域名+自己实现的接口
token也是自己写的;
然后在网页服务中:
点击修改:(还是内网穿透域名)
然后就配置好了;
下面就是正式开始二维码生成了;
生成二维码
先放出文档:
生成带参数的二维码
获取 token
获取
我们先看第一个文档,大致意思就是先发送一个获取二维码的post请求,获取:
整理一下:
url: post
https://api.weixin.qq.com/cgi-bin/qrcode/create?access_token=TOKEN
参数:
param参数:access_token
json参数(两个必要的,其他可以自己看文档加): {"expire_seconds": 604800, "action_name": "QR_SCENE"}
结果:
{"ticket":"gQH47joAAAAAAAAAASxodHRwOi8vd2VpeGluLnFxLmNvbS9xL2taZ2Z3TVRtNzJXV1Brb3ZhYmJJAAIEZ23sUwMEmm
3sUw==","expire_seconds":60,"url":"http://weixin.qq.com/q/kZgfwMTm72WWPkovabbI"}
那么就很简单了,就是调用就接口获取,但是可以发现所需要的参数中的我们并没有,所以调用该接口前需要先获取,同样也有官方文档,上面已经放出来了;
获取
同样整理一下:
url: get
https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=APPSECRET
参数:
grant_type、appid、secret
结果:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
其中就写就行了,固定的;
appid和就是测试号的:
所以很轻易就可以获取到;
获取到就可以获取,到这里这两步就完成了;
接下来就是获取二维码了:
获取二维码
这就不过多介绍了,就加一个参数即可;
测试流程
下面我使用测试一遍流程:
1,首先获取:
2,然后获取:
3,最后获取二维码:
直接浏览器访问该链接,即可看到该二维码
整个流程就走通了;
下面就是代码实现该流程;
代码实现
这里思考一个问题,后端内部如何自己发送请求获取响应?
平时都是前端向后端发送请求,后端响应;
因为我们需要先发送请求获取,再获取,最后响应给前端的就是一个二维码url,所以后端需要自己发请求并获取响应结果;