我是用java开发的 要如何获得timestamp、nonceStr、jsapi_ticket这些值

Minsy9304 2015-09-08 10:53:59
刚学微信开发昨天困恼一个下午不知道怎么获得这些值

但这些值是使用JS SDK的前提 所以跪求大神们教教我怎么获得
...全文
5650 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
李秀才 2016-10-25
  • 打赏
  • 举报
回复
推荐看下我的博客专栏java微信公众平台开发:http://blog.csdn.net/column/details/13293.html 希望可以帮助到你 。
qq_28076861 2016-03-04
  • 打赏
  • 举报
回复
楼主你这是安卓开发吗。。
Bob_張 2016-03-02
  • 打赏
  • 举报
回复
以下是我上次给人回的帖子内容,那家伙拿了代码就走了,没有结贴,我找了回来拷贝给你: 1、JS部分传参代码 <script type="text/javascript" src="http://res.wx.qq.com/open/js/jweixin-1.0.0.js"></script> <script type="text/javascript"> var shareUrl = ""; //分享的URL地址 var shareTitle = ""; //分享的标题 var shareImage = ""; //分享的图片地址 var shareDesc = ""; //分享的描述信息 $.ajax({ type: "POST", url:'<%=ctx%>share/getSignature.do', data: {url:location.href.split('#')[0]}, dataType: "json", success: function(data){ wx.config({ debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来,若要查看传入的参数,可以在pc端打开,参数信息会通过log打出,仅在pc端时才会打印。 appId: data.appId, // 必填,公众号的唯一标识 timestamp:data.timestamp, // 必填,生成签名的时间戳 nonceStr: data.nonceStr, // 必填,生成签名的随机串 signature: data.signature,// 必填,签名,见附录1 jsApiList: ['onMenuShareTimeline','onMenuShareAppMessage','onMenuShareQQ','onMenuShareWeibo','onMenuShareQZone'] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); //注入成功会执行下面方法 wx.ready(function(){ //分享到朋友圈 wx.onMenuShareTimeline({ title: shareTitle, // 分享标题 link: shareUrl, // 分享链接 imgUrl: shareImage, // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); //分享到朋友圈 wx.onMenuShareAppMessage({ title: shareTitle, // 分享标题 desc: shareDesc, // 分享描述 link: shareUrl, // 分享链接 imgUrl: shareImage, // 分享图标 type: '', // 分享类型,music、video或link,不填默认为link dataUrl: '', // 如果type是music或video,则要提供数据链接,默认为空 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); //分享到QQ wx.onMenuShareQQ({ title: shareTitle, // 分享标题 desc: shareDesc, // 分享描述 link: shareUrl, // 分享链接 imgUrl: shareImage, // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); //分享到腾讯微博 wx.onMenuShareWeibo({ title: shareTitle, // 分享标题 desc: shareDesc, // 分享描述 link: shareUrl, // 分享链接 imgUrl: shareImage, // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); //分享到QQ空间 wx.onMenuShareQZone({ title: shareTitle, // 分享标题 desc: shareDesc, // 分享描述 link: shareUrl, // 分享链接 imgUrl: shareImage, // 分享图标 success: function () { // 用户确认分享后执行的回调函数 }, cancel: function () { // 用户取消分享后执行的回调函数 } }); }); //注入失败会执行下面方法 wx.error(function(res){ }); } }); //跳转 function clickLi(url) { window.location.href = url; } </script> 2、签名ajax访问方法代码 @RequestMapping("/getSignature") public void getSignature(HttpServletResponse response, HttpServletRequest request) { String url = request.getParameter("url"); Map<String, String> signResMap = shareService.getShareSign(url); logger.info("signature:" + signResMap.get("signature")); JSONObject resJson = new JSONObject(); //传入分享签名参数信息 resJson.put("signature", signResMap.get("signature")); resJson.put("nonceStr", signResMap.get("nonceStr")); resJson.put("timestamp", signResMap.get("timestamp")); resJson.put("appId", PropertiesUtil.getWxPropertiest("appId")); try { response.getWriter().print(resJson); response.getWriter().flush(); response.getWriter().close(); } catch (IOException e) { e.printStackTrace(); } } 3、签名生成方法: /** * @Title: getShareSign * @Description: 传入URL地址,生成分享签名 * @param @param url * @param @return 设定文件 * @return Map<String,String> 返回类型 * @throws */ public Map<String, String> getShareSign(String url) { logger.info("分享传入URL:" + url); JSONObject json = ResourceUtil.getResource(PropertiesUtil.getWxPropertiest("tokenUrl"), PropertiesUtil.getWxPropertiest("openTokenFlag"), PropertiesUtil.getWxPropertiest("openTokenSource")); String jsapi_ticket = null; if("1".equals(json.getString("flag"))) { jsapi_ticket = json.getString("jssdkTicket"); //获取jsapikticket的代码就不提供了 } Map<String, String> resMap = SignUtil.sign(jsapi_ticket, url); return resMap; } 4、加密类: package cn.com.aviva.wechat.ajk.util; 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 org.apache.log4j.Logger; /** * @ClassName: SignUtil * @Description: 加密工具类 * @author bob_zhang * @date 2015-8-15 下午12:06:35 */ public class SignUtil { private static Logger logger = Logger.getLogger(SignUtil.class); 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; logger.info(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 RoundUtil.getUUID(); } private static String create_timestamp() { return Long.toString(System.currentTimeMillis() / 1000); } /** * MD5加密 * * @param temp * 需要加密的字符串 * @return */ public static String md5(String str) { StringBuffer buf = new StringBuffer(""); try { MessageDigest md = MessageDigest.getInstance("MD5"); md.update(str.getBytes()); byte[] b = md.digest(); for (int j = 0; j < b.length; j++) { int i = b[j]; if (i < 0) i += 256; if (i < 16) buf.append("0"); buf.append(Integer.toHexString(i)); } } catch (Exception e) { e.printStackTrace(); } return buf.toString(); } }
Bob_張 2016-03-02
  • 打赏
  • 举报
