关于微信JS的调用config的参数怎么得到

丨依然灬晓风 发布于 2015/01/23 09:38
阅读 43K+
收藏 1
我要调用微信的JSSDK中 地理位置的接口  可是我看SDK说每个调用接口的页面都要加入config的配置  配置里面的参数怎么得到  能给出JS的代码更好  谢谢  急用http://mp.weixin.qq.com/wiki/7/aaa137b55fb2e0456bf8dd9148dd613f.html#.E8.8E.B7.E5.8F.96.E5.9C.B0.E7.90.86.E4.BD.8D.E7.BD.AE.E6.8E.A5.E5.8F.A3
加载中
0
主编
主编
用sdk啊
丨依然灬晓风
丨依然灬晓风
下面我写的有代码 帮忙看下有问题没 顺便要问缓存怎么加 token要缓存的
主编
主编
不是有个demo吗
丨依然灬晓风
丨依然灬晓风
sdk里面只给了需要配置的参数啊 比如说哪个签名 怎么得到 不会啊
0
帖子列表
帖子列表
后台实现, 按它要求的规则生成签名等即可
丨依然灬晓风
丨依然灬晓风
下面有我的代码 帮忙看下 有什么问题 缓存也不会加 token要缓存的
丨依然灬晓风
丨依然灬晓风
求代码 ,appid可以先不写。。
0
LMHCNLI
LMHCNLI
//需要在这之前引入微信JS接口的引用文件
//http://res.wx.qq.com/open/js/jweixin-1.0.0.js
wx.config({
    appId: '', // 必填,公众号的唯一标识
    timestamp: , // 必填,生成签名的时间戳
    nonceStr: '', // 必填,生成签名的随机串
    signature: '',// 必填,签名,见附录1
    jsApiList: [ // 必填,需要使用的JS接口列表,所有JS接口列表见附录2
      'openLocation',//这里不知道你用的地理接口是哪个就两个都写上了
      'getLocation'
    ] 
});
//签名的生成方法在附录1
//你需要access_token,这个用来获取jsapi_ticket。
//获取access_token需要用到appId和appsecrect。
//获取到后就是签名(sign).
//签名需要的参数有:jsapi_ticket,noncestr,timestamp及url(当前的url)
//采用字段名的ASCII码升序,使用URL键值对的格式(key=value&key=value)拼接
//如:jsapi_ticket=xxx&noncestr=xxx&timestamp=xxx&url=xxx
//最后对拼接出来的字符串用sha1签名,得到sign。放入config的参数里。



LMHCNLI
LMHCNLI
什么是字段名升序…… 字段名就是key啊,升序就是从小到大嘛abcd->这种序列不就是升序咯。这里需要的只有4个参数,序列在上面我都帮你排好了。 j->n->t->u,你把上面那xxx分别填好再sha1就得到signature了嘛。
丨依然灬晓风
丨依然灬晓风
大哥 有联系方式不 留一下 你说的这个流程我都知道 可是现在卡在字段名ASCII升序上了 是知道流程不会编代码
0
FrankHong
FrankHong
php的有全部的demo代码,其他语言的有部分,按照规则、也可以参照php的代码,写其他语言的不完了
丨依然灬晓风
丨依然灬晓风
下面有我写 帮忙看下有什么问题
0
rakshasa
rakshasa

首先获取accesstoken,

$result = $this->http_get('https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='.$appid.'&secret='.$appsecret);

$json = json_decode($result,true);

$this->access_token = $json['access_token'];

private function http_get($url){
		$oCurl = curl_init();
		if(stripos($url,"https://")!==FALSE){
			curl_setopt($oCurl, CURLOPT_SSL_VERIFYPEER, FALSE);
			curl_setopt($oCurl, CURLOPT_SSL_VERIFYHOST, FALSE);
			curl_setopt($oCurl, CURLOPT_SSLVERSION, 1); //CURL_SSLVERSION_TLSv1
		}
		curl_setopt($oCurl, CURLOPT_URL, $url);
		curl_setopt($oCurl, CURLOPT_RETURNTRANSFER, 1 );
		$sContent = curl_exec($oCurl);
		$aStatus = curl_getinfo($oCurl);
		curl_close($oCurl);
		if(intval($aStatus["http_code"])==200){
			return $sContent;
		}else{
			return false;
		}
	}



获取ticket


$url = "https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi&access_token=$accessToken";
			$res = json_decode ( $this->http_get ( $url ) );
			$ticket = $res->ticket;


生成wx.config需要的参数

