步骤看官网文档,这里只有java后台代码

签名工具类

import java.security.MessageDigest;

import java.security.NoSuchAlgorithmException;

import java.util.*;

/**

* @author xmg

* @Description 签名工具类

* @Date:2019/5/7

*/

public class SignUtil {

/**

* 前端jssdk页面配置需要用到的配置参数

* @param url

* @return {appid,timestamp,nonceStr,signature}

* @throws Exception

*/

public static HashMap jsSDK_Sign(String url) throws Exception {

String nonce_str = create_nonce_str();

String timestamp= System.currentTimeMillis()/1000 + "";

String jsapi_ticket= WxService.getJsSdkTicket();

// 注意这里参数名必须全部小写,且必须有序

// 参数

Map packageParams = new HashMap<>();

packageParams.put("url", url);

packageParams.put("noncestr", nonce_str);

packageParams.put("jsapi_ticket", jsapi_ticket);

packageParams.put("timestamp", timestamp);

// 获得拼接好的参数,按照ASCLL大小排序

String createLinkString = createLinkString(packageParams);

String signature = SHA1(createLinkString);

// 参数封装,返回前台

HashMap jssdk=new HashMap();

jssdk.put("appId", WxService.APP_ID);

jssdk.put("timestamp", timestamp);

jssdk.put("nonceStr", nonce_str);

jssdk.put("signature", signature);

return jssdk;

}

public static String SHA1(String decript) {

try {

MessageDigest digest = java.security.MessageDigest.getInstance("SHA-1");

digest.update(decript.getBytes());

byte messageDigest[] = digest.digest();

// Create Hex String

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 "";

}

/**

* 把数组所有元素排序,并按照“参数=参数值”的模式用“&”字符拼接成字符串

* @param params 需要排序并参与字符拼接的参数组

* @return 拼接后字符串

*/

public static String createLinkString(Map params) {

List keys = new ArrayList(params.keySet());

Collections.sort(keys);

String prestr = "";

for (int i = 0; i < keys.size(); i++) {

String key = keys.get(i);

String value = params.get(key);

if (i == keys.size() - 1) {// 拼接时,不包括最后一个&字符

prestr = prestr + key + "=" + value;

} else {

prestr = prestr + key + "=" + value + "&";

}

}

return prestr;

}

private static String create_nonce_str() {

return UUID.randomUUID().toString();

}

}

/**

* @author xmg

* @Description Ticket封装

* @Date:2019/5/7 0:31

*/

public class Ticket {

/** ticket */

private String ticket;

/** 过期时间 */

private long expiresTime;

public String getTicket() {

return ticket;

}

public void setTicket(String ticket) {

this.ticket = ticket;

}

public long getExpiresTime() {

return expiresTime;

}

public void setExpiresTime(long expiresTime) {

this.expiresTime = expiresTime;

}

public Ticket(String ticket, String expiresIn) {

super();

this.ticket = ticket;

this.expiresTime = System.currentTimeMillis() + Integer.parseInt(expiresIn)*1000;

}

/**

* 判断token是否过期

* @return

*/

public boolean isExpired(){

return System.currentTimeMillis() > this.expiresTime;

}

}

import org.apache.commons.lang3.StringUtils;

import org.slf4j.Logger;

import org.slf4j.LoggerFactory;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.stereotype.Service;

import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;

import java.io.InputStream;

import java.util.*;

/**

* @author xmg

* @Description

* @email 463364973@qq.com

*

* Date:2019/4/5 15:25

*/

@Service

public class WxService {

private final static Logger LOGGER = LoggerFactory.getLogger(WxService.class);

/** 获取ticket地址 */

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

/** appid */

public final static String APP_ID = "你自己appid";

/** appsecret */

public final static String APP_SECRET = "你自己的secret";

private static Ticket TICKET;

/**

* 获取ticket

*/

private static void getTicket(){

// RestTemplate

RestTemplate restTemplate = new RestTemplate();

String url = GET_TICKET_URL.replace("ACCESS_TOKEN",getAccessToken());

String forObject = restTemplate.getForObject(url, String.class);

JSONObject jsonObject = JSONUtil.parseObj(forObject);

String ticket = jsonObject.getStr("ticket");

String expiresIn = jsonObject.getStr("expires_in");

// 创建token对象,并存起来

TICKET = new Ticket(ticket,expiresIn);

}

/**

* 向外暴露的获取Ticket方法

* @return

*/

public static String getJsSdkTicket(){

if (TICKET == null || TICKET.isExpired()){

getTicket();

}

return TICKET.getTicket();

}

}

java 配置微信js sdk,微信JSSDKconfig接口注入权限验证配置的参数获取--java版相关推荐

  1. C# 微信JS-SDK之config接口注入权限验证invalid signature签名错误