回复
timestamp是一个时间串,可以用System String timestamp = System.currentTimeMillis() + ""; nonceStr是一个随机吕,可以用以下方法获取: public static String getUUID() { String uuid = UUID.randomUUID().toString(); uuid = uuid.substring(0,8)+uuid.substring(9,13)+uuid.substring(14,18)+uuid.substring(19,23)+uuid.substring(24); return uuid; } jsapi_ticket是一个类似于access_token的东西,这个也有接口调用限制,最好进行缓存: 接口:https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi 传参里要传一个ACCESS_TOKEN 官方原话是: 参考以下文档获取access_token(有效期7200秒,开发者必须在自己的服务全局缓存access_token):../15/54ce45d8d30b6bf6758f68d2e95bc627.html 用第一步拿到的access_token 采用http GET方式请求获得jsapi_ticket(有效期7200秒,开发者必须在自己的服务全局缓存jsapi_ticket):https://api.weixin.qq.com/cgi-bin/ticket/getticket?access_token=ACCESS_TOKEN&type=jsapi
Itachi_zjb 2016-03-02
  • 打赏
  • 举报
回复
123
码无边 2015-09-10
  • 打赏
  • 举报
回复
可以参考微信sdk java版本,里面有示例的demo,你在微信后台获取相应的公众号信息即可。
Minsy9304 2015-09-08
  • 打赏
  • 举报
回复

package com.test.util;

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

public class GetInfor {
    public static void main(String[] args) {
        String jsapi_ticket = "jsapi_ticket";
        // 注意 URL 一定要动态获取,不能 hardcode
        String url = "http://minsy.tunnel.mobi/Weixin/wx.do";
        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);
    }

}
我也使用了腾讯给的方法 将参数放进 wx.config 再运行还是出现错误
Minsy9304 2015-09-08
  • 打赏
  • 举报
回复
自顶 求帮助 在线等
Minsy9304 2015-09-08
  • 打赏
  • 举报
