微信JSSDK使用(获取access_token和jsapi_ticket及后续的完整方法)

完整的使用方法,请耐心查看。

前言

我也是在一次偶然的项目中碰到了这个需求,所以自己研究了一下,看了不少大佬的文章总结归纳了一下,我反正是好使了,到你那能不能用就看天命了。对了在使用一下代码之前,千万别忘了,不管是你自己还是你的经理谁都好,把你的 IP 添加到微信公众号开发的白名单里!!!!

1、获取access_token

生成签名之前必须先了解一下jsapi_ticket,jsapi_ticket是公众号用于调用微信JS接口的临时票据。
但是,获取jsapi_ticket之前必须先获取access_token,下面就让我们获取一下这个:

/**
     * 获取接口访问凭证
     *
     * @return
     */
    @Scheduled(fixedRate = 1000*7200)
    private static AccessToken getAccessToken()
    {
        String requestUrl = String.format(BasicSysCodeService.getAccessTokenUrl(),
                BasicSysCodeService.getAppId(),
                BasicSysCodeService.getSecret());
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

        if (null != jsonObject)
        {
            try
            {
                accessToken = new AccessToken();
                accessToken.setAccessToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
            }
            catch (Exception e)
            {
                accessToken = null;
                // 获取token失败
                log.error(e.getMessage());
            }
        }
        return accessToken;
    }

其中@Scheduled(fixedRate = 1000*7200)表示每2个小时获取一次,因为微信官网中access_token失效的时间是两个小时。
当然获取access_token之前你先要指导自己的appId和secret这两个自己去微信公众号里获取就好。
实在不懂的可以来这里看看:https://jingyan.baidu.com/article/22fe7ced23fa183002617fa1.html

2、编写获取配置信息的类

我们不可能每次写这个的时候都改一次代码,这样是会被祭天的,所以下面的方法可以是代码稍微灵活一些。

package com.zhonghe.yaoqinghan.user.entity;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

/**
 * @author 阿萨
 */
@Component
@ConfigurationProperties(prefix = "basicsyscodeservice")
public class BasicSysCodeService
{
    /**
     * 获取access_token请求的url
     */
    private static String accessTokenUrl;

    private static String appId;

    private static String secret;

    private static String jsapiTicketUrl;

    private static String yqhUrl;

    public static String getYqhUrl() {
        return yqhUrl;
    }
    @Value("${basicsyscodeservice.yqhUrl}")
    public void setYqhUrl(String yqhUrl) {
        BasicSysCodeService.yqhUrl = yqhUrl;
    }

    public static String getJsapiTicketUrl() {
        return jsapiTicketUrl;
    }

    @Value("${basicsyscodeservice.jsapiTicketUrl}")
    public void setJsapiTicketUrl(String jsapiTicketUrl) {
        BasicSysCodeService.jsapiTicketUrl = jsapiTicketUrl;
    }

    public static String getAccessTokenUrl()
    {
        return accessTokenUrl;
    }
    @Value("${basicsyscodeservice.accessTokenUrl}")
    public void setAccessTokenUrl(String accessTokenUrl)
    {
        BasicSysCodeService.accessTokenUrl = accessTokenUrl;
    }

    public static String getAppId()
    {
        return appId;
    }

    @Value("${basicsyscodeservice.appId}")
    public void setAppId(String appId)
    {
        BasicSysCodeService.appId = appId;
    }

    public static String getSecret()
    {
        return secret;
    }

    @Value("${basicsyscodeservice.secret}")
    public void setSecret(String secret)
    {
        BasicSysCodeService.secret = secret;
    }

}


再项目的appliation.yml文件中添加以下信息,具体内容根据项目需要来填写。

basicsyscodeservice:
  # 获取jsapi_ticket的接口链接
  jsapiTicketUrl: https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=%s
  # 获取access_token的接口链接
  accessTokenUrl: https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=%s&secret=%s
  # 微信公众号里提供 需要这个才能获取access_token
  appId: 自己的qppid
  secret: 自己的secret
  # 网页链接(可以没有)
  yqhUrl: 自己的网站链接

3、别忘了写实体类

这里我把需要的实体类全部都放在这了,左右都得建,干脆一次整完。

access_token的实体类

package com.zhonghe.yaoqinghan.user.entity;

import lombok.Data;

/**
 * @author 阿萨
 */
public class AccessToken {
    private  String accessToken;
    private  Integer expiresIn;

