微信生成外部链接
一、前期准备工作
注意:获取小程序 URL Link,适用于短信、邮件、网页、微信内等拉起小程序的业务场景。通过该接口,可以选择生成到期失效和永久有效的小程序链接,有数量限制,目前仅针对国内非个人主体的小程序开放,详见获取 URL Link
HTTPS调用请求地址:
POST https://api.weixin.qq.com/wxa/generate_urllink?access_token=ACCESS_TOKEN
1.导入微信小程序包依赖(pom中配置)
<!--微信小程序工具包-->
<dependency>
<groupId>com.github.binarywang</groupId>
<artifactId>weixin-java-miniapp</artifactId>
<version>4.0.0</version>
</dependency>
2.配置微信的必要参数(yml文件中配置)
wx:
miniapp:
app-id: wxba11af1453cscs
app-secret: f86410070e07cscscsc
3.微信配置
-
属性配置
import lombok.Data; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Configuration; @Data @Configuration @ConfigurationProperties(prefix = "wx.miniapp") public class WxProperties { /** * 设置微信小程序的appid. */ private String appId; /** * 设置微信小程序的Secret. */ private String appSecret; }
-
将微信小程序注入到spring中
import cn.binarywang.wx.miniapp.api.WxMaService; import cn.binarywang.wx.miniapp.api.impl.WxMaServiceImpl; import cn.binarywang.wx.miniapp.config.impl.WxMaDefaultConfigImpl; import lombok.AllArgsConstructor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @Configuration @AllArgsConstructor public class WxConfig { private final WxProperties properties; /** * 小程序service配置 */ @Bean public WxMaService wxMaService() { WxMaDefaultConfigImpl wxMaConfig = new WxMaDefaultConfigImpl(); wxMaConfig.setAppid(this.properties.getAppId()); wxMaConfig.setSecret(this.properties.getAppSecret()); WxMaService wxMaService = new WxMaServiceImpl(); wxMaService.setWxMaConfig(wxMaConfig); return wxMaService; } }
这个wxMaService 可以直接获得一些必要的数据,比如可以直接调用获得用户个人信息,可以生成订阅消息,可以生成微信二维码,这些都可以在wxMaService对应的类中找到,如果找不到,就只能采取最直接的方法,直接调用微信给的url。
这次生成微信外部链接就是需要直接调用方法。
二、核心代码
-
思路:首先看到官方文档,我们需要access_token,所以首先要获得这个。然后那这个和他所需要的参数,去请求接口。
-
业务描述:上一篇的钉钉发送工作通知,里面有对应小程序的链接地址,这里需要直接跳转到我们自己对应的微信小程序上,所以需要微信的外部链接。
-
没有跳转路径的代码
public String getWxUrl() { try { String accessToken = wxMaService.getAccessToken(); //构建请求参数(带上一个无意义的参数,应为这个请求不带参数请求不成功) JSONObject paramMap = new JSONObject(); paramMap.put("query", ""); String generateLinkUrl = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=ACCESS_TOKEN"; String postUrl = generateLinkUrl.replaceAll("ACCESS_TOKEN", accessToken); String result = HttpUtil.post(postUrl, paramMap.toString()); System.out.println(result); JSONObject jsonObject = JSONObject.parseObject(result); String wxUrl = jsonObject.getString("url_link"); return StrUtil.isEmpty(wxUrl) ? "默认地址" : wxUrl; } catch (Exception e) { log.error("微信链接生成失败:错误信息:{}", e.getMessage()); } //如果生成链接失败就返回kpi首页地址 return "默认地址"; }
注意:这个永久不失效的url连接一个小程序是有个数限制的,所以最好弄个有效期。下面的代码可以看有效期是怎么设置的
- 有跳转路径的代码
import cn.binarywang.wx.miniapp.api.WxMaService;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
/**
* @author
* @date 2022/2/28 14:37
*/
@Slf4j
@AllArgsConstructor
@Component
public class WxUrlUtil {
//刚才注册到spring里面的wxservice
private final WxMaService wxMaService;
/**
* 生成微信跳转链接,用于钉钉跳转
* 目前钉钉内部安卓可以直接跳到微信,但是ios不能跳转
* 但是通过外部浏览器能打开
*
* @param path 微信小程序路径(如果为空默认就进入的是小程序首页)
* @param query 进入小程序的参数(配合有参的路径用)
* @return 微信url,如果生成失败返回一个默认地址
*/
public String getWxUrl(String path, String query) {
try {
String accessToken = wxMaService.getAccessToken();
//构建请求参数
JSONObject paramMap = new JSONObject();
//通过 URL Link 进入的小程序页面路径,必须是已经发布的小程序存在的页面,不可携带 query 。path 为空时会跳转小程序主页
paramMap.put("path", path);
//小程序页面的参数,直接为:参数=值
if (!StrUtil.isEmpty(query)) {
paramMap.put("query", query);
}
//生成的 URL Link 类型,到期失效:true,永久有效:false
paramMap.put("is_expire", true);
//小程序 URL Link 失效类型,失效时间:0,失效间隔天数:1
paramMap.put("expire_type", 1);
//到期失效的URL Link的失效间隔天数。生成的到期失效URL Link在该间隔时间到达前有效。最长间隔天数为365天。expire_type 为 1 必填
paramMap.put("expire_interval", 60);
//执行post
String generateLinkUrl = "https://api.weixin.qq.com/wxa/generate_urllink?access_token=ACCESS_TOKEN";
String postUrl = generateLinkUrl.replaceAll("ACCESS_TOKEN", accessToken);
String result = HttpUtil.post(postUrl, paramMap.toString());
System.out.println(result);
JSONObject jsonObject = JSONObject.parseObject(result);
String wxUrl = jsonObject.getString("url_link");
return StrUtil.isEmpty(wxUrl) ? "默认地址" : wxUrl;
} catch (Exception e) {
log.error("微信链接生成失败:错误信息:{}", e.getMessage());
}
//如果生成链接失败就返回kpi首页地址
return "默认地址";
}
}
il.isEmpty(wxUrl) ? “默认地址” : wxUrl;
} catch (Exception e) {
log.error(“微信链接生成失败:错误信息:{}”, e.getMessage());
}
//如果生成链接失败就返回kpi首页地址
return “默认地址”;
}
}