    文章目录 1.开发环境 2.我的代码 3.问题描述 4.问题分析 5.问题根源 6.解决办法 记一次使用微信JS-SDK分享接口,config接口注入权限验证失败, 提示invalid signatu ...

  2. 微信js sdk图片接口 上传图片

    开发微信平台网页不可避免的需要调用微信提供的接口.微信JS-SDK提供了方便的调用. 需要实现上传图片更换头像的功能,要用到图片相关的几个接口.根据微信开发者文档的说明,步骤一绑定域名,步骤二引入js ...

  3. PHP版微信权限验证配置,音频文件下载,FFmpeg转码,上传OSS和删除转存服务器本地文件...

    2019独角兽企业重金招聘Python工程师标准>>> 一.概述和通过config接口注入权限验证配置 由于微信的临时素材(如:录音文件)上传到微信服务器上,微信后台保存时间为3天. ...

  4. 微信js sdk 授权上传头像下载代码片段和注意事项

    /*  * 描述:当前页授权  * @param url   例:index.html / 如果有参数,需加密index.html?id=1     */ 1.对需要运用js sdk的页面授权 get ...

  5. 使用微信js sdk关于选择及上传图片至腾讯云COS

    使用微信js sdk关于选择及上传图片至腾讯云COS 使用微信js sdk关于选择及上传图片至腾讯云COS 背景 名词 参考 效果图展示 开发步骤 1:概要步骤 2:上代码 结束: 使用微信js sd ...

  6. 实战微信JS SDK开发:贺卡制作与播放(1)

    前段时间忙于CanTK 2.0的开发,所以博客一直没有更新.CanTK 2.0主要增强了游戏和富媒体的开发,现在编码和测试基本完成了,等文档完成了再正式发布,里面有不少激动人心的功能,等发布时再一一细 ...

  7. 微信-js sdk invalid signature签名错误 问题解决

    微信-js sdk invalid signature签名错误 问题解决 参考文章: (1)微信-js sdk invalid signature签名错误 问题解决 (2)https://www.cn ...

  8. 微信js sdk 分享 失败 有时候好 有时候坏

    微信js sdk 分享 失败  有时候好 有时候坏 用了一个www开头的域名 和一个xx.com的域名 两个在解析上有问题. 实践是www.xx.com的比较 稳定 转载于:https://www.c ...

  9. 微信JS SDK开放,前端开发者“鸡冻”了!

    HTML5又一次逆袭了,其实之前微信也是有一些JS API的,比如分享.但这次一股脑开放了拍摄.录音.语音识别.二维码.地图.支付.分享.卡券等几十个API,这条消息不需宣传,瞬间就占满了HTML5从 ...

最新文章

  1. linux c 命令行参数处理函数 getopt()和getopt_long()
  2. 皮一皮:所以这也是大数据的一种?
  3. mybatis sql标签_这谁顶得住?Mybatis 十八连环问
  4. Azure实践之automation自动整理资产信息
  5. Redis 面试题 50 问,史上最全
  6. Python有哪些是必须学的运算符?
  7. Swift面向对象基础(上)——Swift中的类和结构体(下)
  8. python方向键键值_python字典键值对的添加和遍历方法
  9. android纹理存储,Android:OpenGL存储纹理多长时间?
  10. 程序员的进阶课-架构师之路(3)-线性表
  11. 管道符和作业控制 shell变量 环境变量配置文件
  12. Activiti 工作流变量的修改方法
  13. 2.第一个页面amp;amp;分辨率和rpx
  14. 计算机硬盘通过usb接口,并口硬盘转usb接口的方法介绍【详解】
  15. Python自学教程3-英语不好,变量怎么命名
  16. foxmail群发邮件怎么发?
  17. apktool 回编译说文件名或扩展名太长
  18. 关于ios9中得AddressBook和AddressBookUI框架过时问题
  19. java 笔记本i7 i5_笔记本i7低压cpu性能抵不过i5标压cpu,为什么还叫i7
  20. 使用BadBoy录制JMeter脚本

热门文章

  1. python语言提供的3个基本数字类型是什么_计算机二级python学习教程(3) python语言基本数据类型...
  2. 结合GIS与空间大数据的淄博烧烤空间可视化分析
  3. 社区发现FN算法Python实现
  4. svg眨眼睛动画js特效
  5. 性价比高的蓝牙耳机排行榜10强,2023年蓝牙耳机推荐盘点
  6. Minecraft TrMenu 菜单插件的JS动作高级用法
  7. 花房集团上市:市值超30亿港元 周鸿祎连收两个香港IPO
  8. 12G+500G笔记本电脑最适合吃鸡
  9. Android 常用设计模式(一)
  10. windows服务器部署项目