    public String getAccessToken() {
        return accessToken;
    }

    public void setAccessToken(String accessToken) {
        this.accessToken = accessToken;
    }

    public Integer getExpiresIn() {
        return expiresIn;
    }

    public void setExpiresIn(Integer expiresIn) {
        this.expiresIn = expiresIn;
    }
}

jsapi_ticket实体类
package com.zhonghe.yaoqinghan.user.entity;

/**
 * @author 阿萨
 */
public class JsapiTicket {
    private Integer errCode;
    private String errMsg;
    private String ticket;
    private Integer expiresIn;

    public Integer getErrCode() {
        return errCode;
    }

    public void setErrCode(Integer errCode) {
        this.errCode = errCode;
    }

    public String getErrMsg() {
        return errMsg;
    }

    public void setErrMsg(String errMsg) {
        this.errMsg = errMsg;
    }

    public String getTicket() {
        return ticket;
    }

    public void setTicket(String ticket) {
        this.ticket = ticket;
    }

    public Integer getExpiresIn() {
        return expiresIn;
    }

    public void setExpiresIn(Integer expiresIn) {
        this.expiresIn = expiresIn;
    }

    @Override
    public String toString() {
        return "JsapiTicket{" +
                "errCode=" + errCode +
                ", errMsg='" + errMsg + '\'' +
                ", ticket='" + ticket + '\'' +
                ", expiresIn=" + expiresIn +
                '}';
    }
}

这是最后返回给前台的实体类。
package com.zhonghe.yaoqinghan.user.entity;

import lombok.Data;
import org.springframework.stereotype.Component;

@Data
public class WXEntity {
    //appid
    private String appId;
    //时间戳
    private String  timestamp;
    //随机数
    private String nonceStr;
    //签名
    private String signature;
    //url
    private String url;
}

4、获取jsapi_ticket

在上面我们获取完了access_token下面我们改获取重要得jsapi_ticket了,废话不多说上代码。

这个jsapi_ticket也是2个小时获取一次,不多解释了,别问,问就是官方文档这么写的。

/**
     * 获取Jsapi_ticke
     *
     * @return
     */
    @Scheduled(initialDelay=1000,fixedRate = 1000*7200)
    private static JsapiTicket getJsapiTicket()
    {
        String requestUrl = String.format(BasicSysCodeService.getJsapiTicketUrl(),
                accessToken.getAccessToken());
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

        if (null != jsonObject)
        {
            try
            {
                jsapiTicket = new JsapiTicket();
                jsapiTicket.setErrCode(jsonObject.getInt("errcode"));
                jsapiTicket.setErrMsg(jsonObject.getString("errmsg"));
                jsapiTicket.setTicket(jsonObject.getString("ticket"));
                jsapiTicket.setExpiresIn(jsonObject.getInt("expires_in"));
            }
            catch (Exception e)
            {
                jsapiTicket = null;
                // 获取token失败
                log.error(e.getMessage());
            }
        }
        return jsapiTicket;
    }

这样我们就获取到了jaspi_ticket了。

5、不要问问我httpsRequest()从哪里来,我给你。

这就是httpsRequest()方法了,请拿去玩耍。
对了,这个方法是我在这个大佬里看到的:https://blog.csdn.net/dfgakldsjkl/article/details/99671431?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-3.channel_param
链接真的长。。。。。。

/**
     * 发送https请求
     *
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */

    private static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr)
    {
        JSONObject jsonObject = null;
        try
        {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = {new MyX509TrustManager()};
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
            conn.setSSLSocketFactory(ssf);

            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);

            // 当outputStr不为null时向输出流写数据
            if (null != outputStr)
            {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null)
            {
                buffer.append(str);
            }

            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            jsonObject = JSONObject.fromObject(buffer.toString());
        }
        catch (ConnectException ce)
        {
            log.error("连接超时:{}", ce);
        }
        catch (Exception e)
        {
            log.error("https请求异常:{}", e);
        }
        System.out.println(jsonObject);
        return jsonObject;
    }
以上我们就获取到了access_token和jsapi_ticket下面我们就该生成我们的签名了!!!!!

6、生成签名

1,生成随机数、时间戳和获取url

我的随机数就偷懒用UUID了,你们也可以自己写。
 /**获取随机数*/
    public static String getNoncestr(){
        return UUID.randomUUID().toString().replace("-", "").substring(0, 16);
    }
    /**获取时间戳*/
    public static String getTimestamp(){
        return String.valueOf(System.currentTimeMillis() / 1000);
    }
    /**获取url*/
    public static String getUrl(){
        return BasicSysCodeService.getYqhUrl();
    }

