微信公众号请求获取相关权限后端代码

用微信的东西,总要避免到各种与微信那边的交互。

1.首先要有个接口,证明你是服务端(填写服务器配置

接入概述 | 微信开放文档

主代码

  /*** 服务器配置验证* @param* @return*/@PassToken@GetMapping("/giveWxCheck")public String giveWxCheck(@RequestParam(required = false) String signature, @RequestParam(required = false) String timestamp, @RequestParam(required = false) String nonce, @RequestParam(required = false) String echostr) {String[] array = {"需要填写的token", timestamp, nonce};Arrays.sort(array);System.out.println("微信发来的是"+signature);String str = Md5Tools.sha1(StringUtils.join(array));System.out.println("我生成的是"+s);if (str.equals(signature)) {return echostr;}return "失败";}

Md5Tools工具类

package com.dengta.tanzhiwcustomermarket.tools;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;public class Md5Tools {public static String generateMD5(String input) {try {MessageDigest md = MessageDigest.getInstance("MD5");byte[] digest = md.digest(input.getBytes());StringBuilder sb = new StringBuilder();for (byte b : digest) {sb.append(String.format("%02x", b & 0xff));}return sb.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}//生成随机字符串public static String suijiStr(){// 指定随机字符串的长度int length = 16;// 可选的字符集合String charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";// 使用安全的随机数生成器生成随机字符串SecureRandom secureRandom = new SecureRandom();StringBuilder noncestr = new StringBuilder(length);for (int i = 0; i < length; i++) {int randomIndex = secureRandom.nextInt(charset.length());noncestr.append(charset.charAt(randomIndex));}// 打印生成的随机字符串//System.out.println("noncestr=" + noncestr);return noncestr.toString();}public static String sha1(String input){// 将输入字符串转换为字节数组try {MessageDigest messageDigest = MessageDigest.getInstance("SHA1");byte[] inputBytes = input.getBytes();byte[] digestBytes = messageDigest.digest(inputBytes);StringBuilder stringBuilder = new StringBuilder();for (byte b : digestBytes) {stringBuilder.append(String.format("%02x", b));}System.out.println(stringBuilder);return stringBuilder.toString();} catch (NoSuchAlgorithmException e) {e.printStackTrace();return null;}}
}

2.JSSDK验证,前端需要这个去请求权限

概述 | 微信开放文档

签名算法

    @PassToken@ApiOperation(value = "微信公众号token SDK")@RequestMapping(value = "/wxSdkInfo2", method = {RequestMethod.POST})public CommonResult wxSdkInfo2(@RequestBody CustomerMarket market){if(market.getUrl()==null||market.getUrl()==""){return CommonResult.failed("必须传入当前网页的url");}String appId="xx";String appSecret ="xxx";String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&" +"appid="+appId+"&secret="+appSecret;try {//获取tokenString access_token=null;JSONObject jsonObject = HttpUtils.httpGet(url);System.out.println("1.------------请求微信access_token的返回值:"+jsonObject);if(jsonObject.getString("access_token")!=null){access_token = jsonObject.getString("access_token");Integer expires_in = jsonObject.getInteger("expires_in");//设置过期时间}else {logger.info("错误,请求微信获取access_token失败"+url);return CommonResult.failed("获取微信access_token失败");}System.out.println("access_token是"+access_token);//获取ticketString ticket =null;url="https://api.weixin.qq.com/cgi-bin/ticket/getticket?" +"access_token=" + access_token +"&type=jsapi";jsonObject = HttpUtils.httpGet(url);System.out.println("2.------------请求微信ticket的返回值:"+jsonObject);if(jsonObject.getString("ticket")!=null){ticket = jsonObject.getString("ticket");Integer expires_in = jsonObject.getInteger("expires_in");}else{logger.info("错误,请求微信获取ticket失败"+url);return CommonResult.failed("获取微信ticket失败");}System.out.println("ticket是"+ticket);//生成签名String nonceStr = Md5Tools.suijiStr();//生成时间戳long currentTimeMillis = System.currentTimeMillis();long currentTimestampInSeconds = currentTimeMillis / 1000;String[] parameters = new String[]{"jsapi_ticket=" + ticket, "timestamp=" + currentTimestampInSeconds,"noncestr=" + nonceStr, "url=" + market.getUrl()};String signature  = SignatureUtil.generateSignature(parameters);JSONObject rs = new JSONObject();rs.put("appId",appId);rs.put("timestamp",currentTimestampInSeconds);rs.put("nonceStr",nonceStr);rs.put("signature",signature);logger.info("封装返回的结果是"+rs);return CommonResult.success(rs);} catch (Exception e) {e.printStackTrace();return CommonResult.failed(e.toString());}}

SignatureUtil工具类

package com.dengta.tanzhiwcustomermarket.tools;import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;public class SignatureUtil {public static String generateSignature(String[] parameters) throws NoSuchAlgorithmException {Arrays.sort(parameters);StringBuilder stringBuilder = new StringBuilder();for (String parameter : parameters) {stringBuilder.append(parameter).append("&");}System.out.println("拼接的字符是"+stringBuilder.toString());String substring = stringBuilder.substring(0, stringBuilder.length() - 1);System.out.println("切分后的是"+substring);
//        appKey
//        stringBuilder.append("key=").append(appKey);String signature = Md5Tools.sha1(substring);return signature;}}

最后拿返回的请求还有日志的ticket,去微信比对,如果你生成的和微信生成一样,就没问题。

微信 JS 接口签名校验工具

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/317775.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一文讲清数据资产入表实操

《中共中央 国务院关于构建数据基础制度更好发挥数据要素作用的意见》已发布一年&#xff0c;数据资产化和入表已成为2023年的热门话题&#xff0c;随着2023年底国家数据局吹风《"数据要素x"三年行动计划&#xff08;2024-2026年&#xff09;》即将发布&#xff0c;这…

面试题:Linux命令大全

序号命令对应英文作用1ls [目录名]list查看当前目录下的内容2pwdprint work directory查看当前所在目录3cd [目录名]change directory切换目录4touch [文件名]touch如果文件不存在,创建文件5mkdir [目录名]make directory创建目录6rm [文件名]remove删除指定文件 ls 查看当前目…

LDD学习笔记 -- Linux内核模块

LDD学习笔记 -- 内核模块 简介LKM类型Static Linux Kernel ModuleDynamic Linux Kernel ModuleLKM编写语法 syntax详细描述内核头文件用户空间头文件Module Initialization FunctionModule Cleanup FunctionKeyword & Tag宏 __init __exitLKM入口注册Module Metadate&#…

成都谷达冠楠:抖店创业需要多少钱成本

随着互联网的发展&#xff0c;越来越多的人选择在网上开设自己的店铺&#xff0c;其中抖音小店因其独特的推广方式和巨大的流量优势&#xff0c;成为了许多人创业的首选。那么&#xff0c;开一家抖音小店需要多少成本呢?这是许多创业者关心的问题。 首先&#xff0c;我们需要明…

1.3 day3 IO进程线程

使用标准IO进行文件拷贝 #include <myhead.h> int main(int argc, const char *argv[]) {if(argc!3)//外部传参{printf("input error\n");}//定义两个文件指针FILE *fpNULL;FILE *cfpNULL;if((fpfopen(argv[1],"r"))NULL){perror("fopen error…

如何将图像数据转换为.mat文件,mat文件内是cell封装的struct格式的数据

在我看论文&#xff1a;《 Holistically-nested Edge Detection (HED) 》的时候&#xff0c;对论文中有关边缘结果的评价指标很感兴趣&#xff0c;于是我就研究了如何计算这些指标 如果有同样感兴趣或者有需要的小伙伴可以下载这里的代码&#xff1a;GitHub - xwjabc/hed: A P…

单片机原理及应用:独立式键盘控制LED与多功能按键识别

今天来介绍另一个外设——按键与LED的配合工作&#xff0c;与开关不同&#xff0c;按键需要注意消除抖动带来的影响&#xff0c;代码逻辑也会更复杂一写&#xff0c;下面先为大家介绍独立式键盘的相关知识。 单片机的独立式键盘指的是一种不依赖于计算机或其他外部设备的键盘输…

Calibre PEX Hspice Netlist提取步骤(数模芯片提取spice netlist流程)

在数模混合芯片中&#xff0c;通常模拟需要数字模块通过calibre工具来提取Hspice netlist用于功耗仿真。注意这里的spice netlist和做Calibre的spice netlist是不太一样的。 另外在做calibre pex时需要确保当前的design LVS已经pass。否则功耗仿真可能会不准。 Calibre LVS常…

rime中州韵小狼毫 inputShow lua Translator 输入字符透传翻译器

在 rime中州韵小狼毫 help lua Translator 中我们分享了如何使用 lua 脚本定义一个 translator&#xff0c;并以 五笔・拼音 为例引用了该 translator&#xff0c;并且达到了预期的效果。 今天&#xff0c;我们继续通过 lua 脚本为 rime中州韵/小狼毫 输入法打造一个 translat…

JRT控制打印机

本次测试打印机控制和纸张方向控制。 打印机状态 选择打印机 控制纸张 定义纸张 旋转纸张 不旋转纸张 A4

BLE Mesh蓝牙组网技术详细解析之Access Layer访问层(六)

目录 一、什么是BLE Mesh Access Layer访问层&#xff1f; 二、Access payload 2.1 Opcode 三、Access layer behavior 3.1 Access layer发送消息的流程 3.2 Access layer接收消息的流程 3.3 Unacknowledged and acknowledged messages 3.3.1 Unacknowledged message …

php安装扩展event 提示 No package ‘openssl‘ found 解决方法

在使用pecl编译安装最新版event模块的时候提示 No package openssl found , 可是本机是安装了openssl的, 编译时找不到, 大概率就是环境配置的问题了, 增加 OPENSSL_CFLAGS OPENSSL_LIBS环境变量即可解决. 异常提示信息: checking for openssl > 1.0.2... no configure: …