首页 > 其他分享 >JSSDK获取signature签名,史上最全,没有之一

JSSDK获取signature签名,史上最全,没有之一

时间:2023-12-12 17:31:57浏览次数:33  
标签:java String JSSDK 最全 获取 signature import ticket jsapi

微信公众号JSSDK获取signature签名,史上最全,没有之一

1.操作流程

1、通过appId和appSecret获取access_token;

2、使用access_token获取jsapi_ticket ;

3、用时间戳、随机数、jsapi_ticket和要访问的url按照签名算法拼接字符串;

4、对第三步得到的字符串进行SHA1加密,得到签名。

2.上代码

获取accessToken与jsapi_ticket代码

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

/**
 * HTTPUtil get方法工具类
 *
 * @author javaNice
 * @time 2023年10月08日
 */
@Slf4j
public class HttpUtils {
    // 获取accesstoken
    public final static String GetAccessTokenUrl = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=APPID&secret=SECRET";

    // 获取ticket
    public final static String GetTicketUrl = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi";


    /**
     * 传递请求url
     * @param requestUrl
     * @return
     */
    public static String sendGet(String requestUrl) {
        BufferedReader in = null;
        String result = "";
        try {
            URL realUrl = new URL(requestUrl);
            // 打开和URL之间的连接
            URLConnection connection = realUrl.openConnection();
            // 设置通用的请求属性
            connection.setRequestProperty("accept", "*/*");
            connection.setRequestProperty("connection", "Keep-Alive");
            connection.setRequestProperty("user-agent",
                    "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            // 建立实际的连接
            connection.connect();

            //获取返回结果
            in = new BufferedReader(new InputStreamReader(
                    connection.getInputStream()));
            String line;
            while ((line = in.readLine()) != null) {
                result += line;
            }
        } catch (Exception e) {
            log.error("发送GET请求出现异常!" + e);
            e.printStackTrace();
        }
        // 使用finally块来关闭输入流
        finally {
            try {
                if (in != null) {
                    in.close();
                }
            } catch (Exception e2) {
                log.error("发送GET请求出现异常e2!" + e2);
                e2.printStackTrace();
            }
        }
        return result;
    }


    public static void main(String[] args) {
        String appid="你自己的appid";
        String secret="你自己的appSecret";
        String accessTokenRequestUrl = GetAccessTokenUrl.replace("APPID", appid).replace("SECRET", secret);

        //获取accessToken
        String accessTokenResult = HttpUtils.sendGet(accessTokenRequestUrl);
        JSONObject accessTokenJsonObject = JSON.parseObject(accessTokenResult);
        String  accessToken = String.valueOf(accessTokenJsonObject.get("access_token"));


        System.out.println(accessToken);
        String ticketRequestUrl = GetTicketUrl.replace("ACCESS_TOKEN", accessToken);
        String ticketResult = HttpUtils.sendGet(ticketRequestUrl);

        //获取ticket
        JSONObject ticketResultJsonObject = JSON.parseObject(ticketResult);
        String ticket = String.valueOf(ticketResultJsonObject.get("ticket"));
        System.out.println(ticket);


    }
}

加密获取sign代码

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Formatter;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

public class WxSign {


    public static void main(String[] args) {
        String jsapi_ticket = "获取到的ticket";

        // 注意 URL 一定要动态获取,不能 hardcode
        String url = "http://example.com";
        Map<String, String> ret = sign(jsapi_ticket, url);
        for (Map.Entry entry : ret.entrySet()) {
            System.out.println(entry.getKey() + ", " + entry.getValue());
        }
    };

    public static Map<String, String> sign(String jsapi_ticket, String url) {
        Map<String, String> ret = new HashMap<String, String>();
        String nonce_str = create_nonce_str();
        String timestamp = create_timestamp();
        String string1;
        String signature = "";

        //注意这里参数名必须全部小写,且必须有序
        string1 = "jsapi_ticket=" + jsapi_ticket +
                "&noncestr=" + nonce_str +
                "×tamp=" + timestamp +
                "&url=" + url;
        System.out.println(string1);

        try
        {
            MessageDigest crypt = MessageDigest.getInstance("SHA-1");
            crypt.reset();
            crypt.update(string1.getBytes("UTF-8"));
            signature = byteToHex(crypt.digest());
        }
        catch (NoSuchAlgorithmException e)
        {
            e.printStackTrace();
        }
        catch (UnsupportedEncodingException e)
        {
            e.printStackTrace();
        }

        ret.put("url", url);
        ret.put("jsapi_ticket", jsapi_ticket);
        ret.put("nonceStr", nonce_str);
        ret.put("timestamp", timestamp);
        ret.put("signature", signature);

        return ret;
    }

    private static String byteToHex(final byte[] hash) {
        Formatter formatter = new Formatter();
        for (byte b : hash)
        {
            formatter.format("%02x", b);
        }
        String result = formatter.toString();
        formatter.close();
        return result;
    }

    private static String create_nonce_str() {
        return UUID.randomUUID().toString();
    }