2,根据微信文档按顺序拼接字符串

注意:一定要注意,拼接顺序不可变,除非是官方文档里改了,不然拼接顺序一定不要改变!!!!!!!!!!
/**
     * @Param [signature, timestamp, ticket, echostr]
     * @Return java.lang.String
     * @Description: 对所有待签名参数按照字段名的ASCII 码从小到大排序
     */
    public static String sort(String url, String timestamp, String ticket, String noncestr) {
        return "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
    }

3,将拼接后的字符串进行SHA1加密

这个咱也不知道为啥,反正官方文档里让这么干,咱就这么干。
/**
     * @Param [str]
     * @Return java.lang.String
     * @Description: 将字符串进行sha1加密
     */
    public static String sha1(String str){
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte[] messageDigest = digest.digest();
            // 创建 16进制字符串
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }

7、Controller里怎么用!!!

这里就不多做解释了,就是调用工具类,在最后我会把工具类分享给大家。
@RequestMapping("/token")
    public Result token(){
        WXEntity wxEntity = new WXEntity();
        //获取appid
        //String appId = BasicSysCodeService.getAppId();
        wxEntity.setAppId(BasicSysCodeService.getAppId());
        //获取时间戳
        String timestamp = CommonUtil.getTimestamp();
        wxEntity.setTimestamp(timestamp);
        //获取随机数
        String nonceStr = CommonUtil.getNoncestr();
        wxEntity.setNonceStr(nonceStr);
        //获取jsapi_ticket码
        String ticket = CommonUtil.jsapiTicket.getTicket();
        //获取网页连接
        String url = CommonUtil.getUrl();
        wxEntity.setUrl(url);
        //拼接
        String str = CommonUtil.sort(url,timestamp,ticket,nonceStr);
        //获取密钥
        String signature = CommonUtil.sha1(str);
        wxEntity.setSignature(signature);

        return Result.ok(wxEntity);
    }

最后献上完整的工具类。

package com.zhonghe.yaoqinghan.utils;

import com.zhonghe.yaoqinghan.user.entity.AccessToken;
import com.zhonghe.yaoqinghan.user.entity.BasicSysCodeService;
import com.zhonghe.yaoqinghan.user.entity.JsapiTicket;
import net.sf.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import javax.net.ssl.HttpsURLConnection;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.ConnectException;
import java.net.URL;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;

/**
 *
 * <p>
 * Description: 微信工具类
 * </p>
 *
 * @author 阿萨
 * @version v1.0.0
 * @since 2020-08-13 13:09:05
 * @see com.zhonghe.yaoqinghan.utils
 *
 */
@Component
public class CommonUtil
{
    private static Logger log = LoggerFactory.getLogger(CommonUtil.class);

    public static AccessToken accessToken = null;

    public static JsapiTicket jsapiTicket = null;

    /**
     * 获取接口访问凭证
     *
     * @return
     */
    @Scheduled(fixedRate = 1000*7200)
    private static AccessToken getAccessToken()
    {
        String requestUrl = String.format(BasicSysCodeService.getAccessTokenUrl(),
                BasicSysCodeService.getAppId(),
                BasicSysCodeService.getSecret());
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

        if (null != jsonObject)
        {
            try
            {
                accessToken = new AccessToken();
                accessToken.setAccessToken(jsonObject.getString("access_token"));
                accessToken.setExpiresIn(jsonObject.getInt("expires_in"));
            }
            catch (Exception e)
            {
                accessToken = null;
                // 获取token失败
                log.error(e.getMessage());
            }
        }
        return accessToken;
    }


    /**
     * 获取Jsapi_ticke
     *
     * @return
     */
    @Scheduled(initialDelay=1000,fixedRate = 1000*7200)
    private static JsapiTicket getJsapiTicket()
    {
        String requestUrl = String.format(BasicSysCodeService.getJsapiTicketUrl(),
                accessToken.getAccessToken());
        // 发起GET请求获取凭证
        JSONObject jsonObject = httpsRequest(requestUrl, "GET", null);

        if (null != jsonObject)
        {
            try
            {
                jsapiTicket = new JsapiTicket();
                jsapiTicket.setErrCode(jsonObject.getInt("errcode"));
                jsapiTicket.setErrMsg(jsonObject.getString("errmsg"));
                jsapiTicket.setTicket(jsonObject.getString("ticket"));
                jsapiTicket.setExpiresIn(jsonObject.getInt("expires_in"));
            }
            catch (Exception e)
            {
                jsapiTicket = null;
                // 获取token失败
                log.error(e.getMessage());
            }
        }
        return jsapiTicket;
    }

