微信 SDK 支持 Universal Links

新手学堂011

微信 SDK 支持 Universal Links,第1张

在开始之前先了解一下 Deep linking ,与 Web 开发不同,移动开发中的 Deep linking 是指直接通过链接打开指定的应用甚至是应用中的某个页面。对于 iOS 来说,实现 Deep linking 有两种方式,一种是 URL Scheme ,另一种是 Universal Links ,后者用于取代 URL Scheme。

作为对比,安卓中也有类似的技术,被称为 App Links ,且一共有三种。第一种是 Deep links ,用于告诉系统当前应用可以打开哪些类型的页面,当用户点击链接的时候会显示一个弹框(消歧义弹窗),供用户选择要在哪个应用中打开该页面。 Web links ,与 Deep links 类似,只不过针对的是 HTTP 链接,表示应用可以打开特定的 HTTP 链接,点击时同样会显示一个弹窗,供用户选择在哪个应用中打开。Android 12 之后,所有的 web links 将只能在浏览器中打开。 Android App Links ,只在 Android 60 (API level 23) 之后的系统中可用,是一种特殊的 web links,可以打开 HTTP 或者 HTTPS 协议的页面,并且包含 autoVerify 属性,该属性可以使得 App 成为打开某个链接的默认应用,而不是每次都展示一个选择弹窗,用户可以在应用设置页查看某个应用可以默认打开的链接。

iOS 中的 Universal Links 的工作方式和安卓中类似,只不过为了安全,操作相对复杂一些。

创建一个名为 apple-app-site-association 的文件,并且上传到 Web 服务器的根目录。苹果通过访问该文件来了解你的网站和哪些应用建立了关联。

该 JSON 文件内容如下:

确保 GET 请求能够访问到该文件就可以了。

Associated Domains 是应用能否可以打开某个链接的关键。首先在开发者账号管理后台中,找到应用的 Identifier,然后在 Capabilities 中开启 Associated Domains,如下图:

开启之后我们还需要更新 XCode 中的证书描述文件,然后在 Capability 中添加 Associated Domains,Domains 中填写: applinks:yourdomaincom 。其中,scheme 必须是 applinks ,后面的 url 是你的网站地址,也就是 Universal Links 中的域名部分。

经过上面这样的设置之后,重新运行项目,在浏览器中打开你的 Universal Links,这个时候你的应用应该就可以响应打开这个链接了。如果不行,说明上面步骤中存在错误的地方,请仔细阅读文档和检查配置过程。大部分情况下,很有可能是 apple-app-site-association 配置有误,请检查 App ID 和 Bundle Id 是否复制错了。

在微信开放平台管理页面中填写 Universal Links,形式如: https://yourdomaincom/app/ ,注意必须以 https 开头和以 / 结尾。

在项目中初始化 SDK 的地方,填写相同的 Universal Links,以 fluwx 为例:

最后,还需要在 Xcode 项目配置面板的 Info 选项卡中,找到 LSApplicationQueriesSchemes 并添加一条 weixinULAPI 入口。

作为一名非 iOS 开发者,没想到仅仅是开启 Universtal Links 就已经如此麻烦,虽然这里只写了三个关键步骤,但其实真正操作起来可能还会遇到许多的问题,所以还是要靠自己多搜索和查阅文档才能解决。尽管如此,在一番摸索之后终于配置成功,看到终于可以在应用中打开微信小程序了,也算是一件非常开心的事。文末附上了我参考的文章和文档的链接,希望对你有帮助。

参考链接

1首先我们新建一个Java开发包WeiXinSDK

2包路径:comansitechweixinsdk

测试的前提条件:

假如我的公众账号微信号为:vzhanqun

我的服务器地址为:http://wwwvzhanquncom/

下面我们需要新建一个URL的请求地址

我们新建一个Servlet来验证URL的真实性,具体接口参考

http://mpweixinqqcom/wiki/indexphptitle=接入指南

3新建comansitechweixinsdkWeixinUrlFilterjava

这里我们主要是获取微信服务器法师的验证信息,具体验证代码如下

[java] view plain copy print

package comansitechweixinsdk;

import comansitechweixinsdkutilSHA1;

import javaioIOException;

import javautilArrayList;