回复


package com.test.util;

import java.io.UnsupportedEncodingException;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;

public class CheckUtil {

	private static final String token = "mytest";

	public static boolean checkSignature(String signaure, String timestamp,
			String nonce) {

		String[] arr = new String[] {token, timestamp, nonce };
		// 排序
		Arrays.sort(arr);
		// 生成字符串
		StringBuffer content = new StringBuffer();
		for (int i = 0; i < arr.length; i++) {
			content.append(arr[i]);
		}
		// sha1加密
		String temp = getSha1(content.toString());
		return temp.equals(signaure);
	}
	
	

	public static String getSha1(String str) {
		if (null == str || 0 == str.length()) {
			return null;
		}
		char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
				'A', 'B', 'C', 'D', 'E', 'F' };
		try {
			MessageDigest mdTemp = MessageDigest.getInstance("SHA1");
			mdTemp.update(str.getBytes("UTF-8"));
			byte[] md = mdTemp.digest();
			int j = md.length;
			char[] buf = new char[j * 2];
			int k = 0;
			for (int i = 0; i < j; i++) {
				byte byte0 = md[i];
				buf[k++] = hexDigits[byte0 >>> 4 & 0xf];
				buf[k++] = hexDigits[byte0 & 0xf];
			}
			return new String(buf);
		} catch (Exception e) {
			return null;
		}
	}

}