    private static String create_timestamp() {
        return Long.toString(System.currentTimeMillis() / 1000);
    }
}

整个流程官方文档地址

https://developers.weixin.qq.com/doc/offiaccount/OA_Web_Apps/JS-SDK.html#8

获取accesstoken官方文档

https://developers.weixin.qq.com/doc/offiaccount/Basic_Information/Get_access_token.html

官方校验签名是否正确网址

https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign

JSSDK获取signature签名,史上最全,没有之一_java

官方获取加密签名代码示例代码包

https://www.weixinsxy.com/jssdk/sample.zip

备注:链接中包含php、java、nodejs以及python的示例代码供第三方参考,第三方切记要对获取的accesstoken以及jsapi_ticket进行缓存以确保不会触发频率限制。

常见错误40164

{"errcode":40164,"errmsg":"invalid ip 122.69.0.54 ipv6 ::ffff:122.69.0.54, not in whitelist rid: 65224c13-74f9b1e4-106f93ca"}

报此错误表示 需要将122.69.0.54 加入到app的白名单中

标签:java,String,JSSDK,最全,获取,signature,import,ticket,jsapi
From: https://blog.51cto.com/u_16337916/8789783

相关文章

  • 全网最全,MySQL 增删改查高级命令硬核总结
    MySQL入门教程:全网最全,MySQL增删改查高级命令硬核总结原创 白鹿第一帅 白鹿第一帅 2023-12-0507:00 发表于四川文章目录前言一、连接到MySQL数据库1.1、连接到本机上的MySQL1.2、连接到远程主机上的MySQL二、退出MySQL命令三、修改MySQL密码3.1、先给roo......
  • arcgis 最全SDK下载
    一、产品介绍:作为开发人员,您可以在自己的制图应用程序中使用我们的高级制图服务,也可以灵活使用ArcGIS系统来满足组织的特定需求。解决方案合作伙伴、集成商和Esri自己的开发人员使用ArcGIS应用程序编程接口(API)和软件开发工具包(SDK)来开发启用位置的产品、解决方案,......
  • Markdown最全基本语法整理 - 有这一篇就够了
    参考:Markdown最全基本语法整理-有这一篇就够了-郭炫韩Coding-博客园(cnblogs.com)    《一》什么是MarkdownMarkdown是一种轻量级的标记语言,它允许人们使用易读易写的纯文本格式编写文档,借助可实现快速排版且转换成格式丰富的HTML页面。目前被越来越多的写作爱好......
  • 私域最全养号攻略---微信
    微信号的使用规则:注册新微信、微信实名认证、主动添加好友、面对面建群、被动添加好友、进群限制、朋友圈限制、好友上限微信权重加分规则:基础信息是否完整、注册时间、微信使用行为、微信权重扣分规则:使用的环境是否正常、部分行为会导致权重分扣减、违规导致扣减权重分微信的3个......
  • 史上最全运维岗位规划!十分钟找到职业方向
    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够7×24小时为用户提供高质量的服务。运维人员对公司互联网业务所依赖的基础设施、基础服务、线上业务进行稳定性加强,进行日常巡检发现服务可能存在的隐患,对整体架构进行优化以屏蔽常见的运行故障,......
  • docker拉取镜像错误missing signature key
    Centos7,使用docker拉取的时候,报错信息:missingsignaturekey解决:1、复制下面的内容yumerasedocker\docker-client\docker-client-latest\docker-common\docker-latest\......
  • 2023年最全在线聊天客服系统聚合软件推荐
    在这个全球化盛行的时代,跨境出海已经成为许多企业拓展业务的必然选择。然而,随之而来的挑战也是不可忽视的。在全球市场多种多样的社交媒体平台中,如何获取快速地集成多渠道信息成为了企业获取国际市场客户的关键。拥有一个可以聚合多渠道信息的平台,将成为企业在跨境出海中的得力助手......
  • 259k+ Star!这是我见过最全的开发者技术学习路线!
    大家好,我是Java陈序员。自从上班后,身体是一天不如一天了,也很少有时间可以去学习新技术了。程序员如果技术跟不上,很容易就被淘汰。而碎片化的学习效率又不高,往往今天学了,明天就忘了。有时候更是不知道要学习什么技术!今天给大家推荐一个开发者技术学习路线,让我们在学习技术时可......
  • Tightly Secure Lattice Identity-Based Signature in the Quantum Random Oracle Mod
    Abstract.Wepresentaquantumlysecureidentity-basedsignatureschemebasedonthestandardshortintegersolutionproblem,featuringtightsecurityreductionsinthequantumandclassicrandomoraclemodels.Theschemehasshortsignatures.Eachsignat......
  • uniapp使用微信jssdk自定义分享
    前言提示:本文记录的是使用uniapp开发的H5+APP项目,H5端使用微信自定义分享功能,文中有关APP的兼容,如果不需要兼容APP的可以忽略一、引入首先安装jweixin-module包npminstalljweixin-module--save二、封装工具方法为了方便使用,新建一个wechat.js文件://#ifdefH5impo......