从短信短链跳转微信小程序全流程实现
整体流程概述
- 用户点击短信中的短链接
- 短链接跳转至微信打开指定小程序
- 小程序完成用户登录
- 跳转到小程序指定页面
详细技术实现
1. 生成带参数的短链接
首先需要在微信公众平台生成可以跳转小程序的短链接:
// Java后端生成微信URL Link示例
public String generateWechatUrlLink() {
// 微信开放平台相关配置
String appId = "你的小程序appid";
String appSecret = "你的小程序secret";
String path = "pages/index/index"; // 小程序路径
String query = "param1=value1¶m2=value2"; // 传递参数
// 获取access_token
String tokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
+ appId + "&secret=" + appSecret;
// 调用微信API获取token(实际代码需添加HTTP请求处理)
String accessToken = getAccessToken(tokenUrl);
// 生成URL Link
String urlLinkApi = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=" + accessToken;
JSONObject requestBody = new JSONObject();
requestBody.put("path", path);
requestBody.put("query", query);
requestBody.put("is_expire", true); // 设置过期
requestBody.put("expire_type", 1); // 过期时间类型
requestBody.put("expire_interval", 30); // 30天后过期
// 调用微信API生成URL Link(实际代码需添加HTTP请求处理)
String urlLink = generateUrlLink(urlLinkApi, requestBody.toString());
// 将生成的URL Link转为短链
String shortUrlApi = "https://api.weixin.qq.com/cgi-bin/shorturl?access_token=" + accessToken;
JSONObject shortUrlRequestBody = new JSONObject();
shortUrlRequestBody.put("action", "long2short");
shortUrlRequestBody.put("long_url", urlLink);
// 调用微信API生成短链(实际代码需添加HTTP请求处理)
String shortUrl = generateShortUrl(shortUrlApi, shortUrlRequestBody.toString());
return shortUrl;
}
2. 小程序端接收参数并处理
在小程序的App.js或目标页面中接收和处理参数:
// 小程序App.js中
App({
onLaunch(options) {
// 处理URL Link打开小程序的场景
if (options.query && options.query.scene) {
// 解析scene参数
const scene = decodeURIComponent(options.query.scene);
console.log('从短链接进入的场景值:', scene);
// 这里可以处理登录逻辑
this.loginAndRedirect(scene);
}
},
loginAndRedirect(sceneParams) {
// 登录逻辑
wx.login({
success: res => {
// 发送code到后端换取openid
wx.request({
url: 'https://your-backend-api.com/login',
method: 'POST',
data: {
code: res.code,
scene: sceneParams
},
success: (response) => {
const { token, userInfo, redirectPath } = response.data;
// 存储登录态
wx.setStorageSync('token', token);
wx.setStorageSync('userInfo', userInfo);
// 跳转到指定页面
if (redirectPath) {
wx.reLaunch({
url: redirectPath
});
}
}
});
}
});
}
});
3. Java后端登录接口实现
// Spring Boot 控制器示例
@RestController
@RequestMapping("/api")
public class LoginController {
@Autowired
private WechatService wechatService;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody LoginRequest request) {
// 1. 通过code获取openid
String openid = wechatService.getOpenid(request.getCode());
if (openid == null) {
return ResponseEntity.badRequest().body("登录失败");
}
// 2. 处理scene参数(从短链接带来的参数)
Map<String, String> sceneParams = parseSceneParams(request.getScene());
// 3. 查询或创建用户
User user = userService.findOrCreateUser(openid, sceneParams);
// 4. 生成JWT token
String token = jwtTokenUtil.generateToken(user);
// 5. 根据场景参数确定跳转路径
String redirectPath = determineRedirectPath(sceneParams);
// 返回结果
Map<String, Object> response = new HashMap<>();
response.put("token", token);
response.put("userInfo", convertToUserInfo(user));
response.put("redirectPath", redirectPath);
return ResponseEntity.ok(response);
}
private Map<String, String> parseSceneParams(String scene) {
// 解析scene参数,例如"param1=value1¶m2=value2"
return Arrays.stream(scene.split("&"))
.map(p -> p.split("="))
.collect(Collectors.toMap(
arr -> arr[0],
arr -> arr.length > 1 ? arr[1] : ""
));
}
private String determineRedirectPath(Map<String, String> sceneParams) {
// 根据业务逻辑确定跳转路径
if ("special".equals(sceneParams.get("type"))) {
return "/pages/special/index";
}
return "/pages/home/index";
}
}
4. 微信相关服务类
@Service
public class WechatServiceImpl implements WechatService {
@Value("${wechat.appid}")
private String appid;
@Value("${wechat.secret}")
private String secret;
@Override
public String getOpenid(String code) {
String url = String.format(
"https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code",
appid, secret, code);
// 使用RestTemplate或其他HTTP客户端调用微信API
String response = restTemplate.getForObject(url, String.class);
JSONObject json = JSON.parseObject(response);
return json.getString("openid");
}
}
注意事项
- 安全性:所有从客户端传递的参数都需要在后端验证
- 短链有效期:微信生成的URL Link默认有效期为30天,可根据需要调整
- 参数传递:
- URL Link有长度限制,复杂参数建议先存储在后端,只传ID
- 敏感数据不要通过URL传递
- 用户体验:
- 从短信到微信的跳转需要用户手机已安装微信
- 考虑添加加载状态和错误处理
- 兼容性:
- 处理用户未安装微信的情况
- 处理不同微信版本兼容性问题
完整流程总结
- 后端生成带参数的微信URL Link并转为短链
- 将短链通过短信发送给用户
- 用户点击短信链接跳转微信并打开小程序
- 小程序获取启动参数并向后端发起登录请求
- 后端验证登录并返回用户信息和跳转路径
- 小程序根据返回结果跳转到指定页面
以上示例提供了从短信短链到小程序指定页面的完整技术实现方案,可根据实际业务需求进行调整。