    /**
     * 发送https请求
     *
     * @param requestUrl 请求地址
     * @param requestMethod 请求方式(GET、POST)
     * @param outputStr 提交的数据
     * @return JSONObject(通过JSONObject.get(key)的方式获取json对象的属性值)
     */

    private static JSONObject httpsRequest(String requestUrl, String requestMethod, String outputStr)
    {
        JSONObject jsonObject = null;
        try
        {
            // 创建SSLContext对象,并使用我们指定的信任管理器初始化
            TrustManager[] tm = {new MyX509TrustManager()};
            SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE");
            sslContext.init(null, tm, new java.security.SecureRandom());
            // 从上述SSLContext对象中得到SSLSocketFactory对象
            SSLSocketFactory ssf = sslContext.getSocketFactory();

            URL url = new URL(requestUrl);
            HttpsURLConnection conn = (HttpsURLConnection)url.openConnection();
            conn.setSSLSocketFactory(ssf);

            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.setUseCaches(false);
            // 设置请求方式(GET/POST)
            conn.setRequestMethod(requestMethod);

            // 当outputStr不为null时向输出流写数据
            if (null != outputStr)
            {
                OutputStream outputStream = conn.getOutputStream();
                // 注意编码格式
                outputStream.write(outputStr.getBytes("UTF-8"));
                outputStream.close();
            }

            // 从输入流读取返回内容
            InputStream inputStream = conn.getInputStream();
            InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
            BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
            String str = null;
            StringBuffer buffer = new StringBuffer();
            while ((str = bufferedReader.readLine()) != null)
            {
                buffer.append(str);
            }

            // 释放资源
            bufferedReader.close();
            inputStreamReader.close();
            inputStream.close();
            inputStream = null;
            conn.disconnect();
            jsonObject = JSONObject.fromObject(buffer.toString());
        }
        catch (ConnectException ce)
        {
            log.error("连接超时:{}", ce);
        }
        catch (Exception e)
        {
            log.error("https请求异常:{}", e);
        }
        System.out.println(jsonObject);
        return jsonObject;
    }


    /**获取随机数*/
    public static String getNoncestr(){
        return UUID.randomUUID().toString().replace("-", "").substring(0, 16);
    }
    /**获取时间戳*/
    public static String getTimestamp(){
        return String.valueOf(System.currentTimeMillis() / 1000);
    }
    /**获取url*/
    public static String getUrl(){
        return BasicSysCodeService.getYqhUrl();
    }

    /**
     * @Param [signature, timestamp, ticket, echostr]
     * @Return java.lang.String
     * @Description: 对所有待签名参数按照字段名的ASCII 码从小到大排序
     */
    public static String sort(String url, String timestamp, String ticket, String noncestr) {
        return "jsapi_ticket=" + ticket + "&noncestr=" + noncestr + "&timestamp=" + timestamp + "&url=" + url;
    }