protected void doGet(HttpServletRequest req, HttpServletResponse res)
			throws ServletException, IOException {
		PrintWriter out = res.getWriter();
		
		String signature = req.getParameter("signature");
		String timestamp = req.getParameter("timestamp");
		String nonce = req.getParameter("nonce");
		String echostr = req.getParameter("echostr");
		String jsapi_ticket = req.getParameter("jsapi_ticket");
		if(CheckUtil.checkSignature(signature, timestamp, nonce)){
			System.out.println("nonce:"+nonce);
			System.out.println("timestamp:"+timestamp);
			System.out.println("signature:"+signature);
			System.out.println("echo:"+echostr);
			out.print(echostr);
		}
我有试着这样获取 但是都验证失败 出现 invalid signature ! 求大神帮助
package com.yn.mh.ding; import com.alibaba.fastjson.JSONObject; import com.dingtalk.oapi.lib.aes.DingTalkJsApiSingnature; import com.dingtalk.open.client.ServiceFactory; import com.dingtalk.open.client.api.model.corp.JsapiTicket; import com.dingtalk.open.client.api.service.corp.CorpConnectionService; import com.dingtalk.open.client.api.service.corp.JsapiService; import com.yn.core.util.PropertiesUtil; import javax.servlet.http.HttpServletRequest; import java.net.URLDecoder; /** * AccessToken和jsticket的获取封装 */ public class AuthHelper { // 调整到1小时50分钟 public static final long cacheTime = 1000 * 60 * 55 * 2; /* * 在此方法中,为了避免频繁获取access_token, * 在距离上一次获取access_token时间在两个小时之内的情况, * 将直接从持久化存储中读取access_token * * 因为access_token和jsapi_ticket的过期时间都是7200秒 * 所以在获取access_token的同时也去获取了jsapi_ticket * 注:jsapi_ticket是在前端页面JSAPI做权限验证配置的时候需要使用的 * 具体信息请查看开发者文档--权限验证配置 */ private static final String GET_ACCESSTOKEN_URL="https://oapi.dingtalk.com/gettoken?corpid="+PropertiesUtil.getProperty("CORP_ID")+"&corpsecret;="+PropertiesUtil.getProperty("CORP_SECRET"); public static String getAccessToken() throws OApiException { //获取access_token的接口地址,有效期为7200秒 //1.获取请求url //2.发起GET请求,获取返回结果 JSONObject jsonObject=HttpHelper.httpGet(GET_ACCESSTOKEN_URL); //3.解析结果,获取accessToken String accessToken=""; if (null != jsonObject) { accessToken=jsonObject.getString("access_token"); //4.错误消息处理 if (0 != jsonObject.getInteger("errcode")) { int errCode = jsonObject.getInteger("errcode"); String errMsg = jsonObject.getString("errmsg"); try { throw new Exception("error code:"+errCode+", error message:"+errMsg); } catch (Exception e) { e.printStackTrace(); } } } return accessToken; } /** * 获取JSTicket, 用于js的签名计算 * 正常的情况下,jsapi_ticket的有效期为7200秒,所以开发者需要在某个地方设计一个定时器,定期去更新jsapi_ticket */ public static String getJsapiTicket(String accessToken) throws OApiException { JSONObject jsTicketValue = (JSONObject) FileUtils.getValue("jsticket", Env.CORP_ID); long curTime = System.currentTimeMillis(); String jsTicket = ""; if (jsTicketValue == null || curTime - jsTicketValue.getLong("begin_time") >= cacheTime) { ServiceFactory serviceFactory; try { serviceFactory = ServiceFactory.getInstance(); JsapiService jsapiService = serviceFactory.getOpenService(JsapiService.class); JsapiTicket JsapiTicket = jsapiService.getJsapiTicket(accessToken, "jsapi"); jsTicket = JsapiTicket.getTicket(); JSONObject jsonTicket = new JSONObject(); JSONObject jsontemp = new JSONObject(); jsontemp.clear(); jsontemp.put("ticket", jsTicket); jsontemp.put("begin_time", curTime); jsonTicket.put(Env.CORP_ID, jsontemp); FileUtils.write2File(jsonTicket, "jsticket"); } catch (Exception e) { e.printStackTrace(); } return jsTicket; } else { return jsTicketValue.getString("ticket"); } } public static String sign(String ticket, String nonceStr, long timeStamp, String url) throws OApiException { try { return DingTalkJsApiSingnature.getJsApiSingnature(url, nonceStr, timeStamp, ticket); } catch (Exception ex) { throw new OApiException(0, ex.getMessage()); } } /** * 计算当前请求的jsapi的签名数据
*

* 如果签名数据是通过ajax异步请求的话,签名计算中的url必须是给用户展示页面的url * * @param request * @return */ public static String getConfig(HttpServletRequest request) { String urlString = request.getRequestURL().toString(); String queryString = request.getQueryString(); String queryStringEncode = null; String url; if (queryString != null) { queryStringEncode = URLDecoder.decode(queryString); url = urlString + "?" + queryStringEncode; } else { url = urlString; } String nonceStr = "abcdefg"; long timeStamp = System.currentTimeMillis() / 1000; String signedUrl = url; String accessToken = null; String ticket = null; String signature = null; String agentid = null; try { accessToken = AuthHelper.getAccessToken(); ticket = AuthHelper.getJsapiTicket(accessToken); signature = AuthHelper.sign(ticket, nonceStr, timeStamp, signedUrl); agentid = ""; } catch (OApiException e) { e.printStackTrace(); } String configValue = "{jsticket:'" + ticket + "',signature:'" + signature + "',nonceStr:'" + nonceStr + "',timeStamp:'" + timeStamp + "',corpId:'" + Env.CORP_ID + "',agentid:'" + agentid + "'}"; System.out.println(configValue); return configValue; } public static String getSsoToken() throws OApiException { String url = "https://oapi.dingtalk.com/sso/gettoken?corpid=" + Env.CORP_ID + "&corpsecret;=" + Env.SSO_Secret; JSONObject response = HttpHelper.httpGet(url); String ssoToken; if (response.containsKey("access_token")) { ssoToken = response.getString("access_token"); } else { throw new OApiException("Sso_token"); } return ssoToken; } }

3,156

社区成员

发帖
与我相关
我的任务
社区描述
微信开发即微信公众平台开发,将企业信息、服务、活动等内容通过微信网页的方式进行表现,通过二次开发可以将公众账号由一个媒体型营销工具转化成提供服务的产品。
社区管理员
  • 微信开发
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