最近开发中碰到需要从第三方H5唤醒并跳转小程序界面的需求,在微信官方社区找了一番后发现有相关的资料,于是便整理了两个接口并进行了实现,微信提供了三个接口生成小程序跳转链接,如下:
(1)、获取 URL Scheme
(2)、获取 URL Link
(3)、获取 Short Link
以上三种生成跳转链接的方式和相关说明在这里就不做阐述了。具体可参考官方资料,直接上链接:获取 URL Scheme | 微信开放文档
下面说说我所采用的方式,我采用的是获取 URL Scheme,通过调用相应接口获取生成的小程序跳转链接。
首先根据官方资料整理出接口调用相关信息,
(1)、接口地址:
POST https://api.weixin.qq.com/wxa/generatescheme?access_token=ACCESS_TOKEN
(2)、参数:
请求参数
属性 | 类型 | 必填 | 说明 | |||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
access_token | string | 是 | 接口调用凭证,该参数为 URL 参数,非 Body 参数。使用getAccessToken 或者 authorizer_access_token | |||||||||||||||||||||
jump_wxa | object | 否 | 跳转到的目标小程序信息。 | |||||||||||||||||||||
| ||||||||||||||||||||||||
is_expire | boolean | 否 | 默认值false。生成的 scheme 码类型,到期失效:true,30天有效:false。 | |||||||||||||||||||||
expire_time | number | 否 | 到期失效的 scheme 码的失效时间,为 Unix 时间戳。生成的到期失效 scheme 码在该时间前有效。最长有效期为30天。is_expire 为 true 且 expire_type 为 0 时必填 | |||||||||||||||||||||
expire_type | number | 否 | 默认值0,到期失效的 scheme 码失效类型,失效时间:0,失效间隔天数:1 | |||||||||||||||||||||
expire_interval | number | 否 | 到期失效的 scheme 码的失效间隔天数。生成的到期失效 scheme 码在该间隔时间到达前有效。最长间隔天数为30天。is_expire 为 true 且 expire_type 为 1 时必填 |
返回参数
属性 | 类型 | 说明 |
---|---|---|
errcode | number | 错误码 |
errmsg | string | 错误信息 |
openlink | string | 生成的小程序 scheme 码 |
附:其中有一个参数是access_token,即接口调用凭证,需要调用凭证获取接口才能获取到,且有时效性,因此在生成小程序跳转链接前还需进行access_token的获取,调用方式参考官方资料,上链接:获取接口调用凭据 | 微信开放文档
下面就贴出实现代码:
//凭证调用
public static String getAccessToken(){
//小程序APPID
String appid="";//自行获取
//小程序secret
String secret="";//自己去公众号后台获取
String httpUrl="https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential";
HttpAsk httpObj=new HttpAsk();
String res="";
httpUrl= httpUrl+"&appid="+appid+"&secret="+secret;
//调用接口 接收返回结果
String AccessTokenJson=httpObj.GetForHtml(httpUrl);
return AccessTokenJson;
}
//生成小程序跳转链接
public static Map<String,Object> getAppletUrl(){
Map<String,Object> map=new HashMap<String,Object>();
//接口地址
String httpUrl="https://api.weixin.qq.com/wxa/generatescheme?access_token=";
//需要跳转的小程序路径
String path= "pages/login/login";
//获取AccessToken
String AccessTokenJson=WeChatInterfaceUtil.getAccessToken();
//格式化返回数据
JSONObject resultObject = JSONObject.parseObject(AccessTokenJson);
String AccessToken=resultObject.getString("access_token");
if(AccessToken==null){
AccessToken =resultObject.getString("errmsg");
map.put("code",-1);//错误码
map.put("msg",AccessToken);//错误信息
}else{
map.put("code",0);
try {
String content="";
JSONObject jsonParam = new JSONObject();
JSONObject jump_wxa = new JSONObject();
jump_wxa.put("path",path);
jump_wxa.put("query", "");
jsonParam.put("jump_wxa",jump_wxa);
jsonParam.put("expire_type", 1);
jsonParam.put("expire_interval", 2);
String params=jsonParam.toString();
CloseableHttpClient httpClient = HttpClients.createDefault();
RequestConfig requestConfig = RequestConfig.custom()
.setSocketTimeout(300 * 1000)
.setConnectTimeout(300 * 1000)
.build();
HttpPost post = new HttpPost(httpUrl+AccessToken);
post.setConfig(requestConfig);
post.setHeader("Content-Type", "application/json;charset=utf-8");
//URLEncoder.encode(name)
StringEntity postingString = new StringEntity(params, "utf-8");
post.setEntity(postingString);
CloseableHttpResponse response = httpClient.execute(post);
content=EntityUtils.toString(response.getEntity());
JSONObject resultUrl = JSONObject.parseObject(content);
String newUrl=resultUrl.getString("openlink");
map.put("url",newUrl);
System.out.println("WeChatInterfaceUtil.getWeixinUrl--"+newUrl);
} catch (SocketTimeoutException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
}
return map;
}
通过调用getAppletUrl 就可以获取小程序跳转接口