import javautilCollections;

import javautilComparator;

import javautilList;

import javaxservletFilter;

import javaxservletFilterChain;

import javaxservletFilterConfig;

import javaxservletServletException;

import javaxservletServletRequest;

import javaxservletServletResponse;

import javaxservlethttpHttpServletRequest;

import javaxservlethttpHttpServletResponse;

public class WeixinUrlFilter implements Filter {

//这个Token是给微信开发者接入时填的

//可以是任意英文字母或数字,长度为3-32字符

private static String Token = "vzhanqun1234567890";

@Override

public void init(FilterConfig config) throws ServletException {

Systemoutprintln("WeixinUrlFilter启动成功!");

}

@Override

public void doFilter(ServletRequest req, ServletResponse res,

FilterChain chain) throws IOException, ServletException {

HttpServletRequest request = (HttpServletRequest) req;

HttpServletResponse response = (HttpServletResponse) res;

//微信服务器将发送GET请求到填写的URL上,这里需要判定是否为GET请求

boolean isGet = requestgetMethod()toLowerCase()equals("get");

Systemoutprintln("获得微信请求:" + requestgetMethod() + " 方式");

if (isGet) {

//验证URL真实性

String signature = requestgetParameter("signature");// 微信加密签名

String timestamp = requestgetParameter("timestamp");// 时间戳

String nonce = requestgetParameter("nonce");// 随机数

String echostr = requestgetParameter("echostr");//随机字符串

List<String> params = new ArrayList<String>();

paramsadd(Token);

paramsadd(timestamp);

paramsadd(nonce);

//1 将token、timestamp、nonce三个参数进行字典序排序

Collectionssort(params, new Comparator<String>() {

@Override

public int compare(String o1, String o2) {

return o1compareTo(o2);

}

});

//2 将三个参数字符串拼接成一个字符串进行sha1加密

String temp = SHA1encode(paramsget(0) + paramsget(1) + paramsget(2));

if (tempequals(signature)) {

responsegetWriter()write(echostr);

}

} else {

//处理接收消息

}

}

@Override

public void destroy() {

}

}

好了,不过这里有个SHA1算法,我这里也把SHA1算法的源码给贴出来吧!

4新建comansitechweixinsdkutilSHA1java

[java] view plain copy print

/

微信公众平台(JAVA) SDK

Copyright (c) 2014, Ansitech Network Technology Co,Ltd All rights reserved

http://wwwansitechcom/weixin/sdk/

Licensed under the Apache License, Version 20 (the "License");

you may not use this file except in compliance with the License

You may obtain a copy of the License at

http://wwwapacheorg/licenses/LICENSE-20

Unless required by applicable law or agreed to in writing, software

distributed under the License is distributed on an "AS IS" BASIS,

WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied

See the License for the specific language governing permissions and

limitations under the License

/

package comansitechweixinsdkutil;

import javasecurityMessageDigest;

/

<p>Title: SHA1算法</p>

@author qsyang<yangqisheng274@163com>

/

public final class SHA1 {

private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5',

'6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

/

Takes the raw bytes from the digest and formats them correct

@param bytes the raw bytes from the digest

@return the formatted bytes

/

private static String getFormattedText(byte[] bytes) {

int len = byteslength;

StringBuilder buf = new StringBuilder(len 2);

// 把密文转换成十六进制的字符串形式

for (int j = 0; j < len; j++) {

bufappend(HEX_DIGITS[(bytes[j] >> 4) & 0x0f]);

bufappend(HEX_DIGITS[bytes[j] & 0x0f]);

}

return buftoString();

}

public static String encode(String str) {

if (str == null) {

return null;

}

try {

MessageDigest messageDigest = MessageDigestgetInstance("SHA1");

messageDigestupdate(strgetBytes());

return getFormattedText(messageDigestdigest());

} catch (Exception e) {

throw new RuntimeException(e);

}

}

}

5把这个Servlet配置到webxml中

[html] view plain copy print

<filter>

<description>微信消息接入接口</description>

<filter-name>WeixinUrlFilter</filter-name>

<filter-class>comansitechweixinsdkWeixinUrlFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>WeixinUrlFilter</filter-name>