private function getSignPackage($jsapiTicket,$url,$timestamp,$nonceStr) {
		// 这里参数的顺序要按照 key 值 ASCII 码升序排序
		$string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr&timestamp=$timestamp&url=$url";
		$signature = sha1 ( $string );

		$signPackage["appId"] = C("APPID");
		$signPackage["nonceStr"] = $nonceStr;
		$signPackage["timestamp"] = $timestamp;
		$signPackage["url"] = $url;
		$signPackage["signature"] = $signature;
		$signPackage["rawString"] = $string;
		return $signPackage;
	}





丨依然灬晓风
丨依然灬晓风
帮忙看下我下面写的 有什么问题 对了 token必须得缓存的 不知道怎么写
丨依然灬晓风
丨依然灬晓风
能不能帮忙写个JAVA js的。。
丨依然灬晓风
丨依然灬晓风
你这是PHP?、?
丨依然灬晓风
丨依然灬晓风
多谢!!我把这些写在一个Java里面了。。你这些直接放在一个外部JS里面就行了么?
0
Aweihuan
Aweihuan

  后台生成传前台 记得wx.config中noncestr,timestamp和后台签名用的一致

丨依然灬晓风
丨依然灬晓风
帮忙看下 下面我写的对不
0
丨依然灬晓风
丨依然灬晓风

引用来自“Aweihuan”的评论

  后台生成传前台 记得wx.config中noncestr,timestamp和后台签名用的一致

public class Test {
HttpServletRequest request;
HttpServletResponse response;
/**
* 取得签名signature
* @param timestamp
* @param nonceStr
* @param url
* @return
*/
public  String GetSignature(long timestamp, String nonceStr, String url){
String signature=null;
String ticket= request.getParameter("ticket");
             String str = "jsapi_ticket="+ticket+"&noncestr="+nonceStr+"&timetamp="+timestamp+"&url="+url;
             // 对string1进行sha1签名,得到signature
try {
MessageDigest reset = MessageDigest.getInstance("SHA-1");
reset.update(str.getBytes("utf-8"));
            byte[] hash=reset.digest();
            Formatter formatter = new Formatter();
            for(byte b:hash){
            formatter.format("%02x", b);
            }
            signature = formatter.toString();
            formatter.close();
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}     
             return signature;


     }
/**
 * 取得随机字符串
 * @return
 */
private static String getNoncestr(){
  return UUID.randomUUID().toString();
}
 
public String config(){
String url = request.getParameter("url");
String config="wx.config({debug: false, appId: 'appid', timestamp:{0} , nonceStr:'{1}', signature:'{2}',jsApiList: ['onMenuShareTimeline'] })";
long timestamp = System.currentTimeMillis()/1000;//时间戳
String noncestr = getNoncestr();//随机字符串
int length=url.indexOf("#");
String uri=url.substring(0,length);//当前网页的URL,不包含#及其后面部分
String signature = GetSignature(timestamp, noncestr, uri);//调取上面的获取signature的方法
 
config = config.replace("{0}", Long.toString(timestamp)).replace("{1}", noncestr).replace("{2}", signature);
return config;

}

下面是JS调用

$.getJSON("https://api.weixin.qq.com/cgi-bin/token",
{grant_type:"",appid:"",secret:""},function(date_token){
$.getJSON("https://api.weixin.qq.com/cgi-bin/ticket/getticket?type=jsapi",date_token.access_token,
function(date_ticket){
$.post(".../..!config.action",{"ticket":date_ticket.ticket,"url":window.location.href},
function(dates){
eval(dates);
});
});
});

function getaround(){
wx.getLocation({
success:function(res){
window.location.href="${base}/phone/supplier!storelist.action";
},
cancel:function (res) {
        alert('用户拒绝授权获取地理位置');
}
});
 帮忙看下这样对么

0
Aweihuan
Aweihuan

代码看起来没有问题

http://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=jsapisign  验证签名链接

config中的debug改为true   若页面弹出签名成功(微信自己弹的) config就配置没有问题,只要获取地址位置的接口权限已经获取(登录公众号查看),就可以获取地址位置。

如弹出失败,参考微信的文档,排查问题

丨依然灬晓风
丨依然灬晓风
可是ticket 和token要缓存的 应该怎么全局缓存
0
Aweihuan
Aweihuan
  做成静态变量或者存库 每次使用进行判断
0
rakshasa
rakshasa
静态的map,在servlet init的时候初始化这个map,用框架的话那就是初始化context上下文的时候给这个map赋值,你也可以使用spring的缓存,@cache或者@Ecache
返回顶部
顶部