    /**
     * @Param [str]
     * @Return java.lang.String
     * @Description: 将字符串进行sha1加密
     */
    public static String sha1(String str){
        try {
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.update(str.getBytes());
            byte[] messageDigest = digest.digest();
            // 创建 16进制字符串
            StringBuffer hexString = new StringBuffer();
            // 字节数组转换为 十六进制 数
            for (int i = 0; i < messageDigest.length; i++) {
                String shaHex = Integer.toHexString(messageDigest[i] & 0xFF);
                if (shaHex.length() < 2) {
                    hexString.append(0);
                }
                hexString.append(shaHex);
            }
            return hexString.toString();

        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return "";
    }
}


在这里对所有对我有帮助的文章和文档表示感谢,感谢大佬,给跪一个。由于文章太多就不把链接都写上了,(os:大佬不要骂我啊,我真的是忘记保存你们链接了,对不起!!!)
最后希望我这篇不成熟的文章可以对大家有所帮助,再次感谢观看。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 微信jssdk是一种用于在网页中调用微信功能的开发工具包。其中,获取位置是其中的一个功能之一。当在调用微信jssdk获取位置接口时,如果出现获取位置失败,签名错误的情况,可能是以下几个原因所导致: 1. 签名错误:在调用获取位置接口前,需要对相关参数进行签名验证,以确保数据的完整性和安全性。签名错误可能是由于签名算法实现错误、调用接口时传入的参数错误或者服务器时间戳与微信服务器时间戳不一致等原因所导致。解决方法是检查签名算法是否正确,参数是否正确传递,并确保服务器时间戳与微信服务器时间戳一致。 2. 接口权限问题:在申请微信jssdk使用权限时,需要在公众号设置中配置相关权限。如果没有正确配置接口权限,则无法调用获取位置接口,会出现获取位置失败的情况。解决方法是检查公众号设置中的权限配置,确保获取位置接口的权限被正确开启。 3. 用户拒绝授权:在用户使用网页时,系统会通过微信弹出授权窗口,询问用户是否允许获取位置信息。如果用户选择拒绝授权,则无法获取位置信息,从而导致获取位置失败的情况。解决方法是在用户拒绝授权后,提示用户重新授权,或者提供其他方式获取位置信息。 总之,当微信jssdk获取位置失败,签名错误时,需要仔细检查签名算法、参数传递和接口权限配置等方面的问题,并根据具体情况进行相应的调整和处理。 ### 回答2: 微信jssdk是一个用于在网页中调用微信的接口的开发工具包。在使用jssdk时,通过wx.config方法来进行配置,并且在配置的过程中需要传入一个参数:签名(signature)。 签名是基于一定算法生成的,用于验证消息的真实性和完整性。当微信jssdk获取位置失败并且报错签名错误时,可能是由以下几个原因造成的: 1. 签名生成错误:签名的生成过程中可能出现错误,导致最终生成的签名不正确。这可能是由于服务端生成签名的算法或参数配置有误,需要检查签名生成代码并修正错误。 2. 参数传递错误:在传递签名参数时,可能存在传递错误的情况。签名参数包括appId、timestamp、nonceStr、signature,这些参数需要按照规定的格式传递给wx.config方法。需要仔细检查参数传递的过程,确保参数的准确性和完整性。 3. SSL证书问题:微信要求在调用jssdk使用HTTPS协议,并且需要使用有效的SSL证书。如果网页没有配置有效的SSL证书,那么在获取位置时会报错签名错误。需要确保网页使用HTTPS协议,并且配置了有效的SSL证书。 解决以上问题的步骤为: 1. 检查签名生成代码,确认生成签名的算法和参数没有错误; 2. 检查参数传递过程,确保传递给wx.config方法的参数准确无误; 3. 确认网页使用了HTTPS协议,并配置了有效的SSL证书; 4. 在修改代码后,重新测试获取位置功能,如果问题仍然存在,可以参考微信官方文档或寻求微信开发者论坛的帮助。 ### 回答3: 微信 JSSDK 是一种用于开发微信公众号的前端开发工具包,它提供了丰富的接口和功能,方便开发者构建丰富的微信公众号应用。当使用 JSSDK 中的定位功能时,获取位置失败并出现签名错误的问题可能是由以下几个原因引起的。 1. 网络问题:在使用微信 JSSDK 时,要求设备能够连接到互联网,如果网络不稳定或者设备无法连接到互联网,就可能导致定位功能失败。请确保设备有稳定的网络连接。 2. 位置权限:微信 JSSDK 需要用户授权才能获取设备的位置信息。如果用户拒绝了位置权限请求,那么就无法获取到位置信息。在使用定位功能前,应该向用户请求位置权限,并在用户授权后才能使用。 3. 未配置有效的签名:微信 JSSDK 需要在后台进行配置并生成签名,用于验证请求的合法性。如果签名错误,就无法正确获取位置信息。在生成签名时,需要保证参数的正确性,包括参数的顺序、大小写等。请仔细检查签名生成的代码逻辑和参数配置是否正确。 4. 使用的 API 接口不支持:微信 JSSDK 提供了多个获取位置的接口,不同的接口可能有不同的要求和适用场景。如果使用的接口与当前场景不匹配或者不支持当前设备的操作系统版本,可能会导致获取位置失败。请确认使用的接口与当前场景的要求是匹配的。 综上所述,当微信 JSSDK 获取位置失败并出现签名错误时,可能是网络问题、位置权限、签名配置或使用的接口不正确导致的。在解决问题时,可以逐一排查以上原因,并根据具体情况进行相应的调试和处理。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值