<url-pattern>/api/vzhanqun</url-pattern>

</filter-mapping>

好了,接入的开发代码已经完成。

6下面就把地址URL和密钥Token填入到微信申请成为开发者模式中吧。

通过使用微信JS-SDK,网页开发者可借助微信高效地使用拍照、选图、语音、位置等手机系统的能力,同时可以直接使用微信分享、扫一扫、卡券、支付等微信特有的能力,为微信用户提供更优质的网页体验。

例子为在vue中使用微信JS-SDK,步骤如下:

先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”。

备注:登录后可在“开发者中心”查看对应的接口权限。

插件方式:

引入js文件方式:

在需要调用JS接口的页面引入如下JS文件,(支持https): http://reswxqqcom/open/js/jweixin-160js

如需进一步提升服务稳定性,当上述资源不可访问时,可改访问: http://res2wxqqcom/open/js/jweixin-160js (支持https)。

挂载到Vue原型

与使用 JS-SDK 配置方式相同,所有需要使用开放标签的页面必须先注入配置信息,并通过openTagList字段申请所需要的开放标签,否则将无法使用(同一个 url 仅需调用一次)。开放标签的申请和 JS 接口的申请相互独立,因此是可以同时申请的。

配置成功之后,就可以使用相关的api了。例子为微信支付。

3分享出去的是链接,不是卡片的原因及解决方案:

原因: 微信开放全域名访问后出现的限制。

解决方法:

这会导致别人通过分享卡进来的页面不是自己配置的页面。

解决办法: 把路由hash模式改成history模式。(让后端把匹配不到的页面重定向到首页)

开发者需要配合使用微信开放平台提供的 SDK 进行一次性订阅消息授权请求接入。正确接入 SDK 后,开发者移动应用会在终端本地 拉起微信应用进行订阅消息授权 ,微信用户确认后微信将拉起开发者移动应用,并带上授权用户 openid 等信息。

使用方式: 引导用户打开 https://mpweixinqqcom/mp/subscribemsgaction=get_confirm&appid=wxaba38c7f163da69b&scene=1000&template_id=1uDxHNXwYQfBmXOfPJcjAS3FynHArD8aWMEFNRGSbCc&redirect_url=http%3a%2f%2fsupportqqcom&reserved=test#wechat_redirect 链接。

可拉起微信打开一次性消息订阅授权页:

使用方式:

如需添加参数,可在redirect_uri后面进行拼接,授权成功之后会带回来。

其他问题请参考: https://wwwjianshucom/p/d343067b1ce6

微信一键登录是一种便捷的登录方式,用户可以直接使用微信账号轻松登录第三方应用。为了实现该功能,需要在应用中集成微信SDK,并通过微信开放平台申请AppID和AppSecret。在用户授权登录后,应用需要生成token储存在客户端,并且在后续的请求中带上该token。在服务端对这个token进行验证后,可以确定用户的身份并返回相应的数据。JWT(Json Web Token)是一种用于身份验证和信息交换的标准。生成JWT token的方法如下:1构造payload,即包含用户信息和过期时间等信息的JSON对象。2使用秘钥对payload进行加密生成signature,并将其与header和payload组合生成token。3将token返回给客户端,以便在后续的请求中使用。在登录拦截方面,可以在服务端中对请求进行拦截,并验证请求头中是否携带了正确的token。如果token验证失败,则认为用户未登录,并返回相应的提示。同时,可以使用JWT中提供的过期时间机制,对token进行自动过期处理,以保证用户的安全性。

1、注册微信开放平台账号,并创建应用。

2、在应用中开启青少年模式,并设置相应的参数和规则。

3、使用微信开放平台提供的SDK,调用相关接口实现青少年模式的功能,如限制聊天、朋友圈、微信支付等。

4、在应用中添加相应的提示和说明,告知用户当前处于青少年模式下,并提供相应的解除方式和****。微信青少年模式是一种为未成年人提供的安全保护措施,需要遵循相关的法律法规和道德规范。在编程调用微信青少年模式时,需要考虑到用户的隐私和权益,避免滥用和侵犯。也需要及时更新和维护应用,确保其与微信开放平台的接口和规则保持一致,避免因为接口变更而导致的功能失效和